首页 > 其他分享 >【一句话】@Configuration和@Component的区别

【一句话】@Configuration和@Component的区别

时间:2023-02-09 20:55:57浏览次数:51  
标签:同一个 区别 Autowired Component Bean Configuration public

首先一句话:

@Configuration修饰的类会被Cglib动态代理,@Component不会。

详细:

Cglib动态代理生成当前对象的子类Class,并对方法拦截,多次调用@Bean方法时直接从BeanFactory之中获取,得到同一个对象。

即使用@Configuration时

  @Autowired自动注入的对象和直接调用@Bean修饰的方法及多次调用@Bean修饰的方法拿到的是同一个对象。

当然,多个@Autowired自动注入的对象不管使用哪个注解拿到的都是同一个对象哈,因为默认是单例的嘛

看个例子就好理解了:

@Configuration
// @Component
public class Test {

    @Bean
    public A a(){
        A a = new A();
        a.setB1(b());
a.setB2(b()); return a; } @Bean public B b(){ B b = new B (); return b; } }
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class OnlyTest {
    @Autowired
    private A a;

    @Autowired
    private B b3;

    @Autowired
    private B b4;

    @Test
    public void testCompare() {
        System.out.println(a.getB1 == b3? "同一个b" : "不同的b");
        System.out.println(b3 == b4? "同一个b" : "不同的b");
        System.out.println(a.getB1() == a.getB2() ? "同一个b" : "不同的b");
    }
}

运行结果:

使用@Configuration时:

同一个b

同一个b

同一个b

使用@Component时:

不同的b

同一个b

不同的b

解释一 下:

第一个判断,判断的是@AutoWired自动注入和直接调用@Bean方法获得的对象是不是同一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个

第二个判断,判断的是两个被@AutoWired自动注入的变量是不是同一个,结论:不管使用的是@Component还是@Configuration,都是同一个,因为默认是单例的,其实这种情况跟本次讨论的@Component和@Configuration的对比没关系,放这里是怕理解出现混淆

第三个判断,判断的是多次调用@Bean方法,返回的对象是不是一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个

标签:同一个,区别,Autowired,Component,Bean,Configuration,public
From: https://www.cnblogs.com/maerpao/p/17107004.html

相关文章

  • 箭头函数和普通函数的区别
    1.箭头函数不会创建自己的this(重要!!深入理解!!)箭头函数没有自己的this,它会捕获自己在定义时(注意,是定义时,不是调用时)所处的外层执行环境的this,并继承这个this值。所以,箭头函数......
  • 详述 application/json 和 application/x-www-form-urlencoded 区别
    HTTP协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范。规范把HTTP请求分为三个部分:状态行、请求头、消息主体。协议规定,POST提交的数据必须放在消息主体(ent......
  • typeof和instanceof的区别
    1.typeof用于判断数据类型,返回值有number、string、boolean、function、undefined、object六个。在这里我们可以看到typeof判断null、array、object以及函数的实例(new+......
  • Spring Cloud Alibaba与Spring Cloud Netflix区别
      SpringCloudAlibaba与SpringCloudNetflix区别SpringCloudAlibaba的由来:从2014年开始,得益于以Docker为代表的容器化技术的成熟以及DevO......
  • for in 和 for of 的区别(枚举解释)
    一、for....of1.for…of是作为ES6新增的遍历方式,允许遍历一个含有iterator接口的数据结构(数组、对象等)并且返回各项的值,普通的对象用for…of遍历是会报错的。2.f......
  • python3中,//、/ 的区别
    //:地板除,返回整数结果/:浮点数除法,返回浮点结果例:print(3//2)  #输出1print(3/2)  #输出1.5拓展:判断水仙花数# 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位......
  • try catch和if else语句的区别
    区别:if可以进行简单的过滤,但是,由于机器或者说环境各异,可能会产生一些无法预知的异常,这是在开发阶段无法预知的,所以就要用try...catch来捕捉,而if是无法做到的。从程序结构上......
  • 动态监听和静态监听的区别
    动态监听和静态监听主要区别是实例向监听注册的方式。注册,就是让监听能够找到数据库实例。一、动态监听1.动态注册不需要显示的配置listener.ora文件,实例启动的时候,PMON......
  • 封闭解(Closed-form solution)、解析解(Analytical solution)、数值解(Numerical solu
    解析解(Analyticalsolution)就是根据严格的公式推导,给出任意的自变量就可以求出其因变量,也就是问题的解,然后可以利用这些公式计算相应的问题。所谓的解析解是一种包含分......
  • ES6块级作用域let声明和const声明以及与var之间的区别
    一、ES6块级作用域let声明块级声明用于声明在指定作用域之外无法访问的变量,存在于:①函数内部②块内(字符{和}之间的区域)禁止重声明(1)如果在作用域由已经存在某个标......