Spring进阶之路(9)-Spring AOP面向切面编程概念以及通过JDK代理生成AOP代理对象

来源:互联网 发布:淘宝客服差评处理技巧 编辑:程序博客网 时间:2024/05/18 02:56

在软件开发中,分布于应用中多处的功能被称为横切关注点,,通常情况下,这些横切关注点从概念上是与应用的业务逻辑相分离的。将这些横切关注点与我们的业务逻辑相分离是面向切面编程AOP所要解决的事情。



AOP中的名词解释



Advice(通知):定义了切面是什么,以及什么时候使用。主要包括:before、after、after-returning、after-throwing、aound(在被通知的方法调用之前和调用之后执行)。


JoinPoint(连接点):程序执行过程中明确的点,比如方法的调用,异常的抛出。可以利用这些点插入应用的正常流程之中,添加新的行为。


PointCut(切入点):其定义匹配通知所要织入的一个或多个连接点,通常用明确的类和方法名称来指定切点,或者利用正则表达式定义匹配的类和方法名称模式来指定这些切点。


Aspect(切面):切面是通知和切点的结合,通知和切点共同定义了关于切面的全部内容,包括是什么,在什么时候什么地方执行。


引入:允许我们向现有的类中添加新的方法或者是属性,

织入:将切面应用到目标对象来创建新的代理对象的过程。




通过JDK代理生成AOP代理对象



Spring中的AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理,因此,AOP代理可以直接使用容器中的其他Bean作为目标。Spring默认是由java动态代理来创建AOP代理的,下面先自己实现一下这个生成代理的过程。


package com.siti.spring20160314;public interface Person {public void saySth();}
User类实现这个Person接口,并实现其方法。

package com.siti.spring20160314;public class User implements Person{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;}@Overridepublic void saySth() {System.out.println("hello!");}}


通过动态代理模式,产生该对象的代理对象。对代理对象请求进行拦截,如果符合要求,相应其请求,不符合的拒绝请求。从这里可以体会到,细粒度的权限控制可以通过这种方式进行控制。


package com.siti.spring20160314;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyProxy4AOPObject implements InvocationHandler{private Object targetObj;public Object getProxyObject(Object targetObj){this.targetObj = targetObj;// 第一个参数是类的加载器// 第二个参数表示接口// 第三个参数表示当前创建代理对象的过程中调用谁的拦截方法return Proxy.newProxyInstance(this.targetObj.getClass().getClassLoader(), this.targetObj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] arg2)throws Throwable {User user = (User) this.targetObj;if(user.getUserName() != null && user.getUserName() != ""){method.invoke(targetObj, arg2);}return null;}}

测试类

package com.siti.spring20160314;public class MainTest {public static void main(String[] args) {User user = new User("", "wy");MyProxy4AOPObject myProxy4AOPObject = new MyProxy4AOPObject();Person person = (Person) myProxy4AOPObject.getProxyObject(user);person.saySth();}}





1 0
原创粉丝点击