1、建一个config类
public class HelloWorldConfig {
@Bean
Lfh lfh () {
System.out.println("-------------->初始化");
return new Lfh();
}
}
public class Lfh {
public String hi() {
return "hello world";
}
}
2、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({HelloWorldConfig.class}) //HelloWorldConfig 自定义的配置类
public @interface HelloWorld {
}
3、装配
@HelloWorld //自定义注解 启动时装配
@SpringBootApplication
public class SpringbootLearnApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootLearnApplication.class, args);
}
}
4、这样在项目中可以直接使用了
@Autowired
Lfh lfh;
@GetMapping("/hi")
public String hi() {
return lfh.hi();
}
5、启动项目
输出
PS:可参考@EnableWebMvc注解。
1、再建一个类
public class HelloWorldConfig2 {
@Bean
Lfh lfh () {
System.out.println("-------------->初始化");
return new Lfh();
}
}
2、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({HelloWorldConfigSelecltor.class}) //HelloWorldConfigSelecltor 自定义的配置类
public @interface HelloWorldSelector {
boolean isLinux() default false;
}
3、选择性装配 ,新建config类,引入ImportSelector接口
//选择性装配
public class HelloWorldConfigSelecltor implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
Map<String, Object> attributesMap = annotationMetadata.getAnnotationAttributes(HelloWorldSelector.class.getName());
//获取接口中islinux值,根据不同的值装配不同的配置
boolean islinux = (boolean) attributesMap.get("isLinux");
if(islinux) {
return new String[]{HelloWorldConfig.class.getName()};
} else {
return new String[]{HelloWorldConfig2.class.getName()};
}
}
}
4、装配
//@HelloWorld //自定义注解 启动时装配
//isLinux = false ,装配HelloWorldConfig2
@HelloWorldSelector(isLinux = false)
@SpringBootApplication
public class SpringbootLearnApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootLearnApplication.class, args);
}
}
5、启动项目
PS : 参考@EnableCaching注解
实现Condition接口,并实现matches()方法,如果matches方法返回true,那么带有@Conditional注解的bean就会装载,false就不会装载
1、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnSystemCondition.class}) //这里不再是Import接口,而是Conditional
public @interface ConditionalSystem {
String system();
}
2、新建配置类
public class OnSystemCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Map<String, Object> attributesMap = annotatedTypeMetadata.getAnnotationAttributes(ConditionalSystem.class.getName());
System.out.println("------------------?system-->" + attributesMap.get("system"));
//条件配置,返回true是才装配
return "linux".equals(attributesMap.get("system").toString());
}
}
3、在HelloWorldConfig类和HelloWorldConfig2类上使用注解
@ConditionalSystem(system = "windows") //条件装配
public class HelloWorldConfig {
@ConditionalSystem(system = "linux") //条件装配
public class HelloWorldConfig2 {
4、运行逻辑
首先根据@HelloWorldSelector(isLinux = false) 选择加载 HelloWorldConfig2,
再根据HelloWorldConfig上的@ConditionalSystem(system = “linux”) 的system = "linux"的条件进行判断,true加载,false不加载。
PS:参考@ConditionalOnBean注解。