zoukankan      html  css  js  c++  java
  • 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);
     }
     
    }

  • 相关阅读:
    【转载】消息队列使用的四种场景介绍
    Vue项目部署打包
    创建Vue项目vue-cli · Failed to download repo vuejs-templates/webpack: connect ETIMEDOUT
    数据库错误:ORA-12154
    oracle数据库一条sql语句批量插入数据
    Linux time scap
    winscp不能使用root登录
    Linux find ./ -name *.bak | xargs rm -rf
    Linux命令echo 3 > /proc/sys/vm/drop_caches
    redis查看服务器占用端口
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1961579.html
Copyright © 2011-2022 走看看