Spring AOP /代理模式/事务管理/读写分离/多数据源管理

参考文章:html

http://www.cnblogs.com/MOBIN/p/5597215.htmljava

http://www.cnblogs.com/fenglie/articles/4097759.html算法

http://blog.csdn.net/arthur0088/article/details/5377736spring

http://www.xuebuyuan.com/324257.html数据库

http://blog.csdn.net/dreamthen/article/details/26687727设计模式

 

 

设计模式、框架源码、编写底层框架框架

1.代理模式

做用:

以非侵入式的方式,为某个或某类方法实行加强。即不须要修改原来的类和方法,便可在调用某方法以前或以后,添加新的功能。函数

实现方式:

静态代理(预先写好代理类),缺点不灵活. a.代理类和委托类实现了相同的接口,致使委托类新增方法的时候,代理类代码也要修改。b.代理对象只服务于一种类型的对象,即一个代理类智能代理一个接口,而动态代理能够代理一组接口。性能

动态代理,JDK动态代理cglib 动态代理.java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,经过修改其字节码生成子类来处理。ui

JDK动态代理实现原理,

  1. 经过实现 InvocationHandler 接口建立本身的调用处理器;
  2. 经过为 Proxy 类指定 ClassLoader 对象和一组 interface 来建立动态代理类;
  3. 经过反射机制得到动态代理类的构造函数,其惟一参数类型是调用处理器接口类型;
  4. 经过构造函数建立动态代理类实例,构造时调用处理器对象做为参数被传入。

简单来讲, 经过InvocationHandler 接口建立本身的调用处理器,而后经过经过Proxy 类和反射机制,来建立动态代理类实例。

方法一:

方法二:将2~4步骤封装好的简便方法来建立动态代理对象

 

2.Spring AOP 原理

 spring AOP 可使用JDK动态代理 或cglib 动态代理。默认JDK动态代理。如何选择?从灵活性,cglib更灵活能够代理接口,也能够代理类。可是cglib须要引入新的包,并且JDK动态代理性能更好。并且代码也习惯用接口来作。因此仍是选用了JDK动态代理。

 

切入点,通知。切面

在选择JDK动态代理状况下,spring 就是使用InvokeHandler和PROXY类实现的。切入点,就是委托类要进行加强的方法。通知就是具体的加强方法。而InvokeHandler处理器,至关于就是切面,切面里面能够加入先后通知。

3.事务管理、底层jdbc框架、多数据源、数据库读写分离。

基础事务管理:

声明式事务,对业务层方法实现AOP切面,负责管理事务。事务开启管理,传播机制等等。

多数据源管理:

再定一个切面,对业务层这个切入点,增长一个切面来进行数据源管理。注:同一个切入点的不一样切面的执行顺序,须要经过ORDER参数来保证,必须让数据源管理在事务管理以前。

a.读写库分离

b.读库的均衡策略 :简单办法 。 使用AtomicInteger 自增取余的hash算法,来均衡请求。

c.外部数据源的选择

read-only,只读事务管理:(可忽略,可直接声明式事务为SUPPORTS,而不适用read-only配置)

因为使用的是spring的DataSourceTransactionManager,不是HibernateTransactionManager。里面对声明式事务配置的 read-only没作处理。致使对只读事务,使用的事务传播性是required.而这些读方法不须要进行开启事务,让费了资源。

作法:在多数据源管理的切面类,实现BeanPostProcessor接口,便可在相应bean被ico实例化后作统一处理,设置read-only的方法的事务传播性为SUPPORTS.

相关文章
相关标签/搜索