最近事情比较多,没时间整理一些问题,就对以前的一篇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实现的。