文档章节

AOP的半自动代理 及 缺点

T-Brain
 T-Brain
发布于 2015/10/20 01:20
字数 1084
阅读 20
收藏 0

AOP的通知类型:

aop联盟 定义 aop通知类型,spring 对 aop联盟规范支持。

aop联盟定义5种通知

前置通知 org.springframework.aop.MethodBeforeAdvice

在目标方法执行前实施增强

后置通知 org.springframework.aop.AfterReturningAdvice

在目标方法执行后实施增强

环绕通知 org.aopalliance.intercept.MethodInterceptor

在目标方法执行前后实施增强

异常抛出通知 org.springframework.aop.ThrowsAdvice

在方法抛出异常后实施增强

引介通知 org.springframework.aop.IntroductionInterceptor(了解)对一个类进行增强(添加方法或属性等)

在目标类中添加一些新的方法和属性

如果使用aop联盟规范进行aop开发,所有的通知必须实现接口。(底层为了确定通知方法名称)


AOP的半自动代理(不带有切入点的切面---所有方法)

1.切面类

    需要总结:

            需要根据AOP联盟确定一个通知类型:这里使用环绕通知(环绕通知需要手动开启方法)

            所以切面类随便写,随便实现一个通知类型,重写里面的invok方法在,通过参数调用

                    proceed()执行目标类,前后可以写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.mickeymouse.proxy;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
  * 切面类:包含两个通知(增强)
          环绕通知必须手动执行方法
  * @author Mickey-Mouse
  *
  */
