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. luogu3376 【模板】 网络最大流

    题目大意 给出一个网络图,以及其源点和汇点,求出其网络最大流. 概念 可以把网络图看作管道,节点看作管道的交界处.流就像是管道里的流水.管道有个容量(相当于横截面积),还会有个流量(相当于水流占了管道 ...

  2. tflearn Training Step每次 We will run it for 10 epochs (the network will see all data 10 times) with a batch size of 16. n_epoch=10, batch_size=16

    Training TFLearn provides a model wrapper 'DNN' that can automatically performs a neural network cla ...

  3. Additive equations--zoj

    Additive equations Time Limit: 10 Seconds      Memory Limit: 32768 KB We all understand that an inte ...

  4. number随时间随机递增每天 不同 php(原创)

    <?php namespace Controller; class IndexController{ public function getAutoRegUserName(){ $sql=&qu ...

  5. [计蒜客] tsy's number 解题报告 (莫比乌斯反演+数论分块)

    interlinkage: https://nanti.jisuanke.com/t/38226 description: solution: 显然$\frac{\phi(j^2)}{\phi(j)} ...

  6. guice基本使用,guice整合guice-servlet,web开发(五)

    介绍 Guice Servlet 为使用web应用程序和Servlet容器提供了一个完整的模式.. Guice's servlet 扩展允许从你的servlet应用中完全淘汰web.xml,并且具有类 ...

  7. JavaScript中的数组创建

    JavaScript中的数组创建 数组是一个包含了对象或原始类型的有序集合.很难想象一个不使用数组的程序会是什么样. 以下是几种操作数组的方式: 初始化数组并设置初始值 通过索引访问数组元素 添加新元 ...

  8. 基于 Web 的 Go 语言 IDE - Wide 1.4.0 发布!

    Wide 是什么 Wide 是一个基于 Web 的 Go 语言团队 IDE . 在线开发:打开浏览器就可以进行开发.全快捷键 智能提示:代码自动完成.查看表达式.编译反馈. Lint 实时运行:极速编 ...

  9. android随手记

    Linearlayout: gravity:本元素中所有子元素的重力方向     layout_gravity:本元素对于父元素的重力方向 自定义权限:http://www.cnblogs.com/i ...

  10. 面试题-mysql

      Sql :UPDATE test SET sex = CASE sex WHEN 'm' THEN 'f' ELSE 'm' END;