从加载时编织器到编译时编织器在Spring中的问题

时间:2012-10-12 06:53:03

标签: spring dependency-injection classloader aspectj compile-time-weaving

我正在尝试使用Spring 2.5应用程序从加载时编织更改为编译时编织。

为此,我做了以下事情:

  1. 在我的ant构建文件中,我添加了

    <path id="aspectPath">
        <pathelement location="${lib.home}/spring-aspects.jar"/>
    </path>
    
    <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
        <classpath>
            <pathelement location="${aspectj.home}/aspectjtools.jar"/>
        </classpath>
    </taskdef>
    
  2. 并用以下

    替换了对javac编译器的引用
        <iajc sourceroots="${src.home}" 
            destdir="${build.home}/WEB-INF/classes" 
            classpathRef="compile.classpath" 
            aspectPathRef="compile.classpath" 
            debug="${compile.debug}" 
            deprecation="${compile.deprecation}" 
            encoding="cp1252" 
            source="1.6" 
            target="1.6" 
            showWeaveInfo="${compile.debug}"/>
    

    在applicationContext.xml中,我然后替换了

    <context:load-time-weaver/>
    

    <context:spring-configured/>
    

    我的应用上下文文件BTW中的其他配置设置包括

    <tx:annotation-driven/>
    <context:component-scan base-package="com.domain.somepackage"/>
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    

    在context.xml文件中,我从loader标记

    中删除了以下内容
    loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
    

    当我运行构建脚本时,它编译时没有错误。

    但我确实收到了这个警告。

    [iajc] warning at <Unknown>::0 Found @DeclareAnnotation while current release 
    does not support it (see 'org.aspectj.weaver.bcel.AtAjAttributes') 
    

    位于顶部,此警告位于底部:

    [iajc] warning at C:\server-
    lib\aspectjtools.jar!org\aspectj\ajdt\internal\compiler\
    CompilerAdapter.class:121::0 advice defined in    
    org.aspectj.ajdt.internal.compiler.CompilerAdapter has not been 
    applied [Xlint:adviceDidNotMatch]
    

    大多数日志记录如下:

    [iajc] weaveinfo Join point 'method-execution(void com.kjconfigurator.upgra
    de.Upgrade1_07HelperImp.addServiceParticipation(com.kjconfigurator.core.domain.U
    ser, com.kjconfigurator.core.domain.ServiceAccount))' in Type 'com.kjconfigurato
    r.upgrade.Upgrade1_07HelperImp' (Upgrade1_07HelperImp.java:196) advised by after
    Returning advice from 'org.springframework.transaction.aspectj.AnnotationTransac
    tionAspect' (spring-aspects.jar!AbstractTransactionAspect.class:77(from Abstract
    TransactionAspect.aj))
    

    我从tomcat lib中删除了tomcatspringweaver jar。 我正在使用aspectj1.7

    当我启动应用程序时,我收到一个错误,指示当dao类被注入服务类时,org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:104)中有一个NPE < / p>

    Caused by: org.springframework.beans.PropertyBatchUpdateException; nested
    PropertyAccessExceptions (1) are: PropertyAccessException 1: 
    org.springframework.beans.MethodInvocationException: Property 'dao' threw exception; 
    nested exception is java.lang.NullPointerException
    

    Dao类扩展了一个如下所示的AbstractJpaDao类:

    public abstract class AbstractJpaDao<T>  {
        private static Logger log = Logger.getLogger(AbstractJpaDao.class.getName());
    
        private EntityManager entityManager;
    
        @PersistenceContext
        public void setEntityManager(EntityManager entityManager) {
            this. entityManager = entityManager;
        }
        ...
    }
    

    由于所有这些都是最初设置的,所以这已经很长时间了,我不记得所有的配置是如何工作的。我也不太了解类加载器或AspectJ。但事情并没有正确发生,也许Entitymanager因某些原因没有被注入。

    问题。

    1. 可能导致这种情况的原因是什么?
    2. 真的需要<context:spring-configured/>吗?
    3. <context:component-scan base-package="com.domain.somepackage"/>引用的包不包含相关的Dao类。当我添加另一个带有dao包的组件扫描标签时,没有任何不同的事情发生。这有必要吗?

2 个答案:

答案 0 :(得分:0)

您是否在某处定义了任何计划任务 - 听起来就像在Spring上下文完全初始化之前触发了计划任务。

答案 1 :(得分:0)

我终于在Spring顾问的帮助下找到了解决这个问题的方法。

在完全初始化之前,有一个方面被调用,导致方面的NPE。 (Eclipse错误地显示NPE源自正在被建议的类。)我通过删除注释禁用了方面,因为方面并不重要;但是,一个更好的解决方法是让我指示Spring在其他类之前初始化该类,或者使用更窄的点切割表达式并排除setter方法。