有没有一种简单的方法可以在 Spring 3.1 中从自动装配中排除包/子包?
例如,如果我想包含一个带有基本包的组件扫描,com.example
是否有一种简单的排除方法com.example.ignore
?
(为什么?我想从我的集成测试中排除一些组件)
我不确定您是否可以使用 <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>
这更清楚了,因为现在您已经在源代码本身中记录了该类不打算包含在集成测试的应用程序上下文中。
对于相同的用例,我使用@ComponentScan
如下。这与BenSchro10 的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);
}
}
对于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 {
// ...
}
看来您已经通过 XML 完成了这项工作,但如果您使用新的 Spring 最佳实践,您的配置将使用 Java,您可以将它们排除在外:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "net.example.tool",
excludeFilters = {@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
value = {JPAConfiguration.class, SecurityConfig.class})
})
这适用于 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>
我认为您应该以更方便的层次结构重构您的包,因此它们不在基本包中。
但是,如果您不能这样做,请尝试:
<context:component-scan base-package="com.example">
...
<context:exclude-filter type="regex" expression="com\.example\.ignore.*"/>
</context:component-scan>
在这里您可以找到更多示例:使用过滤器自定义扫描
似乎对我有用的一件事是:
@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class")
或者在 XML 中:
<context:component-scan base-package="com.example" resource-pattern="*.class"/>
这会覆盖默认值resourcePattern
,即"**/*.class"
.
这似乎是仅包含您的基本包的最安全的方法,因为该 resourcePattern 将始终相同并且相对于您的基本包。
您还可以使用@SpringBootApplication,根据 Spring 文档,它与以下三个注解具有相同的功能: @Configuration, @ EnableAutoConfiguration @ComponentScan 在一个注解中。
@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}
您还可以包含特定的包并排除它们,例如:
包括和排除(两者)
@SpringBootApplication
(
scanBasePackages = {
"com.package1",
"com.package2"
},
exclude = {org.springframework.boot.sample.class}
)
只是排除
@SpringBootApplication(exclude= {com.package1.class})
public class MySpringConfiguration {}
只是对现有答案的补充。
如果要从子包中排除类而不是从基础包中排除类,则可以"com.example.ignore.*
更改"com.example.ignore.*..*"
如下
在 spring-boot 中验证了这一点:2.4.1
从这个答案中获取代码片段
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);
}
}