自动装配原理
项目启动的时候,会扫描到
@SpringBootApplication
注解该注解里面存在一个@EnableAutoConfiguration
注解在EnableAutoConfiguration
注解里面又存在一个Import注解执行selectImports
方法,selectImports
返回的是配置类的全路径名,配置类从何而来,是基于SPI机制,去classpath下的META-INF
目录下找所有的spring.factories
文件,然后将所有的spring.factories
文件进行解析。自动将需要的Bean对象注入到IoC容器里面去,根据此我们可以写一个starter。
简单例子模拟
1.在项目中,新建一个springBoot模块
2.定义实体Teacher,模拟个方法getMessage();
public class Teacher {
private String name;
private String sex;
private String subject;
public Teacher(String name, String sex, String subject) {
this.name = name;
this.sex = sex;
this.subject = subject;
}
public String getMessage(){
return "姓名:"+this.name+",性别:"+this.sex+",科目:"+this.subject;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
3.定义Teacher属性,从配置文件获取信息
@ConfigurationProperties(prefix = "teacher")
public class TeacherProperties {
private String name;
private String sex;
private String subject;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
4.定义自动配置类,叫教师实体加载
@ConditionalOnClass(Teacher.class) // 加载到Teacher这个类的话,就自动装配
@EnableConfigurationProperties(TeacherProperties.class) //加载配置类
@Configuration
public class TeacherAutoConfiguration {
/**
* 将教师实体交给spring管理
*/
@Bean
public Teacher teacher(TeacherProperties teacherProperties){
return new Teacher(teacherProperties.getName(),teacherProperties.getSex(),
teacherProperties.getSubject());
}
}
5.定义在resources下 META-INF文件 要符合springBoot约定形式
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.study.config.TeacherAutoConfiguration
6.打包模块
clean--Iinstall
7.使用 在另一个模块的pom文件中引入打包的模块
<dependency>
<groupId>com.study.teacher</groupId>
<artifactId>study_teacher_starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在配置文件中配置 相关信息
测试
输出结果