我正在学习用于开发Web应用程序的Spring引导框架(版本2.0.7.RELEASE)。当我尝试自动连接MessageSource类时,它适用于一个类,但不适用于另一个:
这是我的WebConfig类:
package net.local.mis.phog.config;
@Configuration
public class WebConfig implements WebMvcConfigurer {
[...]
@Bean
public MessageSource messageSource() {
// This is the only place around application where messageSource is created
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
[...]
}
在控制器类中一切正常,例如:
package net.local.mis.phog.controller;
@Controller
@Transactional
public class AlbumController {
[...]
@Autowired
private MessageSource messageSource; (works fine)
[...]
}
但是当我尝试将messagSource注入模型类时,它将失败:
package net.local.mis.phog.model;
@Component
public class AlbumModel {
[...]
@Autowired
private MessageSource messageSource; (null)
[...]
}
在spring - component autowired in one class but not in another中,巴拉吉·克里希南(Balaji Krishnan)说:“您没有使用spring来获取Account实例-因此spring没有机会对其进行自动装配”。也许我应该做些类似的事情,但是我不明白怎么做。
有人可以帮我吗?
谢谢你,米哈伊尔。
答案 0 :(得分:0)
要使Spring利用依赖注入,所有bean必须全部由Spring管理。 AlbumModel
对象的创建应在spring之前进行管理,以便MessageSource
可以自动连线。如果AlbumModel
不应该由spring管理,而您想自己创建对象(我怀疑是因为您用@Component
进行了注释),那么您也可以使用构造函数注入。
您可以看到以下内容:
package net.local.mis.phog.model;
@Component
public class AlbumModel {
[...]
private MessageSource messageSource;
[...]
@Autowired
public AlbumModel(MessageSource messageSource) {
this.messageSource = messageSource;
}
}
使用上述解决方案时,当您手动创建AlbumModel
时,可以传入MessageSource对象,该对象已经由调用类(例如,控制器或任何服务层类)自动连接。但是,当AlbumModel
的创建在春季之前进行管理时,建议使用构造函数注入。在an article by a Spring contributor
答案 1 :(得分:0)
谢谢你们的回答。
Amit Bera,我仅通过调用其构造函数来创建AlbumModel对象:
package net.local.mis.phog.controller;
@Controller
@Transactional
public class AlbumController {
[...]
@Autowired
private JenreDao jenreDao;
@Autowired
private MessageSource messageSource;
[...]
@RequestMapping(value={"/album"},method=RequestMethod.GET)
public String albumShowHandler(Model model,
HttpServletRequest request,
@RequestParam(value="jenreIdSelected") Long jenreIdSelected,
@CookieValue(value="thumbnailOrder",defaultValue="ordDefault") String thumbnailOrder,
[...]) {
[...]
ThumbnailOrderAux thumbnailOrderAux = new ThumbnailOrderAux(thumbnailOrder);
JenreAux jenreAux = new JenreAux(jenreDao.getLstJenreModel(null,jenreIdSelected),jenreIdSelected);
AlbumModel albumModel = new AlbumModel(jenreAux,thumbnailOrderAux);
[...]
model.addAttribute("albumModel",albumModel);
return "album";
}
[...]
}
这是AdminModel构造函数的代码:
package net.local.mis.phog.model;
@Component
public class AlbumModel {
private JenreAux jenreAux;
private ThumbnailAux thumbnailAux;
[...]
public AlbumModel() {
super();
}
public AlbumModel(JenreAux jenreAux,ThumbnailOrderAux thumbnailOrderAux) {
super();
this.jenreAux = jenreAux;
this.thumbnailOrderAux = thumbnailOrderAux;
}
[...]
}
Nazeem,我向AlbumModel类添加了@Component批注,希望可以注入MessageSource bean。不幸的是,不是。
我可以将MessageSource作为参数传递,即使我不注释构造函数@Autowired,它也可以正常工作。如果我理解正确的话,MessageSource bean被注入到AlbumController中,因为它是由Spring管理的,并且它没有注入到AlbumModel中,因为它不是由Spring管理的。对?如果是这样,我有什么办法让Spring管理AlbumModel对象?