gpt4 book ai didi

java - 不太冗长@Bean

转载 作者:行者123 更新时间:2023-12-02 03:34:25 24 4
gpt4 key购买 nike

我们使用 @Configuration 类,其中包含许多 @Bean 带注释的方法,其本质上如下所示:

@Bean
public TeamContactIndexer teamContactIndexer(GroupService groupService, ContactCrudService contactCrudService, ContactRetrieveService contactRetrieveService) {
return new TeamContactIndexer(groupService, contactCrudService, contactRetrieveService);
}

因此,这会返回一个新的 bean,并通过方法参数将其他 spring 声明的内容按名称注入(inject)到构造函数中。

我知道减少冗长的唯一方法是使用 @Component 注释 bean,并使用 @Autowired 注释构造函数。

对于许多人来说,这是完全可以接受的,但我更喜欢不要在代码中乱七八糟地使用 Spring 注释,只是为了方便管道,并在 @Configuration 带注释的类中完全独立于 Spring 的业务逻辑和管道代码之间保持清晰的分离。我将它们视为类型更安全、更简洁的替代品,用于替代我们过去在 xml 中所做的事情。

不过,如果我能去就好了……

@Bean
public TeamContactIndexer teamContactIndexer;

...并且让 spring 发现它需要 Autowiring 该类的构造函数(100% spring free)来生成 bean。据我所知,Spring 目前不支持这一点,尽管据我所知这应该很容易做到。我是否遗漏了一些东西,或者真的没有办法在我的 @Configuration 类中对构造函数调用进行微观管理(除了用注释乱扔我的代码)?我的绝大多数 @Bean 方法应该可以像这样轻松替换。

更新

@bezmax 在这里提供了一种可行的方法,即使用组件扫描注释。


@配置
@ComponentScan(
basePackages={"com.github.jsonj.tools"},
includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = {JsonParser.class})})
公共(public)类 JsonParserConfig {
}

我已经使用上面的内容为我使用的库中没有注释的 bean 提供了 bean 定义。这取代了我之前使用的 @Bean 注解的工厂方法。它仍然有点冗长,但至少您可以放入逗号分隔的类列表。对于此用例,类型的默认值是错误的,因此您必须指定它;同样,即使可以从过滤器上的类推导出来,也需要包定义。

恕我直言,Spring 还有明显的改进空间,即提供一个仅采用逗号分隔的类列表的注释。因此,无需扫描包,只需列出您想要初始化的 bean 类即可。通过构造函数进行 Autowiring 可能仍然存在一些棘手的问题。

最佳答案

该功能在 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 {
...

关于java - 不太冗长@Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37612387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com