我有一个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并且可能只是属性文件。
我需要一种方法来读取提供的包名称,然后在应用程序上下文中调用组件扫描。任何帮助都非常感谢。
感谢。
答案 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>