您好,登錄后才能下訂單哦!
這篇文章給大家介紹Springboot中怎么加載自定義注解bean,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
使用場景:
添加中間件,配置某個注解的自定義掃描路徑,例如:dubbo的@Service@Refrence,Seata的@Refrence。
使用自定義注解,配置自定義注解的掃描路徑。
配置代碼:
/** * @author yuan * 加載指定包路徑下的自定義注解實例 */ public class StateImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { // 不使用默認的TypeFilter ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); // 添加掃描規律規則,這里指定了內置的注解過濾規則 provider.addIncludeFilter(new AnnotationTypeFilter(StateService.class)); // 獲取掃描結果的全限定類名 List<String> className = new ArrayList<>(); // 掃描指定包,如果有多個包,這個過程可以執行多次 String[] packages = getPackageToScan(annotationMetadata); for (String aPackage : packages) { Set<BeanDefinition> beanDefinitionSet = provider.findCandidateComponents(aPackage); beanDefinitionSet.forEach(beanDefinition -> className.add(beanDefinition.getBeanClassName())); } String[] classNameArray = new String[className.size()]; return className.toArray(classNameArray); } private String[] getPackageToScan(AnnotationMetadata metadata) { //通過自定義注解獲取自定義包路徑 AnnotationAttributes attributes = AnnotationAttributes.fromMap( metadata.getAnnotationAttributes(EnabledStateMachine.class.getName())); String[] basePackages = attributes.getStringArray("basePackages"); if (basePackages.length != 0) { return basePackages; } return new String[]{ClassUtils.getPackageName(metadata.getClassName())}; } }
將StateImportSelector加入的注解中,以便自動注入
/** * @author yuan */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import({StateImportSelector.class}) public @interface EnabledStateMachine { String[] basePackages() default {}; }
關于Springboot中怎么加載自定義注解bean就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。