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);
     }
     
    }

  • 相关阅读:
    Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptor
    Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
    IdentityServer4 And AspNetCore.Identity Get AccessToken 问题
    Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute
    Java Spring Boot VS .NetCore (七) 配置文件
    Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml
    Java Spring Boot VS .NetCore (五)MyBatis vs EFCore
    Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
    Java Spring Boot VS .NetCore (三)Ioc容器处理
    Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1961579.html
Copyright © 2011-2022 走看看