@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
原创粉丝点击