首页 > 解决方案 > Spring的@Bean注解和@Component注解有什么区别?

问题描述

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

干杯

标签: springspring-bootspring-annotations

解决方案


零件

@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,而不是像 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;
    }


...

在此处阅读有关 Stereotype Annotations的更多信息。


推荐阅读