1

我尝试在我的项目中使用 spring weblogic LTW 来做一些 aop 的东西。我的项目是一个简单的 webapp servlet2.5,使用 spring mvc 3.2.6,在 weblogic 10.0 上运行。我在 web.xml 中有以下应用程序级别的配置设置

@Configuration
@EnableLoadTimeWeaving
public class AppConfig {

}


@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = { "com.blabla.model" })
public class CoreConfig {
}

我的 web.xml 中还有一个 mvc 级别的配置设置

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.blabla.controller" })
public class MVCConfig extends WebMvcConfigurerAdapter {
}

这是我的简化 web.xml

    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>AppConfig,CoreConfig
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
            </param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>MVCConfig
            </param-value>
        </init-param>
        <init-param>
            <param-name>wl-dispatch-policy</param-name>
            <param-value>RestWorkManager</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

所以发生的事情是,MVCConfig它的扫描组件都是由 LTW 编织的,效果很好。但是LTW 并没有接收到CoreConfig它扫描的组件(所有 DAO) 。

我猜CoreConfigandAppConfig处于同一级别,所以当AppConfig andCoreConfig被加载时,LTW 还没有被触发。

我试图把它放在与LTWCoreConfig相同的级别MVCConfig,它被 LTW 拾取。

CoreConfig应该是应用程序级别,而不是 dispatchservlet 级别。由于许多 Spring Web MVC 应用程序为 DispatcherServlet 使用根上下文和子上下文。

所以我的问题是,如果我放入CoreConfig应用程序级别,如何让 LTW 拿起它?谢谢。

4

1 回答 1

4

Loadtimeweaving 仅适用于类加载器尚未加载的类。

现在,当使用 XML 配置时,实际的 bean 类是在加载时间编织启用后加载的,因此它或多或少对所有类都完美无缺。

使用 Java Config,只要@Configuration注解类被加载,类就会被加载。所有导入的类都被加载到类加载器中。在此加载时间之后启用编织,但仅适用于将在此之后加载的类。

因此,它适用于为 指定的配置加载的类DispatcherServlet,因此ContextLoaderListener.

@ComponentScan您可以尝试的一件事是@ConfigurationAppConfig. 并让ContextLoaderListener唯一加载AppConfig. 这可能会稍微延迟类加载,直到启用加载时间编织之后。

肯定会起作用的方法是将两个配置类都放在 XML 中,删除@EnableLoadTimeWeavingforAppConfig并使用<context:load-time-weaving />.

于 2014-03-02T20:46:06.380 回答