文档章节

AOP的半自动代理 及 缺点

T-Brain
 T-Brain
发布于 2015/10/20 01:20
字数 1084
阅读 13
收藏 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 >



© 著作权归作者所有

共有 人打赏支持
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
day33_Spring学习笔记_02

一、AOP 1.1、AOP介绍 1.1.1、什么是AOP? 在软件业,AOP为Aspect Oriented Programming的缩写,意为:,通过和实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开...

黑泽明军
08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
31分钟前
1
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
2
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
25
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
2
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部