1.背景随着 Spring Boot的盛行,注解配置式开发受到了大家的青睐,从此告别了基于Spring开发的繁琐XML配置。这里先来提纲挈领的了解一下Spring内部对于配置注解的定义,如@Component、@Configuration、@Bean、@Imp…
第一个方法主要完成了内部类,@Component,@ComponentScan,@Bean,@Configuration,@Import等等注解的处理,然后生成对应的BeanDefinition,另一个方法就是对@Configuration使用CGLIB进行增强,那我们先来看Spring是在哪里区分配置的LITE模式和FULL模式?
1、@Component是一个元注解,可以注解其他类注解。@Configuration注解里面也是被@Component注解修饰的。 2、bean设置的类属性不同。 如果是 @Configuration 并且属性 proxyBeanMethods 为 true(默认的),则为 full 如果是 @Component @ComponentScan @Import @ImportSource 则为 lite 3、返回bean实例不同。 @Configuratio...
从图中可以看出,@Configuration这个类是加上了@Component注解的,所以姑且认为@Component有的功能他都有,但是今天的主题是讨论他们不一样的地方。首先通过代码直接测试,然后再分析源码。测试代码如下: === JavaConfig === package org.springframework.francis.config; import org.springframework.context.annotation.Compon...
Spring 注解中 @Configuration 和 @Component 的区别总结为一句话就是: @Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。
@Configuration 表示一个类声明了一个或多个@Bean 方法,并且可以由 Spring 容器处理以在运行时为这些 bean 生成 bean 定义和服务请求 @Component 表示一个注解类是一个“组件”。当使用基于注解的配置和类路径扫描时,这些类被认为是自动检测的候选对象。 @Configuration 使用@Component 进行元注解,因此@Configuration ...
(3) @configuration是通过cglib来代理@bean方法的使用, @component注解并没有。 使用代码比较两者差异: @ConfigurationpublicclassUser{privateLongid;privateStringname;publicLonggetId(){returnnewRandom().nextLong();}publicvoidsetId(Longid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(...
该注解派生自@Component,和@Component注解有相同的功能 相同点: 可以标识该类实例被Spring-ioc容器管理 类中含有@Bean的方法,可以创建bean 不同点: 如果是由@Configuration注解修饰的类,自身会生成一个cglib代理对象,在通过@Bean方式创建单例对象时,经过增强,会尝试从BeanFactory里返回对象,如果是第一次创建@Bean要生...
首先我们都知道使用Spring的@ComponentScan注解可以扫描到@Configuration和@Component的类,并将其交由Spring容器管理,默认会放入单例池中。 新建了一个BeanConfig类用来测试结果: @Configuration publicclassBeanConfig{ } 复制代码 1. 2. 3. 4. 通过上下文获取IOC容器中的BeanConfig,发现确实是被CGLIB进行了代理。
# 情况复现,@Component与@Configuration区别 原因:容器初始化时调用了Config类的getConfigA()创建了对象ConfigA,初始化configB对象时又调用了Config类的getConfigA()创建了对象ConfigA,创建了两次肯定不相等。 # 真相一句话 当你用@Configuration时,Spring会把这个类用动态代理改造一下,会把@Bean修饰的方法改成 ...