springAOP理解——java中的proxy实现AOP功能

来源:互联网 发布:gif剪裁软件 编辑:程序博客网 时间:2024/05/17 03:17
 

之前学习的例子,贴上来供大家共同学习。大家都知道,spring的AOP功能实际上是实现了java的动态代理功能,下面分别给出java动态代理、spring中CGLIB实现AOP功能、及spring 中实现AOP的配置(配置文件方式和注解方式)。

 

1.动态代理:在调用接口前,提前对要代理的接口进行拦截,拦截中做一些事,处理后继续调用接口方法,不影响正常逻辑

可用于权限控制

 

2.实现例子(没有列出相关jar)

1接口

package com.mooing.service;

public interface MyService {
 public void save();
 public void findAll();
 public void update();
 public void delete();
}

2实现类

package com.mooing.service;

public class MyServiceImpl implements MyService {

 private String temp = null;

 public MyServiceImpl() {
 }

 public MyServiceImpl(String temp) {
  this.temp = temp;
 }

 public void save() {
  System.out.println("this is save()");
 }

 @Override
 public void findAll() {
  System.out.println("this is findAll()");
 }

 @Override
 public void update() {
  System.out.println("this is update()");
 }

 @Override
 public void delete() {
  System.out.println("this is delete()");
 }

 public String getTemp() {
  return temp;
 }
}

 

3代理类

package com.mooing.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**

为目标对象创建代理类
 * 代理类,需实现InvocationHandle接口
 * @author mooing
 *
 */
public class MyProxyService implements InvocationHandler {

 private Object targetObj;

 /**
  * 为目标对象创建代理类
  *
  * 传入要代理类,创建此类的代理实例
  *
  * @param targetObj 目标对象
  * @return 返回目标对象的代理类
  */ public Object createProxyInstances(Object targetObj) {
  this.targetObj = targetObj;

  /**
   * 参数1 要代理对象的类装载器
   * 参数2 要代理对象的所有接口
   * 参数3 触发哪个类里的拦截方法(回调方法invoke,处理实际调用方法前的操作) this代表当前类
   */

  return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(), targetObj.getClass().getInterfaces(), this);
 }

 /**
  * 回调方法
  */

 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  // MyService ms=(MyService) createProxyInstances(new MyServiceImpl());
  //MyServiceImpl myservice = (MyServiceImpl) targetObj;
  //Object result = null;
 // if (myservice.getTemp() != null) {
  // result = method.invoke(targetObj, args);
  //}
  //return result;

  System.out.println("进入拦截方法");
  return  method.invoke(targetObj, args);
 }
}

 

测试类

package com.mooing.test;

import org.junit.Test;

import com.mooing.service.MyProxyService;
import com.mooing.service.MyService;
import com.mooing.service.MyServiceImpl;

public class MyProxyTest {

 @Test
 public void testJdkProxy() {
  MyProxyService proxy = new MyProxyService();

//代理目的:如果给MyServiceImpl类中temp赋值,则调用接口方法,否则不调用,类似权限控制
  MyService ms = (MyService) proxy.createProxyInstances(new MyServiceImpl("xxx"));
  ms.delete();
 }
}

原创粉丝点击