SpringAOP动态代理技术自动生成代理类原理演示

  • //如下是自动生成代理类的逻辑演示:
  • 为了解耦合将类的方法单纯在代理类里调用;额外功能都在代理类里实现
  • 代理类的存在的问题就是开发代码量大代码冗余.为了解决这类问题使用AOP动态代理自动生成代理类
  • public interface Man { public void alive();//提供一个接口 }
public class ManImpl implements Man {//提供一个接口的实现类.
//实际情况写service是事务和核心功能一起书写的.为了将核心功能和额外功能区分开解耦合.所以要想办法去分开写核心功能和额外功能比如这里这里的事务
    @Override
    public void alive() {
        System.out.println("duanming:"+new ManImpl().getClass().getSimpleName());//忽略.单纯反射查看短名
    }

}
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class ManB implements MethodInterceptor{//所谓的功能增强类就是额外功能放置的地方

    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {//这里mi就是拿到的目标类的类对象.
        System.out.println("---事务开启前---");
        Object object = mi.proceed();//调用目标对象的目标方法
        System.out.println("---事务开启后---");
        return object;
    }

}
 <bean id="man" class="com.youyi.test6.ManImpl"></bean>
 //将manimpl对象交给spring工厂管理

<bean id="baozhuang" class="com.youyi.test6.ManB"></bean>
 //将增强类交给Spring工厂管理

<aop:config> //这里选择切入点:选择在谁的周围插入. <aop:pointcut id="pc" expression="execution(void com.youyi.test6.ManImpl.alive())"/> //开始组装,确认切入点和功能增强类 <aop:advisor pointcut-ref="pc" advice-ref="baozhuang"/> </aop:config>
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestAOP {
    @Test
    //测试类
    public void test1(){
        //创建spring工厂.beanFactory是所有spring工厂接口和实现类的父接口.
        BeanFactory bf = new ClassPathXmlApplicationContext("classpath:/com/youyi/test6/applicationContext.xml");
        Man man = (Man)bf.getBean("man");//getBean("id")拿到对应的全类名的类的类对象.反射拿出来的.
        System.out.println(man);
        man.alive();//调用方法
    }
}
//这就是控制台的打印结果:
//如下可知.mi.proceed();这个方法加载的也就是所谓的切入点所实际在的位置.
com.youyi.test6.ManImpl@e349529
---事务开启前--- duanming:ManImpl ---事务开启后---

实际开发的时候aop依赖包导包:三个相关依赖包:asm-3.3.1.jar   cglib-2.2.2.jar,com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

对应导入spring开发常见的包

之后搭建环境跟spring类似.区别只是多了这三个依赖包.

 

 

  • SpringAOP对应的开发步骤:
    •   准备目标类
    • 书写增强类
    • 写对应的bean标签
    • 配置自动生成代理所需要的aop:comfig标签
    • 之后新的自动生成的代理类通过getBean(目标类对应的id)获得.
posted @ 2018-12-11 15:28  歌语苳文  阅读(1037)  评论(0编辑  收藏  举报