@Conditional条件装配
@Conditional的关系树(在满足某种条件或者不满足某种条件创建组件等方法 可以使用在类前面)
我们在main方法里面尝试拿取一下组件
运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
@ImportResource("classpath:beans.xml")可以导入以前xml的配置方式
我在spring.xml里面创建了一个组件如果直接拿那么结果是false因为springboot不知道它是是什么
如果在任何一个类上面加入@ImportResource(“classpath:beans.xml”)那么他会自动解析里面的组件放入springboot
<bean id="hh" class="com.springboot.bean.User">
<property name="name" value="12"></property>
<property name="age" value="11"></property>
</bean>
@ImportResource("classpath:beans.xml")//可以导入以前xml的配置方式
配置绑定
第一种在实例类上加上
prefix是前缀代表着前缀里面的属性和car里面的属性一致
@Component加入ioc容器
Car实例类
package com.springboot.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/*
* 只有在放在容器中才会生效
* */
@Component
@ConfigurationProperties(prefix = "mycard")
public class Car {
private String brand;
private Integer price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
主配置文件
mycard.brand=BM
mycard.price=10000
测试
HelloController
使用自动装配
package com.springboot.controller;
import com.springboot.bean.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*@ResponseBody(告诉springboot直接返回给浏览器)
@Controller*/
@RestController//就是@ResponseBody和@Controller
public class HelloController {
@Autowired
Car car;
@RequestMapping("/card")
public Car car(){
return car;
}
}
测试结果
第二种方法:因为我们可能引入的car为第三方的无法加入@Component导致无法导入配置文件
使用@EnableConfigurationProperties+@ConfigurationProperties(开启car配置绑定功能
把car这个组件自动注册到容器中)@EnableConfigurationProperties在主配置文件类使用
@EnableConfigurationProperties(Car.class)
运行结果
自动配置原理
引导加载自动装配
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
1.@SpringBootConfiguration:
Configuration代表这当前是一个配置类
2.@ComponentScan(指定扫面哪些注解)
3.@EnableAutoConfiguration
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage 自动配置包(指定了默认的包规则)
@Import({Registrar.class})
//利用Registrar给容器种导入一系列组件
//将指定的包下的所有组件导入进来MainApplication所在的报下
@Import({AutoConfigurationImportSelector.class})
1.利用this.getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2. List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取到所有需要导入到容器中的配置类
3.例如工厂加载
List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)得到组件
4.从META-INF/spring.factories位置来加载一个文件
默认扫面我们当前系统里所有MET-INF/spring.factories位置的文件
这些组件在xml中已经写死了
按需开启自动配置项
1.当我们导入相关的jar包才会开启相应的组件
2.springboot会预先加载配置类
3.每个自动配置类按照条件生效
4.生效的配置类就会给容器中装配很对组件
5.只要容器中有这些组件,就相当于这些功能有了
6.只要用户有自己配置的,就以用户的优先
xxxxAutoConfiguration–>组件–>xxxProperties里面拿值—>application.properties
实战
引入场景依赖
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot
查看自动配置了那些
自己分析,引入场景对应的配置一般都会生效
配置文件中的debug=true开启自动配置报告 Negative(不生效)
是否修改配置项
参照文档修改配置项
https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties
自己查看分析xxxproperties绑定了配置文件的那些
自定义加入或替换组件