• spring AOP


    在项目中存在例如安全验证,日志文件这类可以独立的横切点的模块,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);
     }
     
    }

  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1961579.html
Copyright © 2020-2023  润新知