spring--day02笔记

发布时间 : 星期日 文章spring--day02笔记更新完毕开始阅读

1.3.2 字节增强CGLIB:实现类

? 字节码增强:cglib、javaassist

? CGLIB : 核心jar:cglib-....jar 依赖jar:asm...jar

1.3.2.1 目标类

//目标类,没有接口 public class BookService{ public void addBook() { System.out.println(\); } public void updateBook() { System.out.println(\); } } 1.3.2.2 切面类

/** * 切面类:提供多个通知(advice),通知就是用于增强代码 * @author * */ public class MyAspect { public void before(){ System.out.println(\开启事务\); } public void after(){ System.out.println(\提交事务\); } } 1.3.2.3 工厂

public class MyBeanFactory { //使用cglib 创建代理类,目标类没有接口。 // * cglib动态的创建目标类的子类 // *** 目标类本身不能为final,public final class BookService{ ,在定义 // *** 但目标类实例可以时final,final BookService bookService = new BookService(); ,在使用。 // * cglib的使用,类似jdk动态代理, cglib的MethodInterceptor接口 等效与 jdk InvocationHandler接口 public static BookService getBean() { //1 目标类 final BookService bookService = new BookService(); //2 切面类(通知) final MyAspect myAspect = new MyAspect(); //3 代理类 // 3.1 创建核心类 Enhancer enhancer = new Enhancer(); // 3.2 确定代理类父类 ,及目标类 enhancer.setSuperclass(bookService.getClass()); // 3.3 编写回调--执行 enhancer.setCallback(new MethodInterceptor(){ //前3个参数与jdk相同 @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //1 执行通知--开启 myAspect.before(); } } //2 执行目标类方法 Object obj = method.invoke(bookService, args); // 执行的时代理类的父类,及目标类 methodProxy.invokeSuper(proxy, args); //3 执行通知--提交 myAspect.after(); return obj; }}); // 3.4 创建代理类 return (BookService)enhancer.create(); 1.3.2.4 测试

public class TestApp { @Test public void demo01(){ //自己创建实例 BookService bookService = new BookService(); bookService.addBook(); bookService.updateBook(); } @Test public void demo02(){ //spring创建实例,及工厂创建。 BookService bookService = MyBeanFactory.getBean(); bookService.addBook(); bookService.updateBook(); } }

1.3.3 总结

? spring生产代理时,如果有接口+实现类,spring底层使用动态代理。

? spring生产代理时,如果只有实现类,spring底层使用cglib。 ?

1.4 spring 代理工厂

? ? ?

让spring生产代理类,代理类目的:对目标类进行增强。 代理类将 目标类 与 切面类中通知结合在一起。

spring执行通知时,不能确定具体执行哪个方法,于是提供通知类型,确定执行的方法名称。 存在一个组织 aop联盟alliance规定aop规范,spring 支持aop规范。 aop联盟定义 通知类型:5种

前置通知:目标方法之前,接口:MethodBefoerAdvice 后置通知:目标方法之后,接口:AfterReturningAdvice 环绕通知:目标方法前后,接口:MethodInterceptor【】 抛出通知:目标方法异常,接口:ThrowsAdvice

引介通知:目标类添加方法或字段,接口:IntroductionInterceptor(了解)

//环绕 try{ //前 ---前置 //目标方法 //后 ---后置 } catch(e ){ //抛出 } 1.4.1 导入jar

? 核心jar:core、beans、context、expression、logging ? aop规范:aop-alliance ? aop实现:aop

联系合同范文客服:xxxxx#qq.com(#替换为@)