获取Dao上的自定义注解(了解Mybatis与Spring整合原理)

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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值