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

最近事情比较多,没时间整理一些问题,就对以前的一篇https://blog.csdn.net/rendaweibuaa/article/details/113924920?spm=1001.2014.3001.5501Spring中的多数据源配置做一个原理上的注解。从多数据源配置的文章中,可以看到,我们自定义的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的过程大概可以描述为,类的实例化类-->初始化注释属性-->实现InitializingBean的接口,实现afterPropertiesSet的接口函数--->AOP-->最后将生成的对象放入到SpringBean的单例池中。

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

多数据库源配置- Spring中AOP的实现原理_第1张图片

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

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

       JDK方式

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

       CGlib的方式

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

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

 

你可能感兴趣的:(JAVA)