之前学习的例子,贴上来供大家共同学习。大家都知道,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();
}
}