spring boot 三:1.组件添加-底层注解@Configuration详解
1 @Configuration
package com.xiaoxu.boot.bean;
public class User {
private String name;
private Integer age;
public User(){
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
tips:
idea:getter\setter快捷键形成
进入类:
alt+insert
再在bean目录下新增一个类:
package com.xiaoxu.boot.config;
import com.xiaoxu.boot.bean.Pet;
import com.xiaoxu.boot.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//告诉SpirngBoot这是一个配置类 == 配置文件
public class MyConfig {
@Bean //给容器中添加组件
//以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
return new User("xiaoxu",27);
}
@Bean
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
然后运行主程序打印组件(可以通过方法名搜索)
可以对组件取别名:
然后重新运行,tomcatPet就被替换为xiaoxu_tomcat:
配置类也是容器中的一个组件:
可以看到,注解Configuration里面有proxyBeanMethods(),默认为true
MyConfig.java:
package com.xiaoxu.boot.config;
import com.xiaoxu.boot.bean.Pet;
import com.xiaoxu.boot.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*
* 1.配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单例的
* 2.配置类本身也是组件
* 3.proxyBeanMethods:代理bean的方法
*
* */
@Configuration(proxyBeanMethods = true)//告诉SpirngBoot这是一个配置类 == 配置文件
public class MyConfig {
/*
* 外部无论对配置类中的这个组件注册方法调用多少次,获取的都是之前注册容器中的单实例
* */
@Bean //给容器中添加组件
//以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
return new User("xiaoxu",27);
}
@Bean("xiaoxu_tomcat")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
如果把代理设置为false:
因为配置类本身也是组件,修改配置类的注解@Configuration(proxyBeanMethods = false),那么该配置类下的组件(@Bean修饰的组件方法),就不会是单例的
tips:idea修改注释的颜色
组件依赖,举例:
在bean下的User加上如下:
重写toString:
如果改为false:
总结:Full模式和Lite模式
1.配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
2.配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
3.Lite模式:@Configuration(proxyBeanMethods = false),非单实例模式;Full模式:@Configuration(proxyBeanMethods = true),单实例模式