Spring动态代理的两种方式
总结
一个典型的动态代理创建对象过程可分为以下四个步骤:
1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
为了简化对象创建过程,Proxy类中的newProxyInstance方法封装了2~4,只需两步即可完成代理对象的创建。
生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args))
cglib动态代理是生成被代理类的子类,并覆盖其中方法进行增强。
深入理解事务--Spring事务的传播机制
Spring service本类中方法调用另一个方法事务不生效问题
spring事务传播机制实例讲解
事务嵌套:两个事务方法之间相互调用。同一个类中的方法调用事务方法不生效,是因为事务切面。
通过spring注入的类是代理类,代理类会有事务切面,但是原来的类只是普通的类,调用它的方法就只是简单执行它的方法而已。spring默认情况下会对uncheck异常(运行时异常)进行事务回滚;checked不回滚。
改变默认规则
rollbackFor=Exception.class
notRollbackFor=-
事务传播属性