在软件开发中,分布于应用中多处的功能被称为横切关注点,,通常情况下,这些横切关注点从概念上是与应用的业务逻辑相分离的。将这些横切关注点与我们的业务逻辑相分离是面向切面编程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;
}
@Override
public 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);
}
@Override
public 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();
}
}