目标接口
package com.pactera.dao;
public interface IUserDao {
void save();
}
目标对象
package com.pactera.daoImpl;
import com.pactera.dao.IUserDao;
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("userDao save()");
}
}
代理工厂
package com.pactera.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
//接收传入的目标对象
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
//根据传入的目标对象,给目标生成一个代理对象
public Object createProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),//获取默认的类加载器
target.getClass().getInterfaces(), //获取目标对象实现的所有接口数组
new InvocationHandler() {
/**
* 参数1:生成的代理对象
* 参数2:当前接口执行的方法
* 参数3:方法参数对应的数组
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//获取方法的名称
String methodName = method.getName();
if("save".equals(methodName)){//只对save方法进行事务控制
System.out.println("----模拟事务开启----");
Object methodReturnValue = method.invoke(target, args);
System.out.println("----模拟事务关闭-----");
return methodReturnValue;
}
return method.invoke(target, args);
}
});
}
}
测试
@Test
public void testIOC(){
UserDao userDao = new UserDao();
//jdk自动去实现了目标对象的接口,所有能用接口接收
IUserDao proxy = (IUserDao) new ProxyFactory(userDao).createProxyInstance();
proxy.save();
}
结果
----模拟事务开启----
userDao save()
----模拟事务关闭-----