循序渐进之Spring AOP(3) - 配置代理
上一篇介绍了几种Advice(增强),并通过代码演示了生成代理的方式,下面来看通过配置文件配置方式把Advice织入目标类。
注意,配置文件方式仍然不是spring AOP的最好方式,学习配置方式也是为了循序渐进的掌握内核技术。
接口SmartCar
- public interface SmartCar {
- void lock(String userName);
- }
实现类MyCar
- public class MyCar implements SmartCar {
- @Override
- public void lock(String userName) {
- System.out.println(userName + "锁车");
- }
- }
定义了两个增强,一个在锁车方法前执行,提示检查窗户是否关闭,一个在锁车方法后执行,"哔哔"声提示锁车成功
- public class BeforeAdviceDemo implements MethodBeforeAdvice {
- @Override
- public void before(Method method, Object[] args, Object obj)
- throws Throwable {
- System.out.println("请检查窗户是否关好");
- }
- }
- public class AfterAdviceDemo implements AfterReturningAdvice {
- @Override
- public void afterReturning(Object returnObj, Method method, Object[] args,
- Object obj) throws Throwable {
- System.out.println("哔哔");
- }
- }
applicationContext.xml: 用配置文件来声明代理
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <bean id="beforeAdvice" class="demo.aop.BeforeAdviceDemo" />
- <bean id="afterAdvice" class="demo.aop.AfterAdviceDemo" />
- <bean id="target" class="demo.aop.MyCar" />
- <bean id="myCar" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:target-ref="target"
- p:proxyTargetClass="true">
- <property name="interceptorNames">
- <list>
- <idref local="beforeAdvice" />
- <idref local="afterAdvice" />
- </list>
- </property>
- </bean>
- </beans>
测试代码
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("demo/aop/applicationContext.xml");
- SmartCar myCar = (SmartCar)context.getBean("myCar");
- myCar.lock("Tom");
- }
执行结果
- 请检查窗户是否关好
- Tom锁车
- 哔哔
配置文件中首先声明了3个bean,分别是增强的目标类和两个增强,没有特别的配置内容。重点是ProxyFactoryBean的配置,来看看它可配置的属性和用法。
| target | 目标对象,ref另一个bean |
| proxyTargetClass | 是否对类进行代理(而不是对接口),true或false,设置为true时,使用CGLib代理技术 |
| interceptorNames | 织入目标对象的Advice(实现了Advisor或者MethodInterceptor接口的bean) |
| proxyInterfaces | 代理所要实现的接口,如果指定了proxyTargetClass=true,此属性会被忽略 |
| optimize | 设置为true时,强制使用CGLib代理技术 |
下面再分别增加一个环绕增强和一个异常抛出增强。
先修改MyCar类,使它能够抛出异常,粗心的约翰会忘记锁车而抛出一个异常
- public class MyCar implements SmartCar {
- @Override
- public void lock(String userName) {
- if(userName.equals("Careless John")) {
- throw new RuntimeException(userName + "忘记锁车");
- } else {
- System.out.println(userName + "锁车");
- }
- }
- }
环绕增强类
- public class AroundAdviceDemo implements MethodInterceptor {
- @Override
- public Object invoke(MethodInvocation invocation) throws Throwable {
- Object[] args = invocation.getArguments();
- String name = (String)args[0];
- System.out.print("Hey, " + name);
- Object obj = invocation.proceed(); //调用目标方法
- System.out.println("Goodbye! " + name);
- return obj;
- }
- }
异常抛出增强
- public class ThrowsAdviceDemo implements ThrowsAdvice {
- public void afterThrowing(Method method, Object[] args, Object target, Exception ex) throws Throwable {
- System.out.println("捕获异常:" + ex.getMessage());
- System.out.println("(报警)滴滴滴滴滴滴滴滴滴滴滴滴");
- }
- }
applicationContext.xml
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <bean id="beforeAdvice" class="demo.aop.BeforeAdviceDemo" />
- <bean id="afterAdvice" class="demo.aop.AfterAdviceDemo" />
- <bean id="aroundAdvice" class="demo.aop.AroundAdviceDemo" />
- <bean id="throwsAdvice" class="demo.aop.ThrowsAdviceDemo" />
- <bean id="target" class="demo.aop.MyCar" />
- <bean id="myCar" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:target-ref="target"
- p:proxyTargetClass="true">
- <property name="interceptorNames">
- <list>
- <idref local="aroundAdvice" />
- <idref local="throwsAdvice" />
- <idref local="beforeAdvice" />
- <idref local="afterAdvice" />
- </list>
- </property>
- </bean>
- </beans>
测试代码
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("demo/aop/applicationContext.xml");
- SmartCar myCar = (SmartCar)context.getBean("myCar");
- myCar.lock("Tom");
- System.out.println("-------------------------");
- myCar.lock("Careless John");
- }
运行结果
- Hey, Tom请检查窗户是否关好
- Tom锁车
- 哔哔
- Goodbye! Tom
- -------------------------
- Hey, Careless John请检查窗户是否关好
- 捕获异常:Careless John忘记锁车
- (报警)滴滴滴滴滴滴滴滴滴滴滴滴
除了上面的四种增强,还有一种特殊的引介增强(Introduction),在下一篇中单独介绍
循序渐进之Spring AOP(3) - 配置代理的更多相关文章
- 基于注解的Spring AOP的配置和使用
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
- 基于注解的Spring AOP的配置和使用--转载
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- Spring AOP 和 动态代理技术
AOP 是什么东西 首先来说 AOP 并不是 Spring 框架的核心技术之一,AOP 全称 Aspect Orient Programming,即面向切面的编程.其要解决的问题就是在不改变源代码的情 ...
- Spring AOP 不同配置方式产生的冲突问题
Spring AOP的原理是 JDK 动态代理和CGLIB字节码增强技术,前者需要被代理类实现相应接口,也只有接口中的方法可以被JDK动态代理技术所处理:后者实际上是生成一个子类,来覆盖被代理类,那么 ...
- 深入理解Spring AOP之二代理对象生成
深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 ...
- spring AOP为什么配置了没有效果?
spring Aop的配置一定要配置在springmvc配置文件中 springMVC.xml 1 <!-- AOP 注解方式 :定义Aspect --> <!-- ...
- spring aop注解配置
spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码 可以在切面上实现合法性校验.权限检验.日志记录... spring aop 用的多的有两种配 ...
- spring aop + xmemcached 配置service层缓存策略
Memcached 作用与使用 基本介绍 1,对于缓存的存取方式,简言之,就是以键值对的形式将数据保存在内存中.在日常业务中涉及的操作无非就是增删改查.加入缓存机制后,查询的时候,对数据进行缓存,增删 ...
- spring---aop(5)---Spring AOP的配置的背后的配置
写在前面 Spring AOP中Pointcut,dvice 和 Advisor三个概念 1)切入点 Pointcut 在介绍Pointcut之前,有必要先介绍 Join Point(连接点)概念. ...
随机推荐
- Java之数据类型,变量赋值
Java中的基础数据类型(四类八种): 1.整数型 byte----使用byte关键字来定义byte型变量,可以一次定义多个变量并对其进行赋值,也可以不进行赋值.byte型是整型中所分配的内存空间是最 ...
- LINUX:alias命令详解
发现目前安装的g++并没有开启选项 -std=c++11,无法使用c++11的新标准及其中的列表初始化.搜索后得到解决方法:键入:alias g++="g++ -std=c++11&quo ...
- GDB scheduler-locking 命令详解
GDB scheduler-locking 命令详解 GDB> show scheduler-locking //显示线程的scheduler-locking状态GDB> set ...
- treeview插件使用:根据子节点选中父节点
鄙人公司没有专门的前端,所以项目开发中都是前后端一起抡.最近用bootstrap用的比较频繁,发现bootstrap除了框架本身的样式组件外,还提供了多种插件供开发者选择.本篇博文讲的就是bootst ...
- IDA分析脱壳后丢失导入表的PE
1. 问题 一些程序经过脱壳后(如用OD的dump插件),一些导入表信息丢失了,导致拖入IDA后看不到API的信息(如右图所示,第一个红圈处实际是GetCurrentProcessId),给分析造成极 ...
- java中可变长参数
** * Created by Lenovo on 2017/12/10. * java中可变长参数 */ public class reflect04 { //m1有一个int类型的可比变长参数 / ...
- bzoj 2588 Count on a tree
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- CJOJ 免费航班
Description 小Z在MOI比赛中获得了大奖,奖品是一张特殊的机 票.使用这张机票,可以在任意一个国家内的任意城市之间的免费飞行,只有跨国飞行时才会有额外的费用.小Z获得了一张地图,地图上有城 ...
- 如何写一个SSH项目(一)程序设计大体思路
SSH:分别是指Spring,Struts,Hibernate. 后来Struts2代替了Struts,所以我们常说的SSH是指Spring,Struts2,Hibenate. 其中Spring一般用 ...
- 【读书笔记】《Effective Java》——目录
第二章——创建和销毁对象 第1条:考虑用静态工厂方法替代构造器 第2条:遇到多个构造器参数时要考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 第4条:通过私有构造器强化不可实 ...