参考文章:

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

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

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

http://www.xuebuyuan.com/324257.html

http://blog.csdn.net/dreamthen/article/details/26687727

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

1.代理模式

作用:

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

实现方式:

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

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

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.

Spring AOP /代理模式/事务管理/读写分离/多数据源管理的更多相关文章

  1. Spring aop应用之实现数据库读写分离

    Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...

  2. Spring AOP代理模式

    代理模式 代理模式是一种设计模式,提供了对目标对象的另外的访问方式.即通过代理访问目标对象. 好处:可以再目标对象实现的基础上,增加额外的功能的操作.扩展目标对象的功能,而不改变现有的功能逻辑. 1. ...

  3. Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...

  4. Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)

    Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...

  5. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  6. jdk动态代理与cglib代理、spring aop代理实现原理解析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  7. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  8. Spring AOP声明式事务异常回滚(转)

    转:http://hi.baidu.com/iduany/item/20f8f8ed24e1dec5bbf37df7 Spring AOP声明式事务异常回滚 近日测试用例,发现这样一个现象:在业务代码 ...

  9. jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

随机推荐

  1. 自定义 Activity 的 标题栏 TitleBar

    自定义 Activity 的 标题栏 TitleBar 1. 修改标题栏的高度,背景 编辑styles.xml,添加: <?xmlversion="1.0" encoding ...

  2. 服务端性能测试校准v1.2

    服务端性能测试工具校验v1.2 想知道压力工具实际并发多少,想知道压力工具统计响应数据准不准,来试试这款校准工具. 更新说明: 1.修正总接收请求显示上限. 2.随着响应时间增加,自动增加处理线程. ...

  3. 黄聪:关闭Win2003开机提示“上次意外关机”对话框

    很多人在使用win2003服务器(特别是vps)的时候,都会意外关机,然后出现开机提示“上次意外关机”对话框,如果不及时发现,会影响到使用该服务器的网站,所以必须把这提示关闭,方法如下: 1.开始菜单 ...

  4. 传入url地址请求服务器api,浏览器显示图片

    @RequestMapping("/proxyImage") public void proxyImage(HttpServletRequest request, HttpServ ...

  5. shell script

    一.shell script的编写与执行 1.shell script 的编写中还需要用到下面的注意事项: a.命令的执行是从上到下,从左到右地分析与执行 b.命令.参数间的多个空白都会被忽略掉 c. ...

  6. VS中的活动debug和活动cpu

    “活动”的含义就是当前项目所用的模式和平台.项目中的”活动“继承于解决方案中的配置.

  7. [hihoCoder1329] 带Split和Merge的Treap

    题目链接:http://hihocoder.com/problemset/problem/1329 这题本来是学Splay的题,但是我为了练习Treap的Split和Merge操作,就借来用一用. 就 ...

  8. 浅谈lua

    Lua脚本语言,关于它的介绍及优点特性,跨平台啊等等,在百度上可以搜索到很多,所以我就不再这里细说了.我主要想说的是lua在嵌入到应用程序中之后.. lua是按照标准的c/c++写的.当然它同样是可以 ...

  9. mysql load data 乱码的问题

    新学mysql在用load data导入txt文档时发现导入的内容,select 之后是乱码,先后把表,数据库的字符集类型修改为utf8,但还是一样,最后在 http://bbs.chinaunix. ...

  10. hbase 协处理器

    一.服务端1.安装Protobuf2.RPC proto 定义文件:Examples.protooption java_package = "org.apache.hadoop.hbase. ...