AOP相关

静态代理、动态代理与AOP:

简单易懂:http://blog.csdn.net/hejingyuan6/article/details/36203505

补充:http://layznet.iteye.com/blog/1182924http://www.cnblogs.com/fingerboy/p/5335328.html

AOP:https://www.cnblogs.com/best/p/5679656.htmlhttps://www.cnblogs.com/hadoop-dev/p/7095464.html

Spring AOP常用的四种实现方式:http://www.360doc.com/content/10/1215/11/4957029_78291485.shtml

图解:

AOP有两种实现方式:预编译和动态代理。

例如事务处理:我们希望任何数据库操作的方法,尤其是insert,update需要做这种事务的处理,那我们肯定不希望在每一个方法上手动地开启事务,得到连接,提交事务,关闭连接,这样做成本很大,效率很低,所以我们希望有一种方式,对于开发人员是透明的,执行到某一个方法或是某种类型的方法,具有某种特点的方法,或者是某一层的类,比如说service或者以service结尾的类的时候,我们就可以开启事务控制,这就是一种实现统一维护的技术,实现方式有预编译和动态代理两种。

Spring没有提供AOP方式的日志系统,我们需要使用AOP(面向切面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。 

配置切面:

实现:

图释:

将aBean这个bean作为一个切面来生命,id为myAspect

point概念及应用:

Spring没有提供AOP方式的日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。 

图释:

这里的mappedNames就是要匹配的方法名的集合,这里<list>标签中的<value>也就是其中之一,这里sa*表示,映射的方法是以sa开头的所有的方法

例子:

xml配置文件:

View Code

接口:

View Code

实现类:

View Code

例子:

View Code

例子:

View Code

例子:

View Code

例子:

View Code

例子:

View Code
View Code
View Code

配置切入点:

在AOP中通知advice和一个切入点表达式相关联

图释:

上面的五个execution是Spring的AOP和AspectJ都支持的,下面的三个只有Spring的AOP支持的,

具体解释:

实现:

配置通知advice:

图释:

method是说明前置通知会调用哪个方法去执行,这个方法在aBean里进行实现

图释:

这里returning表示限制了method方法的返回值

例子:

切面类:

View Code

业务类:

View Code

测试类:

View Code

xml配置:

View Code

引入introductions:

Spring把引入当成一种特殊的通知,也就是一种特殊的包围通知,因为引入只能用在类这一等级上,所以我们使用引入时不能用切入点,引入为类增加了新的接口实现,而切入点定义一个通知涉及的那些方法。

introductions官方释义:允许一个切面声明一个实现指定接口的通知对象,并且提供一个接口实现类来代表这些对象。

例如:在xml配置文件中声明了一个before或者after,它们都会匹配到一个具体的实现类,如果使用declare-parents,它会给所有匹配的类型一个新的parent,也就是通过AOP的方式去给指定的匹配到的类型一个新的父类。

图释:

types-matching匹配什么样的类型,implement-interface具体使用哪一个接口,这也就是实现指定接口的通知对象,这个接口也就是通过implement-interface指定的,并且提供一个接口实现类来代表这个对象,接口实现类就是由default-impl来指定的。

我们在执行getBean之后,会把types-matching匹配的类强制转成下面声明的接口,为什么能强制转换,是因为declare-parents会用于声明所有匹配的类型拥有一个新的parent,也就是当前这个declare-parents匹配到了myService对应的这个类,所以它会给这个类指定一个新的parent,也就是UsageTracked,所以这里面改能做这种强制转换。

例子:

接口:

 

实现类:

xml配置文件:

 测试类:

Advisors:

例子:

切面类:

View Code

service类:

View Code

测试类:

View Code

xml配置文件:

View Code

运行结果:

注意中间有一个空行,是测试类中执行了invoke方法之后再执行invokeException得到的。

原文地址:https://www.cnblogs.com/cing/p/7452280.html