public interface PersonDao {
void savePerson();
}
public class PersonDaoImpl implements PersonDao {
@Override
public void savePerson() {
System.out.println("save person");
}
}
public class Transaction {
void beginTransaction(){
System.out.println("begin Transaction");
}
void commit(){
System.out.println("commit");
}
}
/**
* 静态代理类
* @author qjc
*/
public class PersonDaoProxy implements PersonDao{
PersonDao personDao;
Transaction transaction;
public PersonDaoProxy(PersonDao personDao, Transaction transaction) {
this.personDao = personDao;
this.transaction = transaction;
}
@Override
public void savePerson() {
this.transaction.beginTransaction();
this.personDao.savePerson();
this.transaction.commit();
}
}
/**
* 测试静态代理
* @author qjc
*/
public class TestPersonProxy {
@Test
public void testSave(){
PersonDao personDao = new PersonDaoImpl();
Transaction transaction = new Transaction();
PersonDaoProxy proxy = new PersonDaoProxy(personDao, transaction);
proxy.savePerson();
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 拦截器
* 1、目标类导入进来
* 2、事物导入进来
* 3、invoke完成:开启事务、调用目标对象的方法、事务提交
*
* @author qjc
*/
public class Interceptor implements InvocationHandler {
private Object target; // 目标类
private Transaction transaction;
public Interceptor(Object target, Transaction transaction) {
this.target = target;
this.transaction = transaction;
}
/**
* @param proxy 目标对象的代理类实例
* @param method 对应于在代理实例上调用接口方法的Method实例
* @param args 传入到代理实例上方法参数值的对象数组
* @return 方法的返回值,没有返回值是null
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String methodName = method.getName();
if ("savePerson".equals(methodName)
|| "deletePerson".equals(methodName)
|| "updatePerson".equals(methodName)) {
this.transaction.beginTransaction(); // 开启事务
method.invoke(target); // 调用目标方法
this.transaction.commit(); // 提交事务
} else {
method.invoke(target);
}
return null;
}
}
/**
* 测试jdk动态代理
* @author qjc
*/
public class TestJDKProxy {
@Test
public void testSave(){
/**
* 1、创建一个目标对象
* 2、创建一个事务
* 3、创建一个拦截器
* 4、动态产生一个代理对象
*/
Object target = new PersonDaoImpl();
Transaction transaction = new Transaction();
Interceptor interceptor = new Interceptor(target, transaction);
/**
* 参数一:设置代码使用的类加载器,一般采用跟目标类相同的类加载器
* 参数二:设置代理类实现的接口,跟目标类使用相同的接口
* 参数三:设置回调对象,当代理对象的方法被调用时,会调用该参数指定对象的invoke方法
*/
PersonDao personDao = (PersonDao) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
interceptor);
personDao.savePerson();
}
}
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* CGLIB代理 拦截器
* @author qjc
*/
public class Interceptor implements MethodInterceptor {
private Object target; // 代理的目标类
private Transaction transaction;
public Interceptor(Object target, Transaction transaction) {
this.target = target;
this.transaction = transaction;
}
/**
* 创建目标对象的代理对象
*
* @return
*/
public Object createProxy() {
// 代码增强
Enhancer enhancer = new Enhancer(); // 该类用于生成代理对象
enhancer.setCallback(this); // 参数为拦截器
enhancer.setSuperclass(target.getClass());// 设置父类
return enhancer.create(); // 创建代理对象
}
/**
* @param obj 目标对象代理类的实例
* @param method 代理实例上 调用父类方法的Method实例
* @param args 传入到代理实例上方法参数值的对象数组
* @param methodProxy 使用它调用父类的方法
* @return
* @throws Throwable
*/
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
this.transaction.beginTransaction();
method.invoke(target);
this.transaction.commit();
return null;
}
}
/**
* 测试cglib动态代理
* 通过cglib产生的代理对象,代理类是目标类的子类
* @author qjc
*/
public class TestCglibProxy {
@Test
public void testSave(){
Object target = new PersonDaoImpl();
Transaction transaction = new Transaction();
Interceptor interceptor = new Interceptor(target, transaction);
PersonDaoImpl personDaoImpl = (PersonDaoImpl) interceptor.createProxy();
personDaoImpl.savePerson();
}
}
<bean id="personDao" class="cn.qjc.aop.xml.PersonDaoImpl"></bean> <bean id="transaction" class="cn.qjc.aop.xml.Transaction"></bean> <aop:config> <!-- 切入点表达式 确定目标类 --> <aop:pointcut expression="execution(* cn.qjc.aop.xml.PersonDaoImpl.*(..))" id="perform"/> <!-- ref指向对象就是切面 --> <aop:aspect ref="transaction"> <aop:before method="beginTransaction" pointcut-ref="perform"/> <aop:after-returning method="commit" pointcut-ref="perform"/> </aop:aspect> </aop:config> </beans>
/**
* 测试spring动态代理
* @author qjc
*/
public class TransactionTest {
@Test
public void testSave(){
ApplicationContext context = new ClassPathXmlApplicationContext("cn/qjc/aop/xml/applicationContext.xml");
PersonDao personDao = (PersonDao) context.getBean("personDao");
personDao.savePerson();
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有