关于Spring的AOP容器的简单理解

来源:互联网 发布:tk免费域名注册 编辑:程序博客网 时间:2024/05/21 17:58
AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。比如说日志、安全、缓存等那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码


AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”


代理的两种方式:
1、静态代理

 针对一个接口编写一个代理类

/**  * 代理类和目标做的事情是一样的,所以实现相同的接口.  * @author Summer  *  */  public class UserManagerImplProxy implements UserManager {        //目标引用.      private UserManager userManager;            //通过构造方法传递过来.      public UserManagerImplProxy(UserManager userManager)      {          this.userManager = userManager;      }      @Override      public void addUser(String username, String password) {            checkSecurity();          userManager.addUser(username, password);      }        @Override      public void delUser(int userId) {          // TODO Auto-generated method stub            checkSecurity();          userManager.delUser(userId);      }        @Override      public String findUserById(int userId) {            checkSecurity();          return userManager.findUserById(userId);      }        @Override      public void modifyUser(int userId, String username, String password) {            checkSecurity();          userManager.modifyUser(userId, username, password);                }            private void checkSecurity()      {          System.out.println("------------UserManagerImpl.checkSecurity()----");      }    } 




2、动态代理
1)实现InvocationHandler接口
2)通过反射和产生动态代理的类 java.lang.refect.Proxy为各种接口动态生成相应的代理类
3)重写invoke方法

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 createProxyInstance(Object targetobject)      {          this.targetObject = targetobject;          //根据目标生成代理.          //代理是对接口来说的,是拿到目标的接口.拿到这个接口,实现这个接口.          //targetobject这个目标类实现了哪个接口.          //返回代理.           return Proxy.newProxyInstance(targetobject.getClass().getClassLoader(),                  targetobject.getClass().getInterfaces(), this);      }                  @Override      public Object invoke(Object proxy, Method method, Object[] args)              throws Throwable {                    //检查安全性.          checkSecurity();                    //当前方法,调用目标对象的方法.          //调用目标方法.          Object ret =  method.invoke(targetObject, args);                    return ret;      }          //检查安全性.      private void checkSecurity()      {          System.out.println("------------UserManagerImpl.checkSecurity()----");      }    }  
参考文章一

参考文章二