SpringBoot是Spring的一个子项目,用于简化Spring项目的开发
特性:1.起步依赖
2.自动配置
3.外部的配置文件
4.内置Tomcat服务器。
一.Spring配置文件
一.1配置文件的类型:
Spirngboot支持多种配置文件,如property文件,yaml文件,yml文件,常用的是yml文件类型
yml类性的配置文件格式为;
spring:
datasource:
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dlyk?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
一.2:配置文件的内容获取
1.通过@Value注解
/**
*获取配置文件中user下的age和name属性值
*/
public Class message{
@Value("${user.age}")
private int age;
@Value("${user.name}")
private String name;
public message(){}
}
2.通过@ConfigurationProperties注解
注意:类中的属性名要和配置中的键名相同
@ConfigurationProperties(prefix="user")
@Component
public Class Message{
public int age;
public String name;
public Message(){}
}
二:Bean对象的扫描和注册
1.Bean扫描
SpringBoot项目可以通过@ComponentScan(basePacage="要扫描的包的路径")注解来定义需要扫描的路径,但是有时候我们会发现并没有添加该注解但是一样可以扫描到。这是为什么呢?
原因是我们启动类上添加了@SpringBootApplacation注解,该注解是一个组合注解,其中包含了@ComponentScan注解,所以会自动扫描到与启动类在同一个包下或者启动类所在包的子包下的所有bean对象。若要扫描启动类之外的包则需要自己手动添加@ComponentScan注解去定义扫描路径。
2.Bean注册
1.自定义bean的注册
通过SpringBoot提供的注解例如:@Component,@Service,@Controler等注解将他们添加到要注册的类上就可以完成自定义的Bean的注册。但是若有要对第三方类进行bean注册需求,那么由于jar包中的类是不允许修改的,所以无法添加这些注解去注册bean对象。那么我们由两种方式可以完成这个需求
2.第三方bean的注册
我们可以通过@Bean注解来完成对第三方bean的注册,对@Bean注解需要注意的点是:1.@Bean需要定义在方法上,方法的返回值为该Bean的类型,方法名为该Bean的name,并且方法需要在由@Configuration注解修饰的类中,也就是该方法需要放在SpringBoot的配置类中。
@SpringBootApplacation
public class TestApplication(){
public static void main(String[] args){
SpringApplication.run(TestApplacation.class,args);
}
//通过@Bean方法,注册一个我们第三方的Country类的bean对象
//因为启动类注解整合了@Configuration注解,所以@Bean注解可以添加在启动类,但是为了功能的专一性,
//不推荐这么做,建议自定义一个Configuration类,注意该类要放在启动类的包或者子包下,否则扫描不到
@Bean
public Country country(){
return new Country();
}
}
2.可以通过@Import注解来在启动类上手动导入
例如@Import(Country.class),若是导入多个可以添加一个数组例如:@Import({Country.class,Province.class})
但是不推荐这么做,因为@Import注解主要导入一个Config类或者是一个ImportSelector的实现类,该实现类就是重写接口中的一个selectImports方法,返回一个存放了需要注入的类的全类名的一个String数组
public class TestImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"配置类的全类名"};
}
}
但是在这个实现类中的包的全路径名都是写死的,为了代码的灵活性和可修改性,我们可以把类的路径名写在一个文件当中,每一行一个类的路径名。
然后通过读取配置文件来进行bean的注册
public class TestImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//创建一个集合用于读取文件中的内容
List<String> list = new ArrayList<>();
try( InputStream in = TestImportSelector.class.getClassLoader().getResourceAsStream("配置文件的名称");
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr)
){
//定义一个字符串用于接受读取出的文件内容
String line=null;
while((line=br.readLine())!=null){
list.add(line);
}
}catch (Exception e){
e.printStackTrace();
}
return list.toArray(new String[0]);
}
}
3.Bean的注册条件
我们可以通过方法参数在bean对象的注册时为对象赋值,方法的对象可以通过读取配置文件来获取
@Configuration
public class testConfiguration{
@Bean
public Country country(@Value("${user.name}") String name,@Value("${user.age} int age")){
Country country =new Country();
country.setName(name);
country.setAge(age);
}
}
但是当配置文件中没有该配置项时会报错,我们需要在配置文件没有该配置项时则放弃注入该bean,我们可以通过@ConditionOnPropertiy注解来完成该需求
@Configuration
//当键名为name和age有配置的值时,注册该bean
@ConditionOnProperty(prefix="user",name={"name",age})
public class testConfiguration{
@Bean
public Country country(@Value("${user.name}") String name,@Value("${user.age} int age")){
Country country =new Country();
country.setName(name);
country.setAge(age);
}
}
常用的用于控制bean的注册的注解还有:
@ConditionOnMissBean(xxx.class) //当Spring容器中xxxbean不存在时注册该bean
@ConditionOnClass(xxx.class) //当SpringBoot环境中存在某个类时,注册该bean
三:SpringBoot自动配置的原理(!!!重中之重)
当我们在maven中导入一个起步依赖之后,SpringBoot可以自动配置该依赖jar包中的bean对象,原理是什么呢?
回答该问题还是要从SpringBoot启动类的@SpringBootApplacation注解开始,该注解是一个组合注解,由@SpringConfiguration和@ComponentScan还有@EnableAutoConfiguration注解组成,而实现自动配置的关键就是@EnableAutoConfiguration注解,该注解也是一个组合注解,由@AutoConfigurationPacage和@Import注解组成,@Import注解中导入了一个AutoConfigurationImportSelector.class,该类实现了ImportSelector接口中的selectImports方法,经过层层的调用,最终读取到了META-INF目录下的.import文件当然在2.7版本之前后缀为spring.factories文件,读取到了文件中的自动配置类的全类名之后会根据bean的注册条件也就是@Condition及其衍生注解,把符合条件的bean对象注册到ioc容器当中。