Spring的@Bean注解和@Component注解有什么区别? [英] what is the difference between @Bean annotation and @Component annotation at Spring?

查看:81
本文介绍了Spring的@Bean注解和@Component注解有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

干杯

解决方案

组件

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

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

Bean 和 Component 一对一映射,即每个类一个 bean.

这些注解(@Component、@Service、@Repository)是类级别的注解.

示例:

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

@Service公共类用户服务{@自动连线私有 UserRepository userRepository;@覆盖公共用户 findByUsername( String username ) 抛出 UsernameNotFoundException {用户 u = userRepository.findByUsername( 用户名);返回你;}公共列表<用户>findAll() 抛出 AccessDeniedException {列出<用户>结果 = userRepository.findAll();返回结果;}}

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

@Bean

@Bean 用于声明单个 bean,而不是像 Component 那样让 Spring 自动完成.

它将 bean 的声明与类定义分离,让您可以完全按照自己的选择创建和配置 bean.

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

例如:

@Configuration@启用网络安全@EnableGlobalMethodSecurity(prePostEnabled = true)公共类 WebSecurityConfig 扩展了 WebSecurityConfigurerAdapter {@豆公共 SpringTemplateEngine springTemplateEngine(){SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.addTemplateResolver(htmlTemplateResolver());返回模板引擎;}@豆公共 SpringResourceTemplateResolver htmlTemplateResolver(){SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver();emailTemplateResolver.setPrefix("classpath:/static/template/");emailTemplateResolver.setSuffix(.html");emailTemplateResolver.setTemplateMode(HTML");emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());返回 emailTemplateResolver;}...

此处阅读有关定型注释的更多信息.

It might be a very simple question for you.But I read lots of documents and I am totally confused.We can use @Component instead of @Bean or @Bean instead of @Component(as well as @Repository @Service @Controller) ?

Cheers

解决方案

Component

@Component also for @Service and @Repository are used to auto-detect and auto-configure beans using classpath scanning.

As long as these classes are in under our base package or Spring is aware of another package to scan, a new bean will be created for each of these classes

Bean and Component are mapped as one to one i.e one bean per Class.

These annotations (@Component, @Service, @Repository) are Class level annotations.

Example:

Lets Say we have a UserService Class which contains all methods for User Operation.

@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 will create a Bean for UserService and we can use this at multiple location/classes.

@Bean

@Bean is used to declare a single bean, rather than letting Spring do it automatically as in case of Component.

It decouples the declaration of the bean from the class definition, and lets you create and configure beans exactly how you choose.

@Bean are used at method level and can be configured as required

eg:

@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;
    }


...

Read more about Stereotype Annotations here.

这篇关于Spring的@Bean注解和@Component注解有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