代码之家  ›  专栏  ›  技术社区  ›  Tonyukuk

Spring上的@Bean注释和@Component注释有什么区别?

  •  1
  • Tonyukuk  · 技术社区  · 6 年前

    这对你来说可能是个很简单的问题。但是我读了很多文档,我完全搞不懂。我们可以用@Component代替@Bean,或者用@Bean代替@Component(还有@Repository@Service@Controller)?

    干杯

    2 回复  |  直到 6 年前
        1
  •  7
  •   MyTwoCents    6 年前

    组成部分

    @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,而不是像组件那样让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;
        }
    
    
    ...
    
        2
  •  1
  •   chubock    6 年前

    @Bean 用于将方法定义为生产者,它告诉 Spring 使用该方法检索方法返回类型的对象,并在需要时将该对象作为依赖项注入。

    @Component 用于将类定义为 春天 组件,它告诉 春天 从对象的生命周期和依赖关系中创建一个对象(如果它是单例的话),并在需要时注入该对象。

    @Service @Repository 基本上就像@Component和AFAIK,它们只是为了更好地对组件进行分组。

    @服务 用于定义具有业务逻辑的服务类,以及 @存储库 用于定义与底层系统(如数据库)交互的存储库类。