从Spring自动装配中排除子包?

时间:2012-05-23 17:46:06

标签: spring autowired

有没有一种简单的方法可以在Spring 3.1中从自动装配中排除包/子包?

例如,如果我想在com.example的基础包中加入组件扫描,有一种简单的方法可以排除com.example.ignore吗?

(为什么?我想从集成测试中排除一些组件)

9 个答案:

答案 0 :(得分:76)

我不确定您是否可以使用< exclude-filter>明确排除软件包,但我打赌使用正则表达式过滤器可以有效地帮助您:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/>
 </context:component-scan>

要使其基于注释,您需要使用@ com.example.annotation.ExcludedFromITests等注释要为集成测试排除的每个类。然后组件扫描看起来像:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/>
 </context:component-scan>

这更清楚,因为现在您已经在源代码本身中记录了该类不打算包含在集成测试的应用程序上下文中。

答案 1 :(得分:51)

对于相同的用例,我使用@ComponentScan如下所示。这与BenSchro10's XML答案相同,但这使用注释。两者都使用带有type=AspectJ

的过滤器
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration;
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.example" },
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.ignore.*"))
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

答案 2 :(得分:22)

对于 Spring 4 ,我使用以下
(我发帖是因为问题是4岁,更多人使用Spring 4而不是Spring 3.1):

@Configuration
@ComponentScan(basePackages = "com.example", 
  excludeFilters = @Filter(type=FilterType.REGEX,pattern="com\\.example\\.ignore\\..*")) 
public class RootConfig {
    // ...
}

答案 3 :(得分:11)

这适用于Spring 3.0.5。所以,我认为它适用于3.1

<context:component-scan base-package="com.example">  
    <context:exclude-filter type="aspectj" expression="com.example.dontscanme.*" />  
</context:component-scan> 

答案 4 :(得分:11)

看起来你已经通过XML完成了这项工作,但是如果你正在使用新的Spring最佳实践,那么你的配置将使用Java,你可以将它们排除在外:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "net.example.tool",
  excludeFilters = {@ComponentScan.Filter(
    type = FilterType.ASSIGNABLE_TYPE,
    value = {JPAConfiguration.class, SecurityConfig.class})
  })

答案 5 :(得分:6)

我认为你应该在更方便的层次结构中重构你的包,所以它们不在基础包中。

但如果你不能这样做,试试:

<context:component-scan base-package="com.example">
    ...
    <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/>
</context:component-scan>

您可以在此处找到更多示例:Using filters to customize scanning

答案 6 :(得分:4)

对我来说似乎有用的一件事是:

@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class")

或者用XML:

<context:component-scan base-package="com.example" resource-pattern="*.class"/>

这会覆盖resourcePattern的默认"**/*.class"

这似乎是仅包含基础包的最类型安全的方式,因为resourcePattern始终与您的基础包相同且相对于您的基础包。

答案 7 :(得分:2)

您还可以使用@SpringBootApplication,根据Spring文档,它具有与以下三个注释相同的功能: @Configuration @EnableAutoConfiguration @ComponentScan 在一个注释中。

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}

答案 8 :(得分:0)

您还可以包括特定的软件包,并排除它们,例如:

包含和排除(两者)

document.evaluate

仅排除

document