我们使用@Configuration
个类,其中包含大量@Bean
注释方法,基本上如下所示:
@Bean
public TeamContactIndexer teamContactIndexer(GroupService groupService, ContactCrudService contactCrudService, ContactRetrieveService contactRetrieveService) {
return new TeamContactIndexer(groupService, contactCrudService, contactRetrieveService);
}
所以这会返回一个新的bean,并通过方法参数将其他spring声明的东西注入到构造函数中。
我知道减少冗长的唯一方法是使用@Component
注释bean,使用@Autowired
注释构造函数。
对于许多人来说,这是完全可以接受的,但我不想在Spring注释中乱丢我的代码只是为了方便管道并在@Configuration注释类中保持完全无弹簧的业务逻辑和管道代码之间的清晰分离。我将它们视为一种更安全,更简洁的替代品,用于我们以前在xml中所做的事情。
然而,如果我可以去......那就不好了。
@Bean
public TeamContactIndexer teamContactIndexer;
...并且让Spring知道它需要自动装配该类的构造函数(100%无弹簧)来生成bean。就我所见,Spring目前还没有支持这个版本,尽管我可以很容易地看到它。我是否遗漏了某些内容,或者我的@Configuration
类中的构造函数调用是否真的无法解决(除了使用注释乱丢我的代码)?绝大多数@Bean
方法都应该像这样轻松替换。
更新
@bezmax在这里提供了一种可行的方法,即使用组件扫描注释。
@Configuration
@ComponentScan(
basePackages={"com.github.jsonj.tools"},
includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = {JsonParser.class})})
public class JsonParserConfig {
}
我已经使用上面的代码为我使用的库中没有注释的bean提供了bean定义。这取代了我之前使用的@Bean注释工厂方法。它仍然有点冗长,但至少你可以放入逗号分隔的类列表。类型的默认值对于此用例是错误的,因此您必须指定它;同样,包装定义是必需的,即使它可以从过滤器上的类中推断出来。
恕我直言,Spring有一个明显的改进空间,即提供一个简单的逗号分隔列表的注释。因此,只需列出要初始化的bean类,而不是扫描包。通过构造函数自动装配可能还有一些毛茸茸的问题。
答案 0 :(得分:2)
此功能在Spring 4.3中实现(尚未发布)。
您可以在changelog(请参阅6.1)
中详细了解相关内容<强>加了:强>
关于自动注册未注释的类,似乎有一种灵活的方法可以使用@ComponentScan
注释实现此目的。此批注允许您指定一组包含过滤器,这些过滤器在类上匹配时会自动注册为bean。我实际上没有尝试过使用这个过滤器的更复杂的规则,似乎你有几个选项(查看@ComponentScan上的文档),但最简单的一个是这样的:
@Configuration
@ComponentScan(
value = "some.package.path",
includeFilters = {
@Filter(type = ASSIGNABLE_TYPE, value = {
MyClass1.class,
MyClass2.class,
MyClass3.class
})
})
public class WebConfig extends WebMvcConfigurerAdapter {
...