spring的bean扫描

1.实现BeanDefinitionRegistryPostProcessor接口进行初始化

/**
 * bean扫描初始化
 */
public class BaseConfigurer implements BeanDefinitionRegistryPostProcessor {


    private String pojoPackage;
    private VSessionFactory sessionFactory;


    public void setPojoPackage(String basePackage) {
        this.pojoPackage = basePackage;
    }
    public void setSessionFactory(VSessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // TODO Auto-generated method stub

    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

        PojoScanner pojoScanner = new PojoScanner(registry);
        pojoScanner.setSessionFactory(sessionFactory);
        pojoScanner.registerFilters();
        pojoScanner.scan(pojoPackage);
    }

}

BeanDefinitionRegistryPostProcessor接口的结构如图:

这里写图片描述

BeanFactoryPostProcessor接口是Spring提供的接口可使程序可以嵌入Spring的加载过程。Spring会在BeanFactory的相关处理完成后调用postProcessBeanFactory方法,进行定制的功能。
而BeanDefinitionRegistryPostProcessor接口继承于BeanFactoryPostProcessor接口。

BeanDefinitionRegistryPostProcessor接口方法:

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException方法:
在此接口下调用进行bean的注册

2.继承ClassPathBeanDefinitionScanner类,对扫描的结果进行自定义处理。

/**
 * 扫描bean并进行处理
 */
public class PojoScanner extends ClassPathBeanDefinitionScanner{

    private VSessionFactory sessionFactory;

    public PojoScanner(BeanDefinitionRegistry registry) {
        super(registry, false);
    }



    public void registerFilters() {
        this.addIncludeFilter(new TypeFilter() {
            @Override
            public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
                    throws IOException {
                String anno = Table.class.getCanonicalName();
                return metadataReader.getAnnotationMetadata().hasAnnotation(anno);
            }
        });
    }

    @Override
    public int scan(String... basePackages) {
        Environment environment = sessionFactory.getEnvironment();
        int count = 0;
        for (String basePackage : basePackages) {
            Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
            for (BeanDefinition candidate : candidates) {
                Class<?> clazz;
                try {
                    clazz = Class.forName(candidate.getBeanClassName());
                } catch (ClassNotFoundException e) {
                    throw new IllegalArgumentException("Class not found");
                }
                String key = clazz.getAnnotation(Table.class).value();

                MappedBeanResult mppedResult = new MappedBeanResult(clazz);
                for (Field field : clazz.getDeclaredFields()) {
                    Column column = field.getAnnotation(Column.class);
                    String name = column==null ? field.getName() : column.value();
                    mppedResult.put(name, field);
                }
                environment.putResult(key, mppedResult);
                count++;
            }
        }
        return count;
    }


    public VSessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(VSessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}

ClassPathBeanDefinitionScanner类下的几个方法:

protected void registerDefaultFilters()方法:

过滤掉包下不需要的类

public int scan(String… basePackages) :
对扫描的包下的类进行处理

猜你喜欢

转载自blog.csdn.net/sinat_34814635/article/details/79148410
今日推荐