MyAnnotationBeanFactoryPostProcessor
2016-03-24 14:54
1486 查看
Spring自定义的注解扫描实现Demo
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.core.Constants;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.core.type.filter.TypeFilter;
/**
* BeanDefinitionRegistryPostProcessor||BeanFactoryPostProcessor 接口调用流程
* @author Stony
* 1.从AbstractApplicationContext.refresh()方法进去,
* 2.obtainFreshBeanFactory()->refreshBeanFactory()->loadBeanDefinitons()
* 2.1 AnnotatedBeanDefinitionReader->ClassPathBeanDefinitionScanner
* 2.2 XmlBeanDefinitionReader ->loadBeanDefinitions()
* 3.prepareBeanFactory()准备工作后->postProcessBeanFactory(),调用了invokeBeanFactoryPostProcessors(beanFactory)方法。
* 4.获取全部BeanFactoryPostProcessor 接口类,执行AbstractApplicationContext.invokeBeanFactoryPostProcessors()->遍历全部实体执行postProcessBeanFactory()
* 5.initApplicationEventMulticaster()初始化多路广播,->registerListeners()注册 ApplicationEvent事件
* 6.finishRefresh() 通知ContextRefreshedEvent事件
*/
public class MyAnnotationBeanFactoryPostProcessor implements BeanFactoryPostProcessor, ApplicationContextAware{
ApplicationContext ac;
String annotationPackage;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.ac = applicationContext;
}
public String getAnnotationPackage() {
return annotationPackage;
}
public void setAnnotationPackage(String annotationPackage) {
this.annotationPackage = annotationPackage;
}
Pattern COMMA_SPLIT_PATTERN = Pattern.compile("\\s*[,]+\\s*");
/**
* {@link BeanDefinitionRegistryPostProcessor}
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if (beanFactory instanceof BeanDefinitionRegistry) {
//definition scanner
ClassPathBeanDefinitionScanner scanner = new MyAnnotationScan((BeanDefinitionRegistry) beanFactory, true);
//scan packages
String[] packages = COMMA_SPLIT_PATTERN.split(annotationPackage);
scanner.scan(packages);
}
}
static class MyAnnotationScan extends ClassPathBeanDefinitionScanner{
public MyAnnotationScan(BeanDefinitionRegistry registry,boolean useDefaultFilters) {
super(registry, useDefaultFilters);
init();
}
private void init() {
TypeFilter filter = new AnnotationTypeFilter(MyAnnotation.class);
addIncludeFilter(filter);
addExcludeFilter(new TypeFilter() {
@Override
public boolean match(MetadataReader metadataReader,MetadataReaderFactory metadataReaderFactory) throws IOException {
String className = metadataReader.getClassMetadata().getClassName();
return className.endsWith("package-info");
}
});
}
}
}
//########################################################################
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
public String value() default "";
}
相关文章推荐
- Spring生命周期之BeanFactoryPostPorcessor和BeanPostProcessor
- Spring的BeanFactoryPostProcessor和BeanPostProcessor
- Spring的BeanFactoryPostProcessor和BeanPostProcessor
- 【Spring4揭秘】修改BeanFactory-BeanFactoryPostProcessor
- Spring学习08--IoC容器的高级特性(lazy-init、FactoryBean、BeanPostProcessor、autowiring)
- spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别
- Spring Framework之BeanFactoryPostProcessor和BeanPostProcessor(TODO)
- Spring的后置处理器BeanFactoryPostProcessor
- Spring 源码梳理(四) BeanFactoryPostProcessor
- Spring的BeanFactoryPostProcessor和BeanPostProcessor接口的区别
- BeanFactoryPostProcessor接口
- BeanFactoryPostProcessor和BeanPostProcessor的区别
- Spring中beanFactory后置处理器(BeanFactoryPostProcessor)使用
- Spring Bean的生命周期之我的理解(一)------BeanFactoryPostProcessor和BeanPostProcessor
- Spring源码分析之BeanPostProcessor接口和BeanFactoryPostProcessor接口方法不执行原因分析
- 异常:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
- spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别
- BeanFactoryPostProcessor和BeanPostProcessor的区别
- Spring后置处理器之-BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor
- 浅析Spring IoC源码(六)BeanFactoryPostProcessor