天天看點

springboot 自定義注解實作bean自動裝配

以下内容是我根據,記錄日志是否進行選擇啟用,而設計的。

第一步:建立注解

/**
 * @author wwz
 */
@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Import(AopLogRegister.class)
public @interface AutoImport {
    /**
     * 是否啟用,預設true
     * @return
     */
    boolean isEnabled() default true;

    /**
     * 自動裝配的類
     * @return
     */
    Class<?>[] value() ;
}      

第二步:AopLogRegister類實作ImportBeanDefinitionRegistrar實作bean的注冊

/**
 * @author wwz
 */
@Data
@Slf4j
public class AopLogRegister implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        if(importingClassMetadata.hasAnnotation(AutoImport.class.getName())){
            MergedAnnotations mergedAnnotations = importingClassMetadata.getAnnotations();
            MergedAnnotation mergedAnnotation = mergedAnnotations.get(AutoImport.class);
            if(mergedAnnotation == null){
                return;
            }
            //注解上是否啟用
            if( mergedAnnotation.getBoolean("isEnabled")){
                if(log.isInfoEnabled()){
                    log.info(">>>>start auto import bean definition<<<<");
                }
                //擷取AutoImport上value配置的class數組
                Class<?>[] values = mergedAnnotation.getClassArray("value");
                for(Class value:values){
                    RootBeanDefinition beanDefinition = new RootBeanDefinition(value);
                    registry.registerBeanDefinition(value.getSimpleName(),beanDefinition);
                }
                if(log.isInfoEnabled()){
                    log.info(">>>>end auto import bean definition<<<<");
                }
            }

        }

    }

}

      

第三步:在啟動類加上如上注解

@AutoImport(value= {XXXX.class})

springboot 自定義注解實作bean自動裝配

 切記XXXX.class 不要配置可裝配的注解。形如:@Component,@Configure,@Controller等。不然以上代碼自動裝配的意義就沒有了。

然後你可以在注解上進行,配置任何屬性。達到自己的目的。

其實這個用注解自動裝配bean。最主要的就是

AopLogRegister類實作ImportBeanDefinitionRegistrar

繼續閱讀