@DeclareParents为某个类及其所有子类动态代理新增实现接口
来源:互联网 发布:ubuntu输入法怎么用 编辑:程序博客网 时间:2024/06/05 21:49
通过spring aop 的@DeclareParents注释可以为某个类及其所有子类(这些子类必须为非 final 类,并且能够被注册为bean 即要么有默认构造函数(默认构造函数也是静态的),要么有静态工厂方法)动态代理新增实现接口,从而达到为该类及其所有子类新增方法的目的。java语言的运行必须先经过编译才能运行,所以是不可能在运行时添加新的方法的,除非改变源代码,在父类中添加方法然后再编译。但有些时候我们没有办法得到某些类的源代码,比如已经封装好了的jar文件里面的类。但是由于业务需要,需要为这些类的对象添加新的功能,我们虽然不能改变该类的源代码,但是我们可以为这个类及其子类利用spring aop创建一个代理。让代理来做我们需要扩展的方法(关于代理,读者可以看看我前面关于动态代理的博文)。
本文将对我们常用的事务管理器进行增强,
1在xml中注册事务管理器
<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>
2 新建一个事务管理器增强接口TransactionManagerService 即其一个实现类DefaultTransactionManagerService
public interface TransactionManagerService {/** * 事务管理器的增强方法 * @return */String enhanceByAop();}public class DefaultTransactionManagerService implements TransactionManagerService {@Overridepublic String enhanceByAop() {return "我被Spring aop增强了,在增强方法里面,不能条用this来代替事务管理器,即增强方法不能依赖被增强对象";}}
3 新建一个TransactionManagerAspect 切面类
@Aspect@Componentpublic class TransactionManagerAspect {@DeclareParents(value="org.springframework.transaction.support.AbstractPlatformTransactionManager+",defaultImpl=DefaultTransactionManagerService.class)public TransactionManagerService iss;}4 在一个controller 中调用事务管理器的增强方法
@RestController@RequestMapping("/login")public class LoginController {@Autowiredprivate DataSourceTransactionManager transactionManager;@RequestMapping("login")public String login(String name,String password) throws FileNotFoundException{TransactionManagerService iss = (TransactionManagerService) transactionManager; //将事务管理器强转为我们定义的增强接口System.out.println(iss.enhanceByAop());return "login";}}
5 在xml文件中注册 自动代理
<aop:aspectj-autoproxy proxy-target-class="true" />
当然第5步也可以使用 java config的方式进行自动代理,只需要新建一个TransactionManager类即可,具体实现如下,类不用认可实现只需要写两个注释即可
@Configuration@EnableAspectJAutoProxypublic class TransactionManagerConfig {}
阅读全文
0 0
- @DeclareParents为某个类及其所有子类动态代理新增实现接口
- Java动态获取某个接口下所有的实现类对象集合
- JDK的动态代理为什么要实现所有的接口?
- 获取实现某个接口的所有实现类集合
- C#——找出实现某个接口的所有类
- UI组件之AdapterView及其子类关系,Adapter接口及其实现类关系
- java动态代理--代理接口无实现类
- java动态代理--代理接口无实现类
- java动态代理--代理接口无实现类
- Map接口及其子类
- LIST接口及其子类
- java中,一个类实现某个接口,必须重写接口中的所有方法吗???
- Java中,一个类实现某个接口,必须重写接口中的所有方法吗
- java中,一个类实现某个接口,必须重写接口中的所有方法吗???
- java中,一个类实现某个接口,必须重写接口中的所有方法吗???
- java中,一个类实现某个接口,必须重写接口中的所有方法吗?
- JAVA-获取实现了指定接口类的所有实现类或继承了指定类的所有子类
- JAVA获取同一路径下所有子类或接口实现类
- 一秒搞定合并单元格编号
- XML中必须进行转义的字符
- LSTM学习笔记
- DB2函数
- DB2 -803等错误码对照
- @DeclareParents为某个类及其所有子类动态代理新增实现接口
- Linux下编译php与nginx进行通信
- TCP Keepalive Timer
- BZOJ1821:[JSOI2010]Group 部落划分 Group
- 安装Angular-Cli以及失败原因解决(Angular4.0)
- Android中Sqlite的创建与使用
- Maven提高篇系列之(一)——多模块 vs 继承
- 动态添加Textview+点击变色
- Hdu 5943 Kingdom of Obsession【素数+二分匹配】