技术开发 频道

让Spring架构减化事务配置


    类型自动代理创建器BeanClassTypeAutoProxyCreator 
    得于BeanNameAutoProxyCreator的启示,BeanNameAutoProxyCreator可以实现框架来实现自动代理。它只是把需要代理的bean加入beanNames属性列表。大大的简化了代理的配置,减少了代理bean的定义,使用事务bean注入业务对象,而不是代理bean注入,更合乎事务逻辑。BeanNameAutoProxyCreator仍然需要开发人员除了定义业务bean外,还需要关心事务的定义,当然已经简单了很多。如果能实现一个BeanClassTypeAutoProxyCreator,为它指定一个可以代理的ClassType列表,那么在context中所有属于ClassType和其子类的bean都自动获得代理。

    实现思路: 
    1.BeanNameAutoProxyCreator继承了AbstractAutoProxyCreator,去实现方法:
    protected abstract Object[] getAdvicesAndAdvisorsForBean(
    Class beanClass, String beanName, TargetSource customTargetSource)
    在BeanNameAutoProxyCreator中的实现是判断beanName 是存在于beanNames列表,如果能找到则Object[]不对空。否则返回null。
     所以BeanClassTypeAutoProxyCreator也应该继承AbstractAutoProxyCreator。
     getAdvicesAndAdvisorsForBean方法的实现可以参照BeanNameAutoProxyCreator方法的实现
    2.BeanClassTypeAutoProxyCreator需要有一个进行代理的ClassType列表,在bean进行初始化后就在context中查找类型为 ClassType列表中类型的所有beanName.从而获得一个beanNames列表。
    获得beanNames列表后就可以像BeanNameAutoProxyCreator一样实现自动代理了。
    3.要想获得当前context,我们可以实现ApplicationContextAware接口。让BeanClassTypeAutoProxyCreator的bean可以获得当前context.
    4. 要在bean进行初始化动作,可以实现InitializingBean接口,实现afterPropertiesSet,在这个方法中在context中根据classType查找获得相关的beanName的列表。
    5. 写一个空接口,里面没有任何方法。需要事务代理的类实现这个空接口。

    这样,只需要把这个空接口的全类名作为BeanClassTypeAutoProxyCreator的classTypes参数值,然后所有需要代理的类都去实现这个接口就可以自动获得代理了。无再需要任何配置。这样就可以让程序员专心于业务逻辑的开发,而无需要去关心事务控制方法,就像是没有使用事务一样。
0
相关文章