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代理对象的更多相关文章

  1. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  2. Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

    原文地址:http://blog.csdn.net/wangyang1354/article/details/50757098 我们经常会遇到这样一种情景,就是在我们开发项目的时候经常会在一个类中调用 ...

  3. 10.Servlet简单介绍

    1.什么是Servlet * Servlet是javaweb的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet种通常需要: ...

  4. 【Java Spring 进阶之路 】1.Spring 是什么?

  5. spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象

    最近做了一个java的项目,部门领导给了一套代码让我尽快掌握,说心里话本人真心不喜欢java的这种项目方式,各种配置各种xml文件简直头都大了,下面就将我遇到的其中一个我认为是坑的地方整理出来,希望能 ...

  6. Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建

    上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...

  7. [原创]java WEB学习笔记105:Spring学习---AOP介绍,相关概念,使用AOP,利用 方法签名 编写 AspectJ 切入点表达式

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放

    一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...

  9. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

随机推荐

  1. 杂项-事务:OLTP(联机事务处理过程)

    ylbtech-杂项-事务:OLTP(联机事务处理过程) On-Line Transaction Processing联机事务处理过程(OLTP) 也称为面向交易的处理过程,其基本特征是前台接收的用户 ...

  2. 负载均衡获得真实源IP的6种方法

    除了X-FORWARD-FOR,负载均衡中获得真实源IP的方法还有很多种. 本文抛砖引玉,主要介绍获得真实源IP的多种方法,而不是具体配置. 负载均衡获得真实IP的方法有很多种,将形成专题文章. 本文 ...

  3. MyBatis输出执行的SQL到控制台

    src\main\resources\application.properties 或者src\main\resources\application.yml 在你的application.proper ...

  4. win7如何给虚拟机设置共享文件

    友情提示:设置之前先把虚拟机关掉 1. 安装vmtools 安装过的,则不需要 重新安装 如果没有安装vmware tools,点击安装(需要联网下载) ,下载完成后,打开虚拟机 点击安装,安装完毕后 ...

  5. tp框架---表单验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证.分为静态验证和动态验证. 关于基础知识,请查看手册“自动验证”一章. 一.静态验证 ( ...

  6. PyQt5信号-槽机制

    signal -> emit -> slot signal.connect(slot) signal.disconnect(slot) 信号 (singal) 可以连接无数多个槽 (slo ...

  7. SQL学习整理

    SQL整理 SQL 对大小写不敏感! 一.对数据的操作 实现功能分类: 1. 增: 1.1 表存在,插入栏位: //插入新的行(按栏位的顺序插入) INSERT INTO Table_1 VALUES ...

  8. fabric.js 学习

    官网地址:http://fabricjs.com/    git     https://github.com/kangax/fabric.js/ <!DOCTYPE html> < ...

  9. Docker-compose Setup for Self-hosting Development & Deployment Tools

    Last week I wrote about my self-hosted Sentry install in 3 Docker containers. This week I want to br ...

  10. css—各浏览器下的背景色渐变

    .linear{ width:100%; height:600px; FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0 ...