目录
bean的加载控制
bean的编程式加载控制
在程序中使用控制即可
public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata annotationMetadata) {//AnnotationMetadata 注解的源数据
// 做判定条件,是否有这个注解
boolean flag = annotationMetadata.hasAnnotation("org.springframework.context.annotation.Configuration");
if (flag){
return new String[]{"com.service.Dog"};
}
return new String[]{"com.service.Cat"};
}
}
bean的注解式加载控制
使用@ConditionalOnXXX注解为bean的加载设置条件
package com.beanLoad.config;
import com.beanLoad.service.Cat;
import com.beanLoad.service.Dog;
import com.beanLoad.service.Mouse;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
//@ComponentScan("com.beanLoad")
@Import({Mouse.class, Dog.class})
public class springConfig {
@Bean
@ConditionalOnBean(name="com.beanLoad.service.Mouse")//当有这个bean时加载
@ConditionalOnMissingBean(name = "com.beanLoad.service.Dog")//当没有这个bean时就加载
@ConditionalOnNotWebApplication//不是一个web项目时就加载
//这些注解的条件同时满足才会加载
public Cat tom(){
return new Cat();
}
}
主类下
package com.beanLoad.app;
import com.beanLoad.config.springConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class BeanLoadApp {
public static void main(String[] args) {
ApplicationContext app=new AnnotationConfigApplicationContext(springConfig.class);
String[] names = app.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
运行结果
自动配置原理
1、收集Spring开发者的编程习惯,整理开发过程使用的常用的技术列表->(技术集A)
2、收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的蝉蛹设置列表->(设置集B)
3、初始化SpringBoot基础环境,加载用户自定义的ena和到UR的其他坐标,形成初始化环境
4、将技术集A包含的所有技术都定义出来,在Spring/SpringBoot启动时默认全部加载
5、将技术集A中具有使用条件的技术约定出来,设置称按条件加载,有开发者决定是否使用该技术(与初始环境比对)
6、将设置集B作为默认加载(约定大于配置),减少开发者配置工作量
7、开放设置集B的配置覆盖接口,有开发者根据自身需要决定时候覆盖默认配置
自定义自动配置
自定义自动配置的核心是,先在resource资源下新建一个META-INF,在下面的spring.factories
#要自动配置的类写在这
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.beanLoad.service.Cat
被自动配置的类有有特殊的标志
在一个配置类中
//当有这个类时,加载下面这个类
@ConditionalOnClass(name="com.beanLoad.service.Cat")
public class AutoSpringConfig {
}
测试的主类下
public class App1 {
public static void main(String[] args) {
ApplicationContext app=new AnnotationConfigApplicationContext(AutoSpringConfig.class);
String[] names = app.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
运行结果
这说明自动配置成功