动态代理类 被代理对象必须有接口 ,返回的代理对象 usProxy instanceof UserServiceImpl == true
返回传入对象的代理对象,实现对被代理对象添加事务控制
package com.lzj.service;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.lzj.service.Impl.UserServiceImpl;
public class UserServiceProxyFactory implements InvocationHandler{
private UserService us;
public UserServiceProxyFactory(UserService us) {
this.us = us;
}
public UserService getUserServiceProxy(){
//生成动态代理
UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
UserServiceImpl.class.getInterfaces(), this);//this是InvocationHandler接口实现该对象 传入this,也可以使用匿名内部实现接口
//返回生成的代理对象
return usProxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前打印");
//需要传入一个proxy对象
Object invoke = method.invoke(us, args);
System.out.println("代理后打印");
return invoke;
}
}
cglib代理
package com.lzj.service;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import com.lzj.service.Impl.UserServiceImpl;
public class UserServiceCglibProxy implements MethodInterceptor {
public UserService getUserService() {
Enhancer en = new Enhancer();// 帮我们生成代理对象
en.setSuperclass(UserServiceImpl.class);// 设置对谁进行代理
en.setCallback(this);// 代理要做什么
UserService us = (UserService) en.create();// 创建代理对象
return us;
}
@Override
public Object intercept(Object prxoyobj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
//打开事务
System.out.println("打开事务!");
//调用原有方法
Object returnValue = methodProxy.invokeSuper(prxoyobj, arg);
//提交事务
System.out.println("提交事务!");
return returnValue;
}
}