springboot 自定義Enable* 註解
阿新 • • 發佈:2018-11-11
專案結構:
1.定義一個註解類 EnableScanner
package com.boot.condition.bootcondition.simple; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /** * 〈一句話功能簡述〉<br> * 〈掃描包〉 * * @author 26918 * @create 2018/10/17 * @since 1.0.0 */ @SpringBootApplication @EnableScanner(packages = {"com.boot.condition.bootcondition.simple.entity", "com.boot.condition.bootcondition.simple.bean"}) public class ScannerPackageApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(ScannerPackageApplication.class, args); context.close(); } } import org.springframework.context.annotation.Import; import java.lang.annotation.*; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(ScannerPackageRegistrar.class) public @interface EnableScanner { String[] packages(); }
2.匯入需要掃描的註冊類 ScannerPackageRegistrar, 將掃描的物件設定到spring容器
import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 〈一句話功能簡述〉<br> * 〈〉 * * @author 26918 * @create 2018/10/17 * @since 1.0.0 */ public class ScannerPackageRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { System.out.println("packages value::"+annotationMetadata.getAnnotationAttributes(EnableScanner.class.getName())); String[] arrs = (String[]) annotationMetadata.getAnnotationAttributes(EnableScanner.class.getName()).get("packages"); List<String> packages = Arrays.asList(arrs); System.out.println(packages); BeanDefinitionBuilder bdb = BeanDefinitionBuilder.rootBeanDefinition(MyBeanDefinitionProcessor.class); bdb.addPropertyValue("packages", packages); beanDefinitionRegistry.registerBeanDefinition(MyBeanDefinitionProcessor.class.getName(), bdb.getBeanDefinition()); } }
3.定義一個MyBeanDefinitionProcessor implements BeanPostProcessor 用於初始回撥物件
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; import java.util.List; /** * 〈一句話功能簡述〉<br> * 〈bean 初始回撥〉 * * @author 26918 * @create 2018/10/17 * @since 1.0.0 */ public class MyBeanDefinitionProcessor implements BeanPostProcessor { private List<String> packages; public List<String> getPackages() { return packages; } public void setPackages(List<String> packages) { this.packages = packages; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { for (String pkg : packages) { if(bean.getClass().getName().startsWith(pkg)){ System.out.println("instance bean:"+bean.getClass().getName()); } } return bean; } }