技术开发 频道

在Spring 2.0中集成AspectJ



    ③ 以下表示织入器略过不在目标范围内的类
INFO [main] (AspectJWeaverMessageHandler.java:55) - [AspectJ] not weaving 'org/springframework/context/support/ClassPathXmlApplicationContext'

    ④ 领域对象的信息
    title:测试的主题;
    topic:title:测试帖子;content:测试内容
    查看以上的信息,我们发现④处输出的领域信息是我们在Spring IoC容器中配置的信息,可见我们通过new Thread()创建的领域对象,其实已经从Spring IoC容器中获取到对应的Bean了。
这个过程参与的角色比较多,关系错踪复杂,我们有必须对这一过程重新进行梳理,找出角色间的关系和参与的操作,请看下图:



    AspectJ LTW织入器(aspectjweaver.jar)根据aop.xml中配置信息,在类加载期将切面类  (AnnotationBeanConfigurerAspect)织入到标注@Configurable的类(Thread和Topic)中。
    Spring IoC容器中配置了AnnotationBeanConfigurerAspect,使其可以感知Spring IoC容器,此外,Spring还为标注了@Configurable的类配置了对应的Bean。这样,Thread和Topic通过new实例化对象时,其实是通过AnnotationBeanConfigurerAspect从容器中获取实例。

    在这一过程中,我们有两个问题需要进一步说明:第一,AnnotationBeanConfigurerAspect是静态的类,也即一个ClassLoader对应一个实例;第二,AnnotationBeanConfigurerAspect通过类反射机制获取Thread和Topic的类全限定名:com.baobaotao.configure.Thread和com.baobaotao.configure.Topic,并用这个名称到Spring IoC容器中获取对应的Bean,因为如果配置时未指定Bean的名字,Spring使用类的全限定类作为Bean的名字。如果你希望采用命名的Bean,则需要在@Configurable中指定Bean的命名,如@Configurable(“thread”)。

    小结

    Spring 2.0对AOP进行了很大的改善,除了提供基于@ApsectJ和Schema的切面定义外,还允许集成AspectJ,即使用AspectJ切面织入功能,又可以通过Spring IoC管理切面类和目标类。所以,只要你愿意,完全可以使用AspectJ进行切面定义,而使用Spring 2.0进行Bean的管理。究竟如何选择,最好从实际项目的需要出发,以最Progaramtic的方式选择其中最简单最适合的方式。

0
相关文章