在讲APO之前呢,我们先学习一下代理模式 ,下面引入一个动态代理。
接口:
package com.huxj.spring; public interface UserManager { publicvoid addUser(StringuserName,String password); publicvoid delUser(String userId); publicString findUserById(int userId); publicvoid modifyUser(int userId,String userName,Stringpassword); } 实现类: public classUserManagerImpl implementsUserManager { //1.操作时都要进行安全检查 @Override publicvoid addUser(String userName,String password) { // checkSecurity(); System.out.println("---UserManagerImpl.addUser()----"); } @Override publicvoid delUser(String userId) { // checkSecurity(); System.out.println("---UserManagerImpl.delUser()----"); } @Override publicString findUserById(int userId){ // checkSecurity(); System.out.println("---UserManagerImpl.findUserById()----"); return"zhangsan"; } @Override publicvoid modifyUser(int userId, String userName, Stringpassword) { // checkSecurity(); System.out.println("---UserManagerImpl.modifyUser()----"); } // public void checkSecurity(){ // System.out.println("---checkSecurity----"); // } }
动态代理:
packagecom.huxj.spring; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //动态代理都要事先InvocationHandler public class SecurityHandler implements InvocationHandler { public Object targetObject; public Object createProxyInstance(ObjecttargetObject){ this.targetObject=targetObject; //通过它找到代理类和抽象代理类 returnProxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), this); } @Override public Object invoke(Objectproxy, Method method, Object[] args) throws Throwable { checkSecurity(); //代理根据方法,找到目标对象的方法 Objectret=method.invoke(targetObject, args); return null; } //安全性检查方法 private void checkSecurity() { System.out.println("-------checkSecurity-------"); } }}
客户端:
package com.huxj.spring; public class Client { /** * @param args */ publicstatic void main(String[] args) { // UserManager userManager=newUserManagerImplProxy(); // userManager.addUser("huxj","123456"); SecurityHandler securityHandler=new SecurityHandler(); UserManager userManager=(UserManager)securityHandler.createProxyInstance(newUserManagerImpl()); userManager.addUser("huxj","123456"); } }
它解决了静态代理只能服务于一个特定的接口,也实现了一段代码多次运用的效果;Aop就是采用动态代理实现的。
大家试着理解以下节点,有助于理解AOP.
1. checkSecurity()安全性检查,独立于业务的的一种服务。
2. 它织入各个方法中的位置,在动态代理类中它放到method.invoke之前,所以先检验在执行业务代码
3. 在这里它在动态代理类中,为的是横切程序,实现代码的一处多用。
4. 它需要遍布到程序很多地方,在这里就是UserManagerImpl类中所有的方法。它需要服务的类(范围),需要根据目标对象来决定。也就是该服务作用的范围。
5. UserManagerImpl中要服务的方法如:addUser(),delUser()
总结:
对于动态代理呢,就不做过多的解释,因为在其他博客中已经总结。以上五点有助于我们理解OAP。 若想继续,敬请下回。