用Spring原生方法向容器中添加组件
如向容器中添加People类和Pet类:
创建beans.xml文件
Springboot向容器中添加组件
创建MyConfig类
@Configuration//告诉Springboot这是一个配置类
public class MyConfig {
@Bean//给容器中添加组件。
//以方法名作为组件的id。也可以自定义,如@Bean("tom")
//返回类型就是组件类型。返回的值,就是组件在容器中的实例
public Person Person01(){
return new Person("张三","男");
}
@Bean//外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
public Pet Pet01(){
return new Pet("tom");
}
}
@Configuration测试代码如下:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
测试结果:
注:
1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
测试代码:
Pet tom01 = run.getBean("Pet01", Pet.class);
Pet tom02 = run.getBean("Pet01", Pet.class);
System.out.println("组件:"+(tom01 == tom02));
测试结果:
2、配置类本身也是组件
测试代码:
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
测试结果:
3、@Configuration(proxyBeanMethods = true)
proxyBeanMethods:代理bean的方法
@Configuration(proxyBeanMethods = true):保证每个@Bean方法被调用多少次返回的组件都是单实例的
@Configuration(proxyBeanMethods = false):每个@Bean方法被调用多少次返回的组件都是新创建的
实例:当People组件依赖了Pet组件时,proxyBeanMethods 的值要设为true才能保证用户的宠物跟Pet组件初始创建的为一个。
public class MyConfig {
@Bean//向容器中添加组件,
public Person Person01(){
Person person= new Person("张三","男");
//user组件依赖了Pet组件
person.setPet(Pet01());
return person;
}
@Bean
public Pet Pet01(){
return new Pet("tom");
}
}
测试当@Configuration(proxyBeanMethods = true)时:
Person person01 = run.getBean("Person01", Person.class);
Pet pet01 = run.getBean("Pet01", Pet.class);
System.out.println("用户的宠物:"+(person01.getPet() == pet01));
结果为true。
测试当@Configuration(proxyBeanMethods = false)时:
结果为false。