在项目中存在例如安全验证,日志文件这类可以独立的横切点的模块,spring的aop将这些横切点封装到一个类中,然后再程序运行期植入到对象中。
spring将默认的aop实现是jdk的动态代理。
横切面关注点:在系统中可以独立的一些模块
切面(aspect):就是将横切面关注点封装到一个类中,那个这个类就是切面,那么这个类就称为切面类。
advice:横切面关注点的实现
advice可以加在目标方法之前,也可加在目标方法之后,或者加在抛异常的地方
pointcut:表示advice的应用范围
织入:把切面应用到目标对象的过程叫做织入
连接点:将切面应用到某些方法中,该方法称为连接点。
target object:真实得实现类
proxy:代理类
introduction:动态的添加方法
如果在类中添加了一些可以独立的服务,那么这个服务就叫做横切性关注点;而将横切性关注点封装到一个类中,那么这个类就称为切面(切面类);在切面类中实现横切性关注点的方法,那么该方法就称为advice,advice可以在目标对象之前执行,或之后执行,或抛出异常时执行,当指定advice应用在spring的哪些方法上即(joinpoint);把切面应用到目标对象的过程叫做织入。
动态代理实例:
UserManager接口:
package com.jzq.spring;
public interface UserManager {
public void addUser(String username,String password);
public void deleteUser(int id);
public void modifyUser(int id,String username,String password);
public String findUserById(int id);
}
UserManager的实现类:UserManagerImpl类:
package com.jzq.spring;
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String username, String password) {
System.out.println("------UserManagerImpl.addUser()-----");
}
@Override
public void deleteUser(int id) {
System.out.println("--------UserManagerImpl.deleteUser()-------");
}
@Override
public String findUserById(int id) {
System.out.println("--------UserManagerImpl.findUser()----------");
return null;
}
@Override
public void modifyUser(int id, String username, String password) {
System.out.println("--------deleteUser()-------");
}
}
动态代理类:
package com.jzq.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SecurityHandler implements InvocationHandler {
private Object targetObject;
public Object newProxy(Object targetObject){
this.targetObject=targetObject;
//创建代理类
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
}
//当创建了代理对象,然后调用代理方法的时候,会默认调用invoke()方法
//所以将横切点的模块方法在invoke中执行
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
checkSecurity();
Object ret=null;
try {
ret=method.invoke(this.targetObject, args);
} catch (Exception e) {
e.printStackTrace();
throw new java.lang.RuntimeException(e);
}
return ret;
}
private void checkSecurity()
{
System.out.println("---------checkSecurity()------------");
}
}
客户端:
package com.jzq.spring;
public class Client {
public static void main(String args[])
{
// UserManager userManger=new UserManagerImpl();
// UserManagerImplProxy proxy=new UserManagerImplProxy(userManger);
SecurityHandler handler=new SecurityHandler();
UserManager userManager=(UserManager)handler.newProxy(new UserManagerImpl());
userManager.deleteUser(1);
}
}