spring boot starter--使用自定义@EnableXXX注解实现

spring boot启动的时候会自动扫描启动类上@Enable开头的注解,然后我们可以给@EnableXXX加上注解@Import,导入实现了ImportSelector或ImportBeanDefinitionRegistrar的类

  • 新建spring-boot-stater工程:myTest2-spring-boot-starter

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.2.5.RELEASE</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.test</groupId>
            <artifactId>myService</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

@Enable开头的注解:@EnableMyTest

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public @interface EnableMyTest {
    boolean value() default true;
}

实现了ImportSelector的类:根据@EnableMyTest的value值注入TestService1到spring IOC容器中

public class MyImportSelector implements ImportSelector , BeanFactoryAware {
    private BeanFactory beanFactory;

    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        importingClassMetadata.getAnnotationTypes().forEach(System.out::println);

        System.out.println(beanFactory);

        AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(
                importingClassMetadata.getAnnotationAttributes(EnableMyTest.class.getName())
        );

        //在这里可以拿到所有注解的信息,可以根据不同注解的和注解的属性来返回不同的class,
        Object object = annotationAttributes.get("value");
        boolean isTrue=object==null?false:Boolean.parseBoolean(object.toString());
        if (isTrue){
            return new String[]{TestService1.class.getName()};
        }

        // 从而达到开启不同功能的目的
        return new String[0];
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory=beanFactory;
    }
}

实现了ImportBeanDefinitionRegistrar的类:根据@EnableMyTest的value值注入TestService2到spring IOC容器中

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(
                importingClassMetadata.getAnnotationAttributes(EnableMyTest.class.getName())
        );

        //在这里可以拿到所有注解的信息,可以根据不同注解的和注解的属性来返回不同的class,
        Object object = annotationAttributes.get("value");
        boolean isTrue=object==null?false:Boolean.parseBoolean(object.toString());

        if(isTrue){
            Class beanClass = TestService2.class;
            RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);
            String beanName = StringUtils.uncapitalize(beanClass.getSimpleName());
            //在这里可以拿到所有注解的信息,可以根据不同注解来返回不同的class,从而达到开启不同功能的目的

            //通过这种方式可以自定义beanName
            registry.registerBeanDefinition(beanName, beanDefinition);
        }
    }
}
  • 测试myTest2-spring-boot-starter

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.test</groupId>
            <artifactId>myTest2-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.test</groupId>
            <artifactId>myService</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

启动类测试:EnableMyTest(true)

@SpringBootApplication
@EnableMyTest(true)
public class StartApp3 {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(StartApp3.class, args);
        try {
            Object bean = applicationContext.getBean(TestService1.class);
            System.out.println(bean);

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            Object bean = applicationContext.getBean(TestService2.class);
            System.out.println(bean);

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

com.test.service.TestService1@5d43661b
com.test.service.TestService2@12299890

启动类测试:EnableMyTest(false)

@SpringBootApplication
@EnableMyTest(false)
public class StartApp3 {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(StartApp3.class, args);
        try {
            Object bean = applicationContext.getBean(TestService1.class);
            System.out.println(bean);

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        try {
            Object bean = applicationContext.getBean(TestService2.class);
            System.out.println(bean);

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

No qualifying bean of type 'com.test.service.TestService1' available
No qualifying bean of type 'com.test.service.TestService2' available

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取spring-boot-admin-starter-client自定义的属性,可以按照以下步骤进行操作: 1. 首先,确保你的项目中已经添加了spring-boot-admin-starter-client包,并成功进行了打包。 2. 在项目的配置文件(比如application.properties或application.yml)中,可以使用以下格式设置spring-boot-admin-starter-client的自定义属性: ``` spring.boot.admin.client.custom-property=value ``` 其中,custom-property是你自定义的属性名,value是对应的属性值。 3. 可以通过在spring-boot-admin-starter-server项目的代码中使用@ConfigurationProperties注解来获取spring-boot-admin-starter-client的自定义属性。例如: ```java @ConfigurationProperties(prefix = "spring.boot.admin.client") public class MyConfiguration { private String customProperty; // getter and setter // other configurations } ``` 在这个配置类中,使用prefix属性指定了属性的前缀为"spring.boot.admin.client",这样就能获取到spring-boot-admin-starter-client的自定义属性。 4. 运行spring-boot-admin-starter-server项目时,就可以通过MyConfiguration类获取spring-boot-admin-starter-client的自定义属性了。 综上所述,你可以通过在项目的配置文件中设置属性,并使用@ConfigurationProperties注解获取这些自定义属性来获取spring-boot-admin-starter-client的自定义属性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring-boot-admin-client-2.6.2-API文档-中文版.zip](https://download.csdn.net/download/qq_36462452/85294581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [spring-boot-admin-starter-client与spring-boot版本不匹配的坑](https://blog.csdn.net/mahui_1980/article/details/117528352)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值