如何以编程方式配置@ComponentScan?

时间:2014-08-01 00:11:21

标签: java spring-mvc

想要找到以编程方式设置“@componentScan”的“basepackages”的方法。

我有类似的东西:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "cl.pagefoo.controller")
public class MyConfig extends WebMvcConfigurerAdapter{
    ...
}

我想要类似的东西:

class foo extends Something{
    void init(SomethingContext sc) throws Exception{
          sc.setComponentScan("cl.pagefoo.controller");
    }
}

我想找到这个允许在运行时配置控制器包的理论“某事物”类。

2 个答案:

答案 0 :(得分:3)

您可以使用WebApplicationInitializer以编程方式创建应用程序上下文。

public class Initializer implements WebApplicationInitializer {

   public void onStartup(ServletContext servletContext)
        throws ServletException {
       AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();

       ctx.scan("com.package.name");
       //the rest of initialization
    }

 }

这是配置Web应用程序的另一种方法,因此您不再需要web.xml

更多阅读: http://www.intertech.com/Blog/how-to-use-springs-webapplicationinitializer/

答案 1 :(得分:0)

您有几个选择:

0.1。您实际上可以指定占位符:

@ComponentScan(basePackages = "${mypackages}")
public class MyConfig {
    ...
}

但是,您必须尽早填充占位符值,最好通过系统属性(-Dmypackages=somepackage)来填充

0.2。如果您的软件包名称数量有限,可以尝试使用Spring配置文件

@ComponentScan(basePackages = "package1")
@Profile("profile1")
public class MyConfig1 {
    ...
}

@ComponentScan(basePackages = "package2")
@Profile("profile2")
public class MyConfig2 {
    ...
}