如何手动创建的对象的自动装配属性?

时间:2018-05-04 14:22:57

标签: java spring dependency-injection autowired

我有使用new手动创建的类,因为我需要传递一些对象(而不是bean)。它有两个坚硬的物体,我希望春天自动装配。这是我的班级:

@Component
@Scope("prototype")
public class DayLayout extends VerticalLayout {

    @Autowired
    private SchedulingService schedulingService;

    @Autowired
    private GeneralService generalService;

    .
    .
    .
}

但是在创建类之后,这些对象仍然是null。我想是因为我没有通过弹簧容器获得那个豆子。但有什么方法可以手动创建对象,它的所有对象仍然会自动装配?

4 个答案:

答案 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。如果那不是你想要的,你能提供如何创建这两个对象吗?你传给他们什么?