Spring自定义实现ImportBeanDefinitionRegistrar引入外部类

import java.io.IOException;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);
        TypeFilter typeFilter = new TypeFilter() {
            @Override
            public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
              return true;
            }
        };
        scanner.resetFilters(false);
        scanner.addIncludeFilter(typeFilter);
        scanner.scan("com.xxx.xxx.web.jetty.extend");
    }

}
package com.xxx.xxx.web.jetty.extend;

import org.springframework.beans.factory.InitializingBean;

public class MyIncludeBean implements InitializingBean{

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("MyIncludeBean:init");
    }

}

自定义Import

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MyImportBeanDefinitionRegistrar.class)
public @interface MyImport {

}

 

让@MyImport配置生效

@MyImport
@Component
public class NoAnnotionBean implements InitializingBean{

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("NoAnnotionBean..");
    }

    
}

 

虽然MyIncludeBean没有被spring的各种注解(@Component、@Service等注解),但是通过自定义MyImport的动态注入进spring容器中,顺利进入spring中,控制台成功打印"NoAnnotionBean.."...

posted on 2021-06-16 15:16  swave  阅读(262)  评论(0编辑  收藏  举报

导航