我有使用new手动创建的类,因为我需要传递一些对象(而不是bean)。它有两个坚硬的物体,我希望春天自动装配。这是我的班级:
@Component
@Scope("prototype")
public class DayLayout extends VerticalLayout {
@Autowired
private SchedulingService schedulingService;
@Autowired
private GeneralService generalService;
.
.
.
}
但是在创建类之后,这些对象仍然是null。我想是因为我没有通过弹簧容器获得那个豆子。但有什么方法可以手动创建对象,它的所有对象仍然会自动装配?
答案 0 :(得分:3)
因此,如果您需要将Autowired
属性注入通过new
创建的对象,则可以执行以下操作:
DayLayout dl = new DayLayout(<whatever parameters go here>);
ctx.getAutowireCapableBeanFactory().autowireBean(dl); // Where ctx is Spring's application context
但是如果你需要做这些事情,我想你可能会重新考虑你在申请中的实际行动。
答案 1 :(得分:1)
假设GeneralService
不是用@Component
注释的类或其他Spring构造型注释:是的,有。{/ p>
@Configuration
public class ConfigClasses{
@Bean
public GeneralService generalService(){
return new GeneralService();
}
}
SchedulingService
显然是相同的,只需添加另一个生成该类的方法。
答案 2 :(得分:1)
我认为你误解了托管对象的某些部分,但我不确定它是什么部分。
由于您将bean注释为@Prototype,我假设您已经意识到Spring会在您每次请求时为您实例化一个新实例。因此,为非托管对象调用setter将是一件小事。你甚至可以添加一个腰带和吊带方法,如果没有调用setter,你的bean会抛出一个IllegalStateException。
@Ivan对于如何手动请求bean完全正确。他也是完全正确的,如果你要求你的设计可能不是最好的。
答案 3 :(得分:0)
如果你这样做:Object obj = new Object(); ,它不会自动装配。如果要手动创建对象,可以使用带有@Configuration的配置文件并返回@Bean。 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html。如果那不是你想要的,你能提供如何创建这两个对象吗?你传给他们什么?