使用@Autowired将依赖项注入使用"new ..."创建的对象中

Joh*_*nak 4 java spring wicket dependency-injection autowired

将bean注入helper类时遇到问题.它的工作原理基本上是这样的:我在页面构造函数中创建一个对象,它可以完成一些工作,返回一些数据并在页面上显示这些数据.在此辅助对象中,应通过@Autowired注释注入服务.但是,当我使用它时,我总是得到一个空指针异常.我也尝试了,@SpringBean但没有帮助.另一方面,当我将此服务直接注入页面时@SpringBean,它可以访问并且工作正常.你知道问题出在哪里吗?

这是页面:

public class Page extends BasePage {
    public Page() {
        HelperObject object = new HelperObject(new Application("APP_NAME"));
        String result = object.getData();

        add(new Label("label", result));
    }
}
Run Code Online (Sandbox Code Playgroud)

助手对象:

public class HelperObject {
    private Application app;

    @Autowired
    private Service service;

    public HelperObject(Application app) {
        this.app = app;
    }

    public String getData() {
        // use service, manipulate data, return a string
    }
}
Run Code Online (Sandbox Code Playgroud)

tet*_*suo 5

您可以@SpringBean通过调用InjectorHolder.getInjector().inject(this);其构造函数将依赖项注入到非Spring-non-Wicket-new-created对象中.

例如:

class MyPojo {
    @SpringBean
    MyDumbDAO dao;
    MyPojo() {
        InjectorHolder.getInjector().inject(this);
    }
    void justDoIt() {
        dao.duh(); // dao is there!
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它仅在Wicket管理的请求中调用时才有效.如果不是(即,如果它是Quartz作业,或者在Wicket之前执行过滤器),则Application实例将不可用,并且注入器将不知道如何获取依赖项.

另一种解决方案是使用Spring @Configurable.它使用AspectJ拦截注释对象的创建,并注入其依赖项,即使您直接使用new(或其他一些框架,如Hibernate,在内部创建它们)实例化它们.但这需要运行时或构建时间(对我来说更好)字节码操作,这对某些人来说可能太神奇了.