将applicationContext中的bean插入POJO

时间:2013-12-03 20:26:19

标签: java spring spring-mvc autowired

我的所有DAO都是我的applicationContext中的bean。现在,这非常适合将这些对象自动装配到我的控制器中以进行数据库调用。但是,鉴于我在我的一些POJO中嵌入了对象(例如:用户类具有pendingsurvey对象列表,约会对象列表等),并且当我抓住主对象时不想抓取这些嵌入对象(例如:在一个包含用户列表的页面中,我不需要知道他们的pendingsurveys或约会),我已经设置好了,如果嵌入对象为null,请转到数据库获取数据。然而,显然@Autowire在这种情况下不起作用,因为POJO不是Spring控制的对象或什么的。

现在问题是,如何从applicationContext中获取bean以在我的POJO中使用?我对Spring不是那么好,所以特别指示会非常感激..

我试过这个,但它给了我一堆注入依赖错误:

/* applicationContext.xml */
<bean id="userDao" class="UserDao" scope="singleton">
    <property name="connectionWrapper" ref="connectionWrapper" />
</bean>

/* User.java - I tried putting in constructor and in the getter for userDao */
ApplicationContext ctx = AppContext.getApplicationContext('applicationContext.xml');
UserDao userDao = (UserDao) ctx.getBean("userDao");

2 个答案:

答案 0 :(得分:1)

当您加载类似于创建新上下文的上下文时,应加载应用程序时创建的内容的副本。要访问应用程序使用的相同上下文,您可以使用以下文档中记录的几个选项:http://mythinkpond.wordpress.com/2010/03/22/spring-application-context/

为了便于访问,我会复制/粘贴您最想要使用的那个:

public class MyClass implements ApplicationContextAware {

    static final long serialVersionUID = 02L;

    ApplicationContext applicationContext = null;

    public void doSomething(){
        if (applicationContext != null && applicationContext.containsBean("accessKeys")){
            MyBean beanA = (MyBean) applicationContext.getBean("mybean");
            //Do something with this AccessBean
        }

        return null;
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
        System.out.println("setting context");
        this.applicationContext = applicationContext;
    }

}

注意implements ApplicationContext。 这告诉Spring框架你需要在这个类中使用Application Context。所以它将它自动装入applicationContext变量。为此,您还需要setter方法。然后你可以使用它来获取你的豆子。好咖啡:))

P.S。 - 如果需要其他类中的上下文,可以将applicationContext变量传递给它们或使用相同的方法。这样,您只有1个上下文,包含您的bean。

答案 1 :(得分:1)

有了它的工作,与Ric Jafe的答案相同的概念,但它的不同实现(来源:http://blog.jdevelop.eu/?p=154):

上课:

public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext ctx = null;

    public static ApplicationContext getApplicationContext() {
        return ctx;
    }

    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        // Assign the ApplicationContext into a static method
        this.ctx = ctx;
    }
}

将此行添加到applicationContext.xml:

<bean id="applicationContextProvider" class="org.ApplicationContextProvider"></bean>

在我的POJO中调用它:

ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
if (applicationContext != null && applicationContext.containsBean("keyName")) {
    object = (Object) applicationContext.getBean("keyName");
}

感谢所有帮助人员。