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

  • 相关阅读:
    在SharePoint 2010中创建网站的权限级别
    SharePoint 2013 Pop-Up Dialogs
    SharePoint 2010 Pop-Up Dialogs
    sharepoint 2010 页面添加footer方法 custom footer for sharepoint 2010 master page
    Using SharePoint 2010 dialogs
    Spring Security
    mysql优化
    memcached缓存技术
    网页静态化技术
    最小生成树
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1961579.html
Copyright © 2011-2022 走看看