Skip to main content
 首页 » 编程设计

spring之Spring中@Bean注解和@Component注解有什么区别

2024年08月05日23zhenyulu

这对你来说可能是一个非常简单的问题。但是我读了很多文档,我完全困惑了。我们可以使用@Component代替@Bean或@Bean代替@Component(以及@Repository @Service @ Controller )?

干杯

请您参考如下方法:

组件

@Component 也适用于 @Service @Repository 用于通过类路径扫描自动检测和自动配置 Bean。

只要这些类位于我们的基础包下或者 Spring 知道要扫描另一个包,就会为每个类创建一个新的 bean

Bean 和组件一对一映射,即每个类一个 bean。

这些注释(@Component、@Service、@Repository)是类级别注释。

示例:

假设我们有一个 UserService 类,其中包含用户操作的所有方法。

@Service 
public class UserService { 
 
    @Autowired 
    private UserRepository userRepository; 
 
    @Override 
    public User findByUsername( String username ) throws UsernameNotFoundException { 
        User u = userRepository.findByUsername( username ); 
        return u; 
    } 
 
    public List<User> findAll() throws AccessDeniedException { 
        List<User> result = userRepository.findAll(); 
        return result; 
    } 
} 

Spring 将为 UserService 创建一个 Bean,我们可以在多个位置/类中使用它。

@Bean

@Bean 用于声明单个 bean,而不是像 Component 那样让 Spring 自动执行。

它将 bean 的声明与类定义分离,并允许您完全按照自己选择的方式创建和配置 bean。

@Bean用于方法级别,可以根据需要进行配置

例如:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
 
     
    @Bean 
    public SpringTemplateEngine springTemplateEngine() 
    { 
        SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
        templateEngine.addTemplateResolver(htmlTemplateResolver()); 
        return templateEngine; 
    } 
 
       @Bean 
    public SpringResourceTemplateResolver htmlTemplateResolver() 
    { 
        SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver(); 
        emailTemplateResolver.setPrefix("classpath:/static/template/"); 
        emailTemplateResolver.setSuffix(".html"); 
        emailTemplateResolver.setTemplateMode("HTML"); 
        emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name()); 
        return emailTemplateResolver; 
    } 
 
 
... 

了解有关刻板印象注释的更多信息 here .