spring --AOP

给你一囗甜甜゛ 提交于 2020-03-20 06:44:42

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!