在之前用Spring framework的IOC和AOP时,我们都会去创建一个配置文件,去创建一个IOC容器和端口扫描之类的标签。而SpringBoot不这么做,一般都不会去创建这么一个配置文件(xml),而是去创建一个配置类,也就是全注解配置。
实践演示:
练习bean类:
public class Parent {
private String name;
//........
//省略构造方法,get,set方法,toString
}
public class Children {
private String name;
}
配置类:
如果按照以前的做法就是去写bean.xml(配置文件)。
现在的话,写一个配置类:
@Configuration(proxyBeanMethods = true)
public class MyConfiguration {
//@Bean("parent")
@Bean //以方法名作为组件id
public Parent getParent(){
return new Parent("Tom");
}
@Bean
public Children getChildren(){
return new Children("Sam");
}
}
测试方法:
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
Parent parent = run.getBean("getParent", Parent.class);
System.out.println(parent);
}
关注点:
我们需要注意的是,配置类上方的注解:
@Configuration(proxyBeanMethods = true)
这个如果里面这个属性的意思是:
当我们通过这个配置类对象去调用里边的方法时,获得的对象是新建一个还是从容器里边拿。
例子:
public static void main(String[] args) {
//获得容器对象
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//从容器中取得Parent类对象
Parent parent = run.getBean("getParent", Parent.class);
//获得配置类对象
MyConfiguration bean = run.getBean(MyConfiguration.class);
//调用配置类方法
Parent parent1 = bean.getParent();
System.out.println(parent==parent1);
}
结果是true。
表示所取的对象不是新建的,而是从容器中拿的。
当proxyBeanMethods=false时。
结果则返回false,通过配置类对象调用方法时,不去容器中寻找是否有该组件,直接新建一个。
组件的依赖:
通过上面我们来用一个例子来更快了解下。
比如:有一位家长拥有一名自己的孩子。
public class Parent {
private String name;
private Children children;
//........
//省略构造方法,get,set方法,toString
}
则配置类代码为:
@Configuration(proxyBeanMethods = true)
public class MyConfiguration {
//@Bean("parent")
@Bean //以方法名作为主键id
public Parent getParent(){
Parent tom = new Parent("Tom");
//调用组件注册方法,返回的还是容器的实例
tom.setChildren(getChildren());
return tom;
}
@Bean
public Children getChildren(){
return new Children("Sam");
}
}
上面的情况称为:Parent组件依赖Children组件。
扩张内容
proxyBeanMethods:代理bean的方法
- Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
- Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
最佳实战
- 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
- 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
获取所有配置组件
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}