Spring Boot深度实践之自动装配( 六 )


3.新建文件EnableTest , 源码如下:
package com.example.demo;?import org.springframework.context.annotation.Import;?import java.lang.annotation.*;?@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(TestImportSelector.class)public @interface EnableTest {}@EnableTest被@Import引入TestImportSelector类 , 此时 , 我们已经完成了自定义@Enable模块注解 。
自定义@Conditional条件注解
1.新建文件ConditionalOnSystemProperty , 源码如下:
package com.example.demo;?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 {/*** 系统属性名* @return*/String name();?/*** 属性值* @return*/String value();}2.新建文件OnSystemPropertyCondition , 源码如下:
package com.example.demo;?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 {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Map attributes = metadata.getAnnotationAttributes(ConditionalOnSystemProperty.class.getName());?String propertyName = String.valueOf(attributes.get(''name''));?String propertyValue = http://news.hoteastday.com/a/String.valueOf(attributes.get(''value''));?String javaPropertyValue = http://news.hoteastday.com/a/System.getProperty(propertyName);?return propertyValue.equals(javaPropertyValue);}}此时我们就完成了自定义@Conditional条件注解 , 该注解会根据传入的name , 获取系统属性 , 并匹配传入的value , 如果相等 , 则返回true , 表明条件满足 , 反之 , 则不满足 。
自定义配置实现类
1.新建文件TestAutoConfiguration , 源码如下:
package com.example.demo.configuration;?import com.example.demo.ConditionalOnSystemProperty;import com.example.demo.EnableTest;import org.springframework.context.annotation.Configuration;?@Configuration //Spring 模式注解@EnableTest //Spring @Enable模块装配@ConditionalOnSystemProperty(name = ''user.name'', valuehttp://news.hoteastday.com/a/= ''Alienware'') //Spring 条件装配,value为你电脑的当前用户名public class TestAutoConfiguration {}此时 , 我们可以看到这个类中已经用到了Spring Framework的三种手动装配 。
2.Resources目录下新建文件META-INF/spring.factories , 源码如下:
# 自动装配org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.configuration.TestAutoConfiguration3.最后 , 我们在项目下新建启动类EnableAutoConfigurationApplication , 源码如下:
package com.example.demo;?import org.springframework.boot.WebApplicationType;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.context.ConfigurableApplicationContext;?@EnableAutoConfigurationpublic class EnableAutoConfigurationApplication {?public static void main(String[] args) {ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableAutoConfigurationApplication.class).web(WebApplicationType.NONE).run(args);//test Bean 是否存在String testStr = context.getBean(''test'',String.class);?System.out.println(''test Bean:'' + testStr);?//关闭上下文context.close();}}到此 , 我们的自定义SpringBoot自动装配已经完成 , 启动EnableAutoConfigurationApplication , 会发现控制台打印如下:


推荐阅读