自动配置
@Configuration 告诉Springboot这是一个配置类,如同spring的xml配置文件
Spring原生java
ApplicationContext ioc = new ClassPathXmlApplicationContext("UserPetBeans.xml");
User user = ioc.getBean(User.class);
Pet pet = ioc.getBean(Pet.class);
System.out.println(user+"-------"+pet);
Spring原生xml配置文件
<bean id="user" class="com.lwt.boot.bean.User">
<property name="username" value="李威"></property>
<property name="age" value="21"></property>
</bean>
<bean id="pet" class="com.lwt.boot.bean.Pet">
<property name="petName" value="猫咪"></property>
</bean>
现今SpringBoot
在config包下创建用@Configuration(proxyBeanMethod=true)注解标示的类MyConfig1。
过去用xml配置bean时的id为如今的方法名,如今的返回值是组件在容器中创建的实例。
是否:启用代理,默认单例,形成依赖
如果proxyBeanMethods=true(默认),组件返回的所有bean对象默认单实例,组件中存在依赖关系(用户bean中有宠物bean)
。当手动设置proxyBeanMethods=false时,组件无依赖关系,用Lite模式加速容器启动过程,减少判断
/**
* 配置类里使用@Bean标注在方法上给容器注册组件,默认也是单实例的
* 配置类也是组件
*/
// 从容器中拿到的不是代理对象类型 无法时组件构成依赖关系,此时新创建的陌生用户的宠物不是容器
//中的宠物
@Configuration(proxyBeanMethods = false)
public class MyConfig1 {
/**
* 给容器中添加组件,以方法名作为组件id,返回类型为组件类型名。
* 默认是单实例的com.lwt.boot.config.MyConfig1$$EnhancerBySpringCGLIB$$46fada47@4c9e9fb8,由代理对象调用所有单实例方法
*
* @return 返回的值是组件在容器中创建的实例,因为默认返回单实例组件,引用地址址全部相同
*/
//
// @Bean("method1")
@Bean("user01")
public User user(){
User user = new User("李威", 21);
user.setPet(pet()); // set突破之调用类中方法pet()创建Pet对象
return user;
}
@Bean
public Pet pet(){
return new Pet("猫咪咪");
}
}
@Import导入组件
给容器注册组件迷之@Import({User.class,Pet.class}),给容器中自动创建出这两个组件,默认组件名为组件全类名
@Import({
DBHelper.class})
@Configuration(proxyBeanMethods = true)// 从容器中拿到的不是代理对象类型 无法时组件构成依赖关系,此时新创建的模式用户的宠物不是容器中的宠物
public class MyConfig1 {
底层大量条件装配:有你有我,无你无我
我们希望,当宠物组件方法上未标明@Bean时,用户依赖宠物,此时希望用户组件也为false不被创建。此时在用户的@Bean之上用到@ConditionalOnBean(name=“pet”)来进行条件判断,有猫有用户,无猫无用户
boolean pet1 = run.containsBean("pet");
System.out.println("容器中是否有Pet组件:"+pet1); // 有@Bean才为true,用户依赖宠物,如果无@Bean,用户依赖的宠物无,用@ConditionalOnBean("pet")使用户也无
boolean related = run.containsBean("user01");
System.out.println("容器中是否有User组件:"+related);
原生配置文件引入@ImportResource
- 返璞归真,定义xml配置文件UserPetBeans.xml:
<bean id="importResource1" class="com.lwt.boot.bean.User">
<property name="username" value="李威"></property>
<property name="age" value="21"></property>
</bean>
<bean id="importResource2" class="com.lwt.boot.bean.Pet">
<property name="petName" value="猫咪"></property>
</bean>
- 配置类上声明注解@ImportResource(“classpath:UserPetBeans.xml”)。
- 主程序配置类测试:
System.out.println("容器中importResource1是否存在:"+run.containsBean("importResource1")); // true
System.out.println("容器中importResource2是否存在:"+run.containsBean("importResource2")); // true
配置绑定
application.properties
mycar.brand=比亚迪
mycar.price=100000
方式一:
在实体类上标注@Component和@ConfigurationProperties(prefix=“xxx”)
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
方式二:
在配置类上标注@EnableConfigurationProperties(类.class)和在实体类上标注@ConfigurationProperties。
@EnableConfigurationProperties作用表示开启使实体类上标注的@ConfigurationProperties注解生效。
@EnableConfigurationProperties(Car.class) // 配置绑定方式二,不使用@Component,使实体类上的@ConfigurationProperties注解生效
public class MyConfig1 {
//@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {