1、重要注解:
- @@EnableAutoConfiguration:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})//导入参数类型到IOC
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
- @AutoConfigurationPackage:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})//保存扫描路径,提供给Spring-data-jpa查询
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
- springboot自动装配的核心注解@Import:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
如果参数是普通类,将该类实例化交给IOC容器管理;
如果参数是ImportBeanDefinitionRegistrar的实现类,支持手工注册bean;
如果参数是ImportSelector的实现类,注册selectImports返回的数组(类全路径)到IOC容器,批量注册;
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);//获取注解属性
//从META-INF/spring.factories加载类
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
2、实战:
2.1在一个项目中写一个starter,将整个项目打包成jar包,作为一个dependency即依赖引入到另一个项目中:
-
starter项目结构:
-
pxm.xml:
-
基础配置类:
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "his")//his是将来调用方在yml中配置的前缀
public class Properties {
String name;
String password;
public Properties() {
}
public Properties(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Properties{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
- 业务逻辑类:
import org.springframework.beans.factory.annotation.Autowired;
public class Service {
@Autowired
private Properties properties;
//调用方在starter中的方法传递参数
public void test(String name){
System.out.println("Hello"+name);
}
//获取到调用方在yml中配置的属性
public void test1(){
System.out.println(properties.toString());
}
}
- 核心配置(自动装配)类:
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(Properties.class)//参数为配置对象
public class HelloAutoConfigure {
//书写一个配置类对象成员变量
private final Properties properties;
//书写自动配置类有参构造将成员变量传入
public HelloAutoConfigure(Properties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean
public Service service(){
return new Service();
}
}
- 在resource目录下创建的配置文件:
要是需要配置多个类得话,用,\隔开即可:
基础配置类,业务逻辑类,核心配置类,以及配置文件都完成以后,启动一下项目,正常启动就说明配置成功了。
2.2、将整个项目打成jar包:
找到项目右侧的Maven
打包完成后jar包已经放在自己的maven仓库里了,只需要在另一个项目中将该jar包作为依赖引入到另一个项目中即可:
另外一个项目的pom.xml:
引入成功后的结果:
进行基础类的配置:
经行测试:
测试结果: