Dao类
@Repository
@Tag("user_tag")
public interface UserDao {
void save(User u)
}
需要是:将dao放入到一个本地Map中,key是Tag注解的内容,值是UserDao的Bean对象,在上层调用的时候直接Map.get("user_tage").save(u)即可
实现1:
实现接口BeanPostProcessor
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
try {
//Spring-Mybatis通过MapperScanner会将Dao的接口注入到MapperFactory中,并且将这个MapperFactory已Bean的形式注入到spring中。
// 即有几个dao就会有几个MapperFactory
//在我们实际调用的时候实质上是通过MapperFactory.getObject()获取对应Dao接口的代理类MapperProxy
//我们所写的啊dao中的方法都是通过MapperProxy中的invoke执行的。
if (!(bean instanceof MapperFactoryBean)) {
return bean;
}
MapperFactoryBean mapperFactoryBean = (MapperFactoryBean) bean;
//mapperFactory中代理的接口类型。通过获取这个接口类型的getAnnotation方法获取对应注解
Tag annotation =(Tag)mapperFactoryBean.getObjectType().getAnnotation(Tag.class);
if (annotation != null) {
tagMap.put(annotation.getValue(),mapperFactoryBean.getObject());
}
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
实现2:
实现接口 ApplicationListener<ContextRefreshedEvent>, ApplicationContextAware
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
Map<String, Object> beansWithAnnotation = ac.getBeansWithAnnotation(Tag.class);
for(Map.Entry<String, Object> en:beansWithAnnotation.entrySet()){
Tag annotationOnBean = ac.findAnnotationOnBean(en.getKey(), Tag.class);
System.out.println(en.getKey()+"==!!"+annotationOnBean);
tagMap.put(en.getKey(),en.getValue());
}
}
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
this.ac = ac;
}