springboot Enablexxx功能实现

springboot Enablexxx功能实现

  1. Enable* 实现原理
  2. 举个栗子

Enable* 实现原理

EnableAutoConfiguration 注解类实现类似,都是添加注解,在其上面实现@import注解。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
**Import(EnableAutoConfigurationImportSelector.class)**
public @interface EnableAutoConfiguration {
    ........
}

添加@EnableAutoConfiguration 时候就会自动import EnableAutoConfigurationImportSelector类,其实现了
ImportSelector 接口,返回String[] 类列表,自动注入到spring Bean 工厂中。其注入到Bean
工厂中的类在spring-boot-autoconfiguration 配置包Spring.factories中。

autoconfiguration 自动注解的功能在下一节在继续讲解。

举个栗子

  1. 添加需要注解的类
public class Market {
}
public class Sales {
}
  1. 添加importSelector导入类
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        System.out.println(importingClassMetadata.getAnnotationAttributes(EnableLogInfo.class.getName()).toString().contains("onlySale"));

        //获取自定的@EnableLogInfo 信息 如果包含 onlySale 则只注入Sales class 否则 注入 Sales 和 Market 两个类
        if (importingClassMetadata.getAnnotationAttributes(EnableLogInfo.class.getName()) != null
                && importingClassMetadata.getAnnotationAttributes(EnableLogInfo.class.getName()).toString().contains("onlySale"))
        {
            return new String[]{Sales.class.getName()};
        }

        return new String[]{Market.class.getName(), Sales.class.getName()};
    }
}
  1. 添加Enable*注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MyImportSelector.class)
public @interface EnableLogInfo {
    String[] name();
}
  1. 使用
    场景一个常规的springboot工程,不会的可以google。
@RestController
@SpringBootApplication
@EnableLogInfo(name = "onlySale")
public class SpringbootHelloApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootHelloApplication.class, args);
        System.out.println(context.getBean(MyImportSelector.class));
        System.out.println(context.getBean(Market.class));
        System.out.println(context.getBean(Sales.class));
    }
}
2018-04-07 16:42:31.163  INFO 28160 --- [           main] c.y.s.hello.SpringbootHelloApplication   : Started SpringbootHelloApplication in 3.561 seconds (JVM running for 4.135)
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.yang.springboot.hello.enable.demo.MyImportSelector' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1092)
    at com.yang.springboot.hello.SpringbootHelloApplication.main(SpringbootHelloApplication.java:46)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值