基于接口和基于子类的动态代理
Posted zou-rong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于接口和基于子类的动态代理相关的知识,希望对你有一定的参考价值。
一:基于接口(JDK1.3之后提供):
import com.aiitec.service.IAccountService;
import com.aiitec.utils.TransactionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class AccountServiceFactory {
@Autowired
@Qualifier("accountService")
private IAccountService service;//被代理对象,必须实现至少一个接口
@Autowired
private TransactionManager transactionManager;//事务控制器
/**
* 获取代理对象
* @return
*/
public IAccountService getProxy() {
return (IAccountService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=null;
try{
transactionManager.beginTransaction();
System.out.println("前置通知生效。。。");
result=method.invoke(service,args);
transactionManager.commit();
System.out.println("后置通知生效。。。");
}catch (Exception e){
transactionManager.rollback();
System.out.println("异常通知生效。。。");
throw new RuntimeException(e);
}finally {
transactionManager.relese();
System.out.println("最终通知生效。。。");
}
return result;
}
});
}
}
配置spring的IOC:
<!--配置基于接口的动态代理对象,工厂方法创建-->
<bean id="serviceProxy" factory-bean="accountServiceFactory" factory-method="getProxy"></bean>
<bean id="accountServiceFactory" class="com.aiitec.proxy.AccountServiceFactory"></bean>
使用:
@Autowired
@Qualifier("serviceProxy")
private IAccountService ccountService;
一:基于子类(第三方Cglib提供):
先导包
<!--cglib基于子类的动态代理-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_3</version>
</dependency>
import com.aiitec.service.impl.AccountServiceCglib;
import com.aiitec.utils.TransactionManager;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
public class AccountServiceCglibFactory {
@Autowired
private AccountServiceCglib accountServiceCglib;//被代理对象,必须不是final类
@Autowired
private TransactionManager transactionManager;
/**
* 获取代理对象
* @return
*/
public AccountServiceCglib getProxy() {
return (AccountServiceCglib) Enhancer.create(accountServiceCglib.getClass(), new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object result=null;
try{
transactionManager.beginTransaction();
System.out.println("cglib前置通知生效。。。");
result=method.invoke(accountServiceCglib,args);
transactionManager.commit();
System.out.println("cglib后置通知生效。。。");
}catch (Exception e){
transactionManager.rollback();
System.out.println("cglib异常通知生效。。。");
throw new RuntimeException(e);
}finally {
transactionManager.relese();
System.out.println("cglib最终通知生效。。。");
}
return result;
}
});
}
}
配置spring的IOC:
<!--配置基于子类的动态代理对象,工厂方法创建-->
<bean id="serviceCglib" factory-bean="accountCglibFactory" factory-method="getProxy"></bean>
<bean id="accountCglibFactory" class="com.aiitec.proxy.AccountServiceCglibFactory"></bean>
使用:
@Autowired
@Qualifier("serviceCglib")
private AccountServiceCglib serviceCglibProxy;
以上是关于基于接口和基于子类的动态代理的主要内容,如果未能解决你的问题,请参考以下文章