首先要有一个借口,一个实现类,
此例子,是为了更加形象化的理解spring动态代理,而且,把相同的check,相同的功能,大众需要的功能模块化,横切到其他处理类当中.
=====================接口===========
package manager;
public interface UserManager {
public void addUser(String userName,String password);
public void deleteUserById(int id);
public String findUserById(int id);
public void modifyUser(int id,String userName,String password);
}
==================实现=====================
package managerImpl;
import manager.UserManager;
public class UserManagerImpl implements UserManager {
public void addUser(String userName, String password) {
System.out.println("===UserManagerImpl==addUser==");
}
public void deleteUserById(int id) {
System.out.println("===UserManagerImpl==deleteUserById==");
}
public String findUserById(int id) {
System.out.println("===UserManagerImpl==findUserById==");
return null;
}
public void modifyUser(int id, String userName, String password) {
System.out.println("===UserManagerImpl==modifyUser==");
}
}
=========动态代理类====这就是切面,可以模块儿化的共同需要的方法,以减耦合的方式,切入到所需要的程序中=============
package proxy;
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);//this是此方法要传递一个实现了invocationHandler的类,本类就实现了.所以传this就可以
}
//横切类
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
SecurityCheck();//织入的,横切的类
Object ref = null;//声明此变量,是为了目标对象的类的返回值.因为不知道目标对象到底有无返回值.
try {
ref = method.invoke(this.targetObject, args);//调用真实实现,第一个参数为目标对象,第二个为目标对象的方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new java.lang.RuntimeException(e);
}
return null;
}
//此方法在AOP中叫advice,也就是说advice是切面中的处理类
public void SecurityCheck(){
System.out.println("=======CheckUser====");
}
}
================测试类=======================
package test;
import manager.UserManager;
import managerImpl.UserManagerImpl;
import proxy.SecurityHandler;
public class testUserManager {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SecurityHandler securityHandler = new SecurityHandler();
//传入目标对象new UserManagerImpl(),就返回一个代理对象
UserManager userManager =(UserManager)securityHandler.newProxy(new UserManagerImpl());
userManager.addUser("", "");
}
}