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

时间:2018-08-01 10:23:53

标签: spring spring-boot spring-annotations

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

欢呼声

2 个答案:

答案 0 :(得分:4)

组件

@Component也用于@Service@Repository,使用类路径扫描来自动检测和自动配置bean。

只要这些类在我们的基本程序包中,或者Spring知道要扫描的另一个程序包,就会为每个这些类创建一个新的Bean

Bean和Component一对一映射,即每个类一个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;
    }


...

答案 1 :(得分:0)

ini_set('display_errors', 1); 用于将方法定义为生产方,它告诉@Bean使用该方法检索方法返回类型的对象,并在需要时将其作为依赖项注入。 / p>

Spring用于将类定义为@Component组件,它告诉Spring从中创建对象(如果是Singleton)并处理其生命周期和依赖关系并注入该对象在任何需要的时间。

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

@Repository用于定义具有业务逻辑的服务类,而@Service用于定义与诸如数据库之类的基础系统交互的存储库类。