zoukankan      html  css  js  c++  java
  • 基于接口和基于子类的动态代理

    一:基于接口(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;
  • 相关阅读:
    python pandas写入excel文件
    Ubuntu Teamviewer安装使用
    Ubuntu18.04 有线无法正常上网(请读完全文再进行操作)
    2019/4/5 python正则表达式的中文文档
    2019/4/3 Python今日收获
    2019/3/28 Python今日收获
    2019/3/15 Python今日收获
    2019/3/9 Python今日收获
    2019/2/26 Python今日收获
    2019/2/19 Python今日收获
  • 原文地址:https://www.cnblogs.com/zou-rong/p/12001345.html
Copyright © 2011-2022 走看看