//如下是自动生成代理类的逻辑演示:
为了解耦合将类的方法单纯在代理类里调用;额外功能都在代理类里实现
代理类的存在的问题就是开发代码量大代码冗余.为了解决这类问题使用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; }
}
//将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"/> 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)获得.