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.."...