文档章节

AOP的半自动代理 及 缺点

T-Brain
 T-Brain
发布于 2015/10/20 01:20
字数 1084
阅读 496
收藏 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
海淀
程序员
私信 提问
加载中

评论(0)

spring 事务案例--转账

#spring 事务案例--转账 ##1 环境搭建 1.创建表 2.导入jar包 核心 4+1 aop:4 (aop联盟,spring aop,aspectj,spring aspectj) 数据库 2 (jdbc ,tx) 驱动 mysql 连接池 c3p0 3.dao层 4....

osc_y9wmeuxa
2019/08/12
3
0
AOP是怎么实现的,有几种方式

1、静态AOP:在编译期,切面直接以字节 码的形式编译到目标字节 码文件中。 AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器。 优...

osc_qvzk8wey
2018/03/05
2
0
我们为什么要使用 AOP

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

t4i2b10X4c22nF6A
2017/10/26
0
0
java程序员福利:呈上227道Spring+SpringMVC+MyBatis面试题

前言 昨天给大家分享的Springcloud的面试题,今天的话就给大家来一波基础面试题吧,也就是SSM的面试题,希望大家能够喜欢! Spring55道 一般问题 1.1.不同版本的Spring Framework有哪些主要功...

互联网全栈工程师
05/14
0
0
java代理与Spring AOP

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

coldlemon
2013/11/24
978
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 头发和不要头发,你总要选一个

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《雾 缀じた街 ふたつのかげ》- Porkkana 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
35
0
一道 算法题 引发的 ‘xx现场’

请 熟悉的语言 去 验证 在输入框中输入的是否是一个正确的网址 初次读题萌新有点 不知所措的样子一查 MDN 吓一跳 ----- 一个不怎么熟悉的方法跳出眼边URL() 构造函数返回一个新创建的 ...

酒窝yun过去了
今天
19
0
如何检查jQuery中是否已选中复选框? - How to check whether a checkbox is checked in jQuery?

问题: I need to check the checked property of a checkbox and perform an action based on the checked property using jQuery. 我需要检查复选框的checked属性,并使用jQuery根据check......

技术盛宴
今天
12
0
mongoose 使用

http://www.mongoosejs.net/ 编写MongoDB验证,转换和业务逻辑是非常麻烦的. 所以Mongoose应运而生了. const mongoose = require('mongoose');mongoose.connect('mongodb://localhost/te......

东东笔记
今天
22
0
微服务

什么是微服务? 使用一套小服务来开发单个应用的方式,每个服务运行在独立的进程里,一般采用轻量级的通讯机制互联,并且他们可以通过自动化的方式部署。 微服务的特征 单一职责 轻量级通信 ...

鸿FW
今天
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部