AOP入门一

在讲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。 若想继续,敬请下回。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值