SpringBoot原理篇:@Configuration默认创建代理对象

 先说结论:
一个配置类中(带@Configuration()的类中)
如果某个方法可以得到一个对象,并且这个对象被加载成了bean(这个方法有@Bean注解)
那么这个方法只要是在类中调用,不管调多少次,都是从容器中拿的那个bean,而不是重新创建的 

1 看代码

@Configuration注解的属性proxyBeanMethods默认 = true  →默认创建代理对象

package com.qing.config;

import com.qing.bean.Cat;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class SpringConfig33 {

    @Bean
    public Cat cat(){
        return new Cat();
    }
}

package com.qing.app;

import com.qing.config.SpringConfig33;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class App33 {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig33.class);
        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println("bean的名字:" + name);
        }
        SpringConfig33 config = ctx.getBean("springConfig33",SpringConfig33.class);
        System.out.println(config.cat());
        System.out.println(config.cat());
        System.out.println(config.cat());


    }
}

结果

 2 修改以上代码

 不使用代理创建

 结果

再看结论:
一个配置类中(带@Configuration()的类中,默认创建代理对象的情况)
如果某个方法可以得到一个对象,并且这个对象被加载成了bean(这个方法有@Bean注解)
那么这个方法只要是在类中调用,不管调多少次,都是从容器中拿的那个bean,而不是重新创建的 

@Configuration() → 默认创建代理对象
@Bean
1 代理 @Configuration(proxyBeanMethods = true) → 默认情况
    创建的对象是一样的 (创建了一次就不会再创建了,而是取出容器中的对象)
2 非代理 @Configuration(proxyBeanMethods = false)
    就是一个普通对象,创建的对象不一样 

猜你喜欢

转载自blog.csdn.net/m0_45877477/article/details/125658757