Spring进阶之路(10)-Advice简单介绍以及通过cglib生成AOP代理对象
Advice简单介绍
1. Before:在目标方法运行之前运行织入。假设Before的处理中没有进行特殊的处理。那么目标方法终于会运行,可是假设想要阻止目标方法运行时。能够通过抛出一个异常来实现。Before处理无法拿到目标方法的返回值,由于这时候目标方法并未运行。
2. AfterReturning: 返回之后运行(前提是目标方法运行成功),能够訪问到目标对象的返回值。可是不能够改变返回值。
3. AfterThrowing:抛出异常之后运行。能够对异常进行适当的修复或者将异常输出到日志中。
4. After:无论目标对象运行成功与否都会被织入经常使用于释放资源等。
5. Around:既能够在目标方法之前,又能够在目标方法调用之后运行。可是须要在线程安全的情况下运行,假设须要目标方法运行之前或者之后共享某种数据。应该考虑用Around。须要改变返回值的时候,仅仅能使用Around。
通过cglib生成AOP代理对象
上一篇文章中已经提到,通过JDK的代理生成AOP代理对象的方式。可是前提是目标方法实现了接口,假设没有实现接口的话,那么怎么办?
在这样的情况下,我们使用cglib来实现生成AOP代理对象。
定义一个没有实现接口的User类。
package com.siti.spring20160315; public class User { private String userName;
private String password; public User(){} public User(String userName, String password) {
super();
this.userName = userName;
this.password = password;
} public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} public void saySth() {
System.out.println("hello!");
}
}
对于Spring而言,假设说目标类实现了接口的话。会依照JDK代理生成AOP代理对象,假设没有实现接口的话,那么会使用cglib来生成AOP代理对象。
package com.siti.spring20160315; import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler; public class MyProxy4AOPObject implements InvocationHandler{ private Object targetObj; public Object getProxyObject(Object targetObj){
this.targetObj = targetObj; Enhancer enhance = new Enhancer();
// 将目标类设置为代理对象的父类,产生目标类的子类,这个子类覆盖全部父类的非final修饰的方法
enhance.setSuperclass(this.targetObj.getClass());
// 设置回调,能够单独建立一个类实现InvocationHandler接口实现里面的invoke方法
enhance.setCallback(this); return enhance.create();
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { User user = (User)this.targetObj;
Object result = null;
try{
// 拦截,符合要求的才同意执行
if(user.getUserName() != null && user.getUserName() != ""){
// -->Before
result = method.invoke(this.targetObj, args);
// -->AfterReturning
}
}catch (Exception e) {
// -->AfterThrowing
}finally{
// -->After
} return result;
} }
package com.siti.spring20160315; public class MainTest { public static void main(String[] args) {
User user = new User("wy", "wy");
MyProxy4AOPObject myProxy4AOPObject = new MyProxy4AOPObject();
User us = (User) myProxy4AOPObject.getProxyObject(user);
us.saySth();
}
}
这里会输出:hello!
假设将User中name属性赋值为null或者""的话就不会输出,由于在invoke方法中进行了限制,调用的目标对象的方法不会运行。
Spring进阶之路(10)-Advice简单介绍以及通过cglib生成AOP代理对象的更多相关文章
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
- Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转
原文地址:http://blog.csdn.net/wangyang1354/article/details/50757098 我们经常会遇到这样一种情景,就是在我们开发项目的时候经常会在一个类中调用 ...
- 10.Servlet简单介绍
1.什么是Servlet * Servlet是javaweb的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet种通常需要: ...
- 【Java Spring 进阶之路 】1.Spring 是什么?
- spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象
最近做了一个java的项目,部门领导给了一套代码让我尽快掌握,说心里话本人真心不喜欢java的这种项目方式,各种配置各种xml文件简直头都大了,下面就将我遇到的其中一个我认为是坑的地方整理出来,希望能 ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
- [原创]java WEB学习笔记105:Spring学习---AOP介绍,相关概念,使用AOP,利用 方法签名 编写 AspectJ 切入点表达式
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放
一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...
- Spring AOP 源码分析 - 创建代理对象
1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...
随机推荐
- vim分屏功能
转载,来自http://coolshell.cn/articles/1679.html 本篇文章主要教你如何使用 Vim 分屏功能. 分屏启动Vim 使用大写的O参数来垂直分屏. vim -On fi ...
- Linux - xshell 链接CentOS 设置高亮
默认是黑白的! 用了vim 指令还是黑白的. 两种途径设置,一种是通过Alt+P. 一种是选择配色方案来设置.
- Linux学习之设置联网,关闭防火墙,关闭selinux
桥接模式,给一台物理机,有自己独立的IP. boot分区,引导分区,系统启动,内核文件. swap分区,内存扩展分区.1.5或2倍.内存不够的时候,会写入其中.正常给8G或者16G就够了.不需要非要1 ...
- The Triangle--nyoj 18
The Triangle 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...
- lua队列实现
Queue = {} function Queue.newquene() } end function Queue.push(queue, value) queue.count = queue.cou ...
- (转)webpack用法
前言 webpack前端工程中扮演的角色越来越重要,它也是前端工程化很重要的一环.本文将和大家一起按照项目流程学习使用wbepack,妈妈再也不用担心我不会使用webpack,哪里不会看哪里.这是一个 ...
- 使用光盘作为yum源安装ifconfig等网络命令
# mkdir -p /mnt/cdrom# 如果是光驱:mount -t iso9660 /dev/cdrom /mnt/cdrom/# 如果是ISO:mount -o loop /usr/loca ...
- 关于编译PCL1.71
最近在编译PCL1.71时总会出现错误, 编译的时候就出现无法生成pcl_io_debug.lib 由于无法生成pcl_io_debug.lib,. 借鉴PCL中国的经验: (1):把io\inclu ...
- 优动漫PAINT核心功能介绍
优动漫PAINT是一款功能强大的动漫绘图软件,适用于个人和专业团队创作,分为个人版和EX版.搭载了绘制漫画和插画所需的所有功能——丰富的笔工具.超强的笔压感应和手颤修正功能,可分别满足画师对于插画.漫 ...
- Day 10 函数
函数 1.什么是函数? 函数就是具备某一功能的工具,事先将工具准备好就是函数的定义,遇到应用场景拿来就用就是函数的调用 2.为何用函数? 如果不使用函数,写程序会遇到这三个问题 1.程序冗长 2.程序 ...