packagesToScan在Spring配置中

时间:2014-05-09 18:11:44

标签: java spring-mvc spring-3

我有一个spring 3.2应用程序,其中基于注释的配置文件如下:

@Configuration
@EnableWebMvc
@Profile("production")
@ComponentScan(basePackages = {"com.mypackage"})
@PropertySource({"classpath:myproperty.properties"})
public class WebConfig extends WebMvcConfigurationSupport{

    @Override
    protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {                configurer.favorPathExtension(false).favorParameter(true).parameterName("mediaType").ignoreAcceptHeader(true).useJaf(false)
        .defaultContentType(MediaType.APPLICATION_JSON).mediaType("xml", MediaType.APPLICATION_XML)
        .mediaType("json", MediaType.APPLICATION_JSON);
    }

    @Bean(name = "appProperty")
    public static PropertySourcesPlaceholderConfigurer appProperty() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

我试图提供一些灵活性,这正是意味着这个应用程序的用户可以开发一个spring组件并将其打包在一个jar中(包名可以是任何东西,但是所有组件类都扩展了我的应用程序中的一个类)。我想了解如何使新组件的发现可行?用户肯定无法更改我的应用程序代码中的任何内容,他可以访问web.xml并且可能只是属性文件。

我需要一种方法来读取提供的包名称,然后在应用程序上下文中调用组件扫描。任何帮助都非常感谢。

感谢。

1 个答案:

答案 0 :(得分:0)

我找到了另一个适合我的解决方案,写给其他可能面临同样问题的人。

假设我想插入名为TestExtractorFactory的新组件。然后我们需要编写两个类,一个带注释@Configuration,组件是一个简单的POJO(不是弹簧组件)。

以下是两个类:

package com.test.extractor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TestConfig {

    @Bean(name="testExtractorFactory")
    public TestExtractorFactory testExtractorFactory(){
        return new TestExtractorFactory();
    }
}

这是实际的组件:

package com.test.extractor;
public class TestExtractorFactory  extends ExtractorFactory{

    public TestExtractorFactory() {
        super("TESTEX");
    }

    // write other methods you want and your framework requires.

}

无需担心ExtractorFactory是什么。新组件从ExtractorFactory

扩展而来

如何启用@ComponentScan,我们只需将其添加到web.xml中,如下所示:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>com.framework.config.WebConfig,
         com.test.extractor.TestConfig
    </param-value>
</context-param>