先说结论:
一个配置类中(带@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)
就是一个普通对象,创建的对象不一样