更简洁的@Bean

时间:2016-06-03 10:48:02

标签: java spring autowired

我们使用@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类,而不是扫描包。通过构造函数自动装配可能还有一些毛茸茸的问题。

1 个答案:

答案 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 {
...