1、定义接口
package com.imooc.diveinspringbootzhujie.condition;
import org.springframework.context.annotation.Conditional;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnSystemPropertyCondition.class)
public @interface ConditionalOnSystemProperty {
String name();
String value();
}
2、定义包装接口的功能类,使用Condition接口中定义的属性和方法。
package com.imooc.diveinspringbootzhujie.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Map;
public class OnSystemPropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata){
//Map<String, Object> getAnnotationAttributes(String annotationName);
Map<String, Object> attributes = metadata.getAnnotationAttributes(ConditionalOnSystemProperty.class.getName());
String propertyName = String.valueOf(attributes.get("name"));
String propertyValue = String.valueOf(attributes.get("value"));
System.out.println(propertyName + " " + propertyValue);
String javaPropertyValue = System.getProperty(propertyName);//根据name获取系统value的值(我的是Administrator)
return propertyValue.equals(javaPropertyValue);
}
}
3、定义spring boot 的项目启动入口
package com.imooc.diveinspringbootzhujie.bootstrap;
import com.imooc.diveinspringbootzhujie.condition.ConditionalOnSystemProperty;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
//@ConditionalOnSystemProperty(name = "user.name", value = "")
public class ConditionalOnSystemPropertyBootstrap {
@Bean
@ConditionalOnSystemProperty(name="user.name",value="Administrator")//这是条件装配的入口
public String helloWorld(){
return "hello world 小马哥";
};
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(ConditionalOnSystemPropertyBootstrap.class)
.web(WebApplicationType.NONE)
.run(args);
//这时不需要取Bean
String helloWorld = context.getBean("helloWorld", String.class);
System.out.println(helloWorld);
context.close();//关闭上下文
}
}