多数据库源配置- Spring中AOP的实现原理

最近事情比较多,没时间整理一些问题,就对以前的一篇SpringMVC+Mybatis多个数据源_rendawei636专注医疗软件-优快云博客_springmvc多数据源Spring中的多数据源配置做一个原理上的注解。从多数据源配置的文章中,可以看到,我们自定义的DataSourceRouter类,继承于AbstractRoutingDataSource,又继承于DataSource接口,所以,DataSourceRouter是可以作为框架中的数据源接口实例的。

我们来看DataSource接口中,可以通过getConnection接口来获取一个连接;

public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {
     @Override
     public Connection getConnection() throws SQLException {
           return determineTargetDataSource().getConnection();
     }
}

可见,自定义的DataSourceRouter中的getConnection,是通过determineTargetDataSource抽象函数来获取当前合适的DataSource,然后再去调用getConnection来获取对应的数据库连接。所以,可以动态切换的数据源的问题上,Spring已帮我们预先定义好了抽象类AbstractRoutingDataSource。

      接下来,我们只需要在合适的位置对数据库源进行正确的调用即可。第一种,我们可以通过修改Mybatis框架中的Plugins代码,根据不同的数据源,生成不一样的代码。不过大部分的情况下,开发的同学都不会采用此种方式;第二种,在调用Mybatis生成Service类的方法之前,切换到对应的数据源链接上。但,首先确认的一点是,不能通过手动修改代码达到目的,这时,Spring提供的AOP编程方式,可以自动生成代理类,就是这个问题的最好的解决方案。

       具体什么是代理模式,这里就不再累述,大家也可以翻我的资源,有对设计模式的讲解的PPT。

        下面主要讲一下Spring中的AOP

        AOP可以说是Spring对框架内的Bean,生成代理类的的一种实现方案,通过Aspect注解,对需要被代理的方法的类,动态的生成代理类的方式。我们知道在Spring框架中,生成普通Bean的过程是在refresh中,对finishBeanFactoryInitialization函数的调用,分为类的实例化>依赖属性的填充>SpringBean生命周期接口调用(InitializingBean, ApplicationContextAware等接口)>BeanPostProcessor接口的调用,最后放入到单例池中。

       Spring中的AOP,是通过实现接口BeanPostProcessor的类来动态生成代理类的。这个类就是AnnotationAwareAspectJAutoProxyCreator。当正常Bean通过一系列的BeanPostProcessor的处理时,当AnnotationAwareAspectJAutoProxyCreator发现当前Bean和切面类中的切面相吻合时,就对特定的方法进行增强。

         这个  AnnotationAwareAspectJAutoProxyCreator 对象负责对Aspect注释的类,生成代理类,并且对切面函数进行增强。这个过程很复杂,目前也有很多的文章在描述这一个过程,更重要的是我目前确实也不能以一个简单明了的方式描述清楚,暂时这里就先不介绍了。不过,我们这里只要记住实现Spring中的自动化代理类生成过程是AnnotationAwareAspectJAutoProxyCreator通过注释,将普通类改变为代理类的。

        这里需要注意的是,Spring中可以实现AOP的代理类提供了两种方式

       JDK方式

                JDK的方式需要被代理类,必须实现一个接口;因为他的实现方式是通过代理的方式;新生成的代理类和被代理类都继承于被代理类的某个接口,并且将被代理类赋值给代理类中的target属性;

       CGlib的方式

                是直接继承于被代理类,所以,可以知道这个不需要被代理例实现接口。

总之,AOP是Spring中十分重要的概念和实现思想。在数据库的事务中,也是通过AOP实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值