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) :
对扫描的包下的类进行处理