博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bean in Configuration Or Component
阅读量:5239 次
发布时间:2019-06-14

本文共 1743 字,大约阅读时间需要 5 分钟。

Configuration

@Configuration (包括@Repository<持久层>,@Service<业务层>,@Controller<控制层>)注解本质上还是 @Component

@Configuration可理解为用spring的时候xml里面的<beans>标签

@Bean可理解为用spring的时候xml里面的<bean>标签

Spring Boot不是spring的加强版,所以@Configuration和@Bean同样可以用在普通的spring项目中,而不是Spring Boot特有的,只是在spring用的时候,注意加上扫包配置

加载过程:

Spring 容器在启动时,会加载默认的一些 PostPRocessor,其中就有 ConfigurationClassPostProcessor,这个后置处理程序专门处理带有 @Configuration 注解的类,这个程序会在 bean 定义加载完成后,在 bean 初始化前进行处理。主要处理的过程就是使用 cglib 动态代理增强类,而且是对其中带有 @Bean 注解的方法进行拦截并进行处理,如果BeanFactory中有这个对象的话就直接获取,否者new一个新的再返回。简单说就是@Configuration中所有带@Bean注解的方法都会被动态代理,调用该方法返回的都是同一个实例。

@Configurationpublic class MyBeanConfig {    @Bean    public Country country(){        return new Country();    }    @Bean    public UserInfo userInfo(){        return new UserInfo(country());    }}

  

相信大多数人第一次看到上面 userInfo() 中调用 country() 时,会认为这里的 Country 和上面 @Bean 方法返回的 Country 可能不是同一个对象,因此可能会通过下面的方式来替代这种方式:

@Autowired

private Country country;

实际上不需要这么做(后面会给出需要这样做的场景),直接调用 country() 方法返回的是同一个实例。

Component

@Component 注解并没有通过 cglib 来代理@Bean 方法的调用,所有没有上面那个拦截并判断的过程,因此像下面这样配置时,就是两个不同的 country。

@Componentpublic class MyBeanConfig {    @Bean    public Country country(){        return new Country();    }    @Bean    public UserInfo userInfo(){        return new UserInfo(country());    }}

总结:

@Component(@Controller和@Service@Repository)用于自动检测和使用类路径扫描自动配置bean。

@Bean用于显式声明单个bean,而不是让Spring像上面那样自动执行它。它将bean的声明与类定义分离,并允许您精确地创建和配置bean。

如果你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component注解的,因此就不能使用自动化装配的方案了,但是我们可以使用@Bean。

参考:

https://blog.csdn.net/isea533/article/details/78072133

https://blog.csdn.net/u012260707/article/details/52021265

https://blog.csdn.net/long476964/article/details/80626930

 

转载于:https://www.cnblogs.com/smallJunJun/p/10127835.html

你可能感兴趣的文章
HDFS概述(1)————HDFS架构
查看>>
Java基础之冒泡排序
查看>>
20155305 2016-2017-2 《Java程序设计》 实验五 Java网络编程及安全实验报告
查看>>
C#中存储数据的集合:数组、集合、泛型、字典
查看>>
Unity3D研究院之Android同步方法读取streamingAssets
查看>>
Unity3D入门
查看>>
ClassLoader
查看>>
转:alter table move 与shrink space的区别
查看>>
初识编码
查看>>
Rails、Nginx、Passenger、bundle之间的协作关系
查看>>
bzoj 4583 购物
查看>>
关于Oracle字符集在dmp文件导入导出中的乱码影响
查看>>
一天一个设计模式——Strategy策略模式
查看>>
js打印(包含局部打印)
查看>>
CUDA 笔记
查看>>
对象与类
查看>>
Python中IO概述【转】
查看>>
(六)MySQL数据操作DML
查看>>
批量删除SVN文件
查看>>
《小团团团队》第九次团队作业:Beta冲刺与验收准备
查看>>