public class MyAspect implements MethodInterceptor {
     public Object invoke(MethodInvocation mi) throws Throwable {
         System.out.println( "已校验是否符合身份" );
         //环绕通知必须手动执行方法
         Object object = mi.proceed();
         System.out.println( "方法已经执行完--->后处理" );
         return object;
     }
}
2.目标类(已实现接口)
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.mickeymouse.proxy;
public class ProductsServiceImpl implements ProductsService {
     /**
      * 目标类:
      * 里面有两个连接点
      */
     public void addProducts(){
         System.out.println( "添加商品成功" );
     }
     public void updateProducts(){
         System.out.println( "修改商品成功" );
     }
}
3.半自动代理XML配置

  与AOP的自动代理的区别在于:

       半自动代理没有使用AOP约束,要手动配置代理类与目标类的关系

      半自动代理是基于ProxyFactoryBean的代理类:

            缺点:

                    * 配置麻烦:

                    * 需要为每一个要增强的类配置一个ProxyFactoryBean.(只要有增强,就需要写一个ProxyFactoryBean的配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<? xml version = "1.0" encoding = "UTF-8" ?>
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop = "http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
<!-- bean definitions here -->
     <!-- 半自动代理模式 -->
     <!-- 生成切面类 -->
     < bean id = "myAspect" class = "com.mickeymouse.proxy.MyAspect" />
     <!-- 生成目标类 -->
     < bean id = "productsService" class = "com.mickeymouse.proxy.ProductsServiceImpl" />
     <!-- 让Spring来创建代理工厂对象 -->
     < bean id = "proxyFactoryBean" class = "org.springframework.aop.framework.ProxyFactoryBean" >
         <!-- 设置目标类 -->
         < property name = "target" ref = "productsService" ></ property >
         <!-- 设置切面类"名字" -->
         < property name = "interceptorNames" value = "myAspect" ></ property >
         <!-- 设置切面类需要连接的接口(optimize与接口二选一即可,Spring可以自动识别,接口就动态代理,没有就CGLIB) -->
         < property name = "proxyInterfaces" value = "com.mickeymouse.proxy.ProductsService" ></ property >
         <!-- 是否强制使用使用CGLIB -->
         < property name = "optimize" value = "true" ></ property >
     </ bean >
</ beans >

测试类:

1
2
3
4
5
6
7
@Test
     public void test1(){
         ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml" );
         ProductsService bean = applicationContext.getBean( "proxyFactoryBean" ,ProductsService. class );
         bean.addProducts();
         bean.updateProducts();
     }

结果:



AOP的半自动代理:(配置带有切入点的切面---->个别方法)(了解)

配置文件:(其他部分是一样的 , 同上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<? xml version = "1.0" encoding = "UTF-8" ?>
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
     
     <!-- Spring帶有切入点的切面=============== -->
     
     <!-- 配置目标类 -->
     < bean id = "customerDao" class = "com.itheima.spring.demo4.CustomerDao" />
     
     <!-- 配置通知:(环绕通知) -->
     < bean id = "myAroundAdvice" class = "com.itheima.spring.demo4.MyAroundAdvice" />
     
     <!-- 配置带有切入点的切面 -->
     < bean id = "myAdvisor" class = "org.springframework.aop.support.RegexpMethodPointcutAdvisor" >
         <!-- 表达式: 正则表达式 : .:任意字符  *:任意次数-->
<!-- 拦截所有方法 -->
<!--         <property name="pattern" value=".*"/> -->
<!-- 只拦截update方法 -->
<!--         <property name="pattern" value="com\.itheima\.spring\.demo4\.CustomerDao\.update"/> -->
<!-- 拦截update和delete方法 -->
<!--         <property name="patterns" value="com\.itheima\.spring\.demo4\.CustomerDao\.update,com\.itheima\.spring\.demo4\.Cus            tomerDao\.delete"/> -->
         <!-- 拦截所有以save和update结束名的方法 -->
         < property name = "patterns" value = ".*save.*,.*update.*" />
         <!-- 配置增强 -->
         < property name = "advice" ref = "myAroundAdvice" />
     </ bean >
     
     <!-- 配置生成代理 -->
     < bean id = "proxyFactoryBean" class = "org.springframework.aop.framework.ProxyFactoryBean" >
         <!-- 配置目标 -->
         < property name = "target" ref = "customerDao" />
         <!-- 配置代理目标类 -->
         < property name = "proxyTargetClass" value = "true" />
         <!-- 配置拦截的名称 -->
         < property name = "interceptorNames" value = "myAdvisor" />
     </ bean >
</ beans >



© 著作权归作者所有

共有 人打赏支持
下一篇: SVN
T-Brain
粉丝 1
博文 44
码字总数 46138
作品 0
海淀
程序员
私信 提问
我们为什么要使用 AOP

前言 一年半前写了一篇文章Spring3:AOP,是当时学习如何使用Spring AOP的时候写的,比较基础。这篇文章最后的推荐以及回复认为我写的对大家有帮助的评论有很多,但是现在从我个人的角度来看...

t4i2b10X4c22nF6A
2017/10/26
0
0
java代理与Spring AOP

代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会...

coldlemon
2013/11/24
736
0
32、最简单的mvc框架tiny,orm、原理图、问题与解决思路

orm 先说下orm,在前面我们没有提这个,其实我们已经实现了orm功能。 这里把orm做了极大的简化,以一个model映射到数据库的一张表。在前面看到我们把业务处理也放在model里,所以这时model才...

青青小树
2014/04/13
0
11
SpringAOP - 代理的实现方式

静态代理:在代理类中持有一个目标类的引用,然后对目标类的方法进行代理 缺点很明显,受限于方法的数量; 动态代理:基于反射实现,比较易用 有两种实现: 1.基于接口的代理,代表为JDK实现...

晨猫
2017/10/25
0
0
【每日提高之声明式事物】spring声明式事务 同一类内方法调用事务失效

【问题】 Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松;事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务;轻量级,测...

卯金刀GG
08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux之自定义命令

本人使用的是ubuntu系统,不喜欢建各种桌面快捷链接,但是每次启动个软件,去查找又麻烦,所以自定义了命令,来快捷的启动应用: 1、修改/etc/bash.bashrc,在文件末尾,加上如下List-1中的内...

克虏伯
11分钟前
0
0
linux基础

系统安全 sudo su chmod setfacl 进程管理 w top ps kill pkill pstree killall 用户管理 id usermod useradd groupad userdel 文件系统 mount umount fsck df du 网络应用 curl telnet mail......

关元
12分钟前
0
0
Caffe-源码分析(一)

CHECK_X函数,用于比较两个blob之间的值 CHECK_EQ(x,y)<<"x!=y",EQ即equation,意为“等于”,当x!=y时,函数打印出x!=y。 CHECK_NE(x,y)<<"x=y",NE即not equation,意为“不等于”,,...

Pulsar-V
13分钟前
1
0
三星Galaxy S10可能会配备TOF 3D摄像头

12月3日消息,据Phone Arena报道,三星Galaxy S10可能会配备TOF 3D摄像头。 Phone Arena报道称三星Galaxy S10一共有五颗摄像头(前置双摄+后置三摄),而5G版本的Galaxy S10后置四颗摄像头,...

问题终结者
36分钟前
10
0
fabric增删改查Mac

备份1.3版本,重新下载1.1版本到fabric文件夹 /opt/gopath/src/github.com/hyperledger/fabric -> /opt/gopath/src/github.com/hyperledger/fabric1.3 新建/opt/gopath/src/github.com/hype......

八戒八戒八戒
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部