详解Spring中@Component和@Configuration的区别
总结
直接上总结:加了@Configuration的类会被CGLIB进行动态代理,不加或者加@Component注解则不会被代理。
正文
首先我们都知道使用Spring的@ComponentScan注解可以扫描到@Configuration和@Component的类,并将其交由Spring容器管理,默认会放入单例池中。
新建了一个BeanConfig类用来测试结果:
@Configuration
public class BeanConfig {
}通过上下文获取IOC容器中的BeanConfig,发现确实是被CGLIB进行了代理。

执行查看上下文中beanFactory的单例池中确实存在。

将BeanConfig类的@Configuration注解改为@Component后再看一下则显示没有被CGLIB代理。


问题
那么Spring为什么设计@Configuration注解修饰的Bean要被动态代理?
先说结果:Spring的目的是让@Configuration注解的类中被@Bean注解的方法生成的对象是单例,那如何使一个方法每次生成返回的对象都是同一个,代理就是其中一种方式。
首先@Configuration注解的作用是用于定义配置类来替换XML配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法会被用于构建BeanDefinition,初始化Spring容器。
也就是说@Configuration的主要目的是搭配@Bean注解替代XML配置文件来向Spring容器注入Bean。
我们在BeanConfig类中增加两个@Bean注解的方法:
@Configuration
public class BeanConfig {
//@Scope("prototype")
@Bean
public Role role(){
return new Role();
}
@Bean
public User user(){
Role r1=role();
Role r2=role();
System.out.println(r1==r2);
return new User();
}
}通过Spring的处理,直接调用 @Configuration 注解中bean 方法,获取的就是同一个对象,这样想要直接使用某个@Bean注解的对象就不需要 @Autowired 注入了。
当然你非要在方法上加上注解@Scope("prototype"),每次调用该方法还是会生成不同的对象。
源码
注解配置读取器:向BeanDefinitionMap中添加了7个元素,其中一个就是ConfigurationClassPostProcessor
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext()
执行所有的BeanFactoryPostProcessor的postProcessorBeanFactory()方法
org.springframework.context.support.AbstractApplicationContext#refresh() 方法中的invokeBeanFactoryPostProcessors(beanFactory) org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanFactory
查找到所有带有 @Configuration 注解的 bean 定义,然后在第二个 for 循环中对类进行增强
org.springframework.context.annotation.ConfigurationClassPostProcessor#enhanceConfigurationClasses
到此这篇关于详解Spring中@Component和@Configuration的区别的文章就介绍到这了,更多相关Spring @Component和@Configuration区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- SpringBoot中@Configuration和@Bean和@Component相同点详解
- Spring解读@Component和@Configuration的区别以及源码分析
- Spring中@Configuration和@Component注解的区别及原理
- Spring中@Configuration注解和@Component注解的区别详解
- Spring注解@Configuration和@Component区别详解
- Spring注解中@Configuration和@Component到底有啥区别
- Spring @Configuration和@Component的区别
- 揭秘Spring核心注解@Configuration与@Component的本质区别
相关文章
SpringBoot 项目添加 MDC 日志链路追踪的执行流程
日志链路追踪就是将一个标志跨线程进行传递,在一般的小项目中也就是在你新起一个线程的时候,或者使用线程池执行任务的时候会用到,比如追踪一个用户请求的完整执行流程,本文给大家介绍SpringBoot MDC 日志链路追踪的代码,感兴趣的朋友一起看看吧2021-06-06
idea创建spring boot工程及配置文件(最新推荐)
本文给大家介绍idea创建spring boot工程及配置文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2023-11-11
SpringCloud之loadbalancer负载均衡组件实战详解
LoadBalancer是Spring Cloud官方提供的负载均衡组件,可用于替代Ribbon,这篇文章主要介绍了SpringCloud之loadbalancer负载均衡组件,需要的朋友可以参考下2023-06-06
Java基于ServletContextListener实现UDP监听
这篇文章主要介绍了Java基于ServletContextListener实现UDP监听,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-12-12


最新评论