我试图了解 Spring/Spring Boot 如何为我负责维护的应用程序管理 DI。在该应用程序中,我看到一个MyAppInjector
Groovy 文件,如下所示:
@Configuration
class MyAppInjector {
@Autowired
void configureJackson(ObjectMapper objectMapper) {
SimpleModule jacksonModule = new SimpleModule()
.addDeserializer(AccountDeserializer, new AccountDeserializer())
.addDeserializer(PhoneNumberDeserializer, new PhoneNumberDeserializer())
.addDeserializer(AddressDeserializer, new AddressDeserializer())
.addDeserializer(ContactDeserializer, new ContactDeserializer())
.addDeserializer(CustomerDeserializer, new CustomerDeserializer())
.addDeserializer(DeploymentInfoDeserializer, new DeploymentInfoDeserializer())
.addDeserializer(ServiceAgreementDeserializer, new ServiceAgreementDeserializer())
objectMapper.registerModule(jacksonModule)
}
}
但是我没有看到configureJackson(...)
从我的应用程序源代码中的任何地方调用。我假设此方法正在配置 Jackson ObjectMapper
,Spring 使用它来将 JSON 序列化为 POJO。
但是,Spring 怎么知道在ObjectMapper
这里配置呢?它是否寻找任何注释的东西@Configuration
,然后看到它在ObjectMapper
某处注册了一个 Jackson ,并将它传递给这个configureJackson(...)
方法?对我来说看起来像魔术......
对于用 注释的类中的任何方法都是如此@Configuration
吗?意思是我可以创建一个方法,如:
@Configuration
class MyAppInjector {
@Autowired
Fizz fizz(Buzz buzz) {
new Fizz(buzz)
}
@Autowired
void configureJackson(ObjectMapper objectMapper) {
SimpleModule jacksonModule = new SimpleModule()
.addDeserializer(AccountDeserializer, new AccountDeserializer())
.addDeserializer(PhoneNumberDeserializer, new PhoneNumberDeserializer())
.addDeserializer(AddressDeserializer, new AddressDeserializer())
.addDeserializer(ContactDeserializer, new ContactDeserializer())
.addDeserializer(CustomerDeserializer, new CustomerDeserializer())
.addDeserializer(DeploymentInfoDeserializer, new DeploymentInfoDeserializer())
.addDeserializer(ServiceAgreementDeserializer, new ServiceAgreementDeserializer())
objectMapper.registerModule(jacksonModule)
}
}
...并期望 Spring 智能地寻找一个Buzz
实例以Fizz
在构造时传入?
SpringBoot 自己实例化 ObjectMapper,因为 Spring 使用它来将 Java 对象转换为 JSON,反之亦然。因此,如果它在类路径中找到 Spring boot,它将加载 objectMapper。现在,在您的 configureJackson 方法中,您引用了 ObjectMapper 和 @Autowired 注释,因此 Spring 将为该方法提供 ObjectMapper 的实例。
该@Autowired
注释做,你指的是魔术。@Autowired
Fizz fizz(Buzz buzz) {
new Fizz(buzz)
}
在这个例子中,Apring 将在 fizz 方法中注入 Buzz 实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句