将spring bean注入非单例类

时间:2013-03-13 18:51:52

标签: spring hibernate design-patterns dependency-injection quartz-scheduler

是否可以将spring bean注入由调度程序作业控制的轮询过滤器类(FClass)? 我不太明白单身人士在这里是如何适用的。

我知道spring beans是singleton所以为了将spring bean注入类FClass。我需要将FClass定义为bean并将DI添加为属性等。

所以我怎么知道FClass应该是单身?我假设只能创建单例类,并且bean可以对它们进行DI操作。

我的问题是:

我需要能够将我的facade bean xfacade注入到FClass中。 x_facacde处理dao对象。它有Y_dao和Z_hibernate会话bean注入DI。

当我尝试创建一个StatusPollingFilter(FClass)的spring bean并注入facade bean时 - 我得到一个null,并且在调试模式下从不调用setter进行注入。

问题: 我认为它可能与StatusPollingFilter的线程/调度程序性质有关,并且由于spring bean是单例,因此可能无效。

我正在考虑为StatusPollingFilter(FClass)创建一个工厂。但是我需要知道这是不是正确的事情,并且在我做太多工作之前我正处于正确的轨道上并意识到即使这样也行不通,因为问题可能在其他地方。理想情况下,我只想以最简单的方式更新表格。但我必须使用hibernate,因为DAO存在但是使用

配置了hibernate
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 with /hibernate/TopoObject.hbm.xml

的文件。

所以无论我如何尝试这个,我总是在会话或注入的外观bean上得到空指针异常。 阅读这里的一些QA似乎是因为StatusPollingFilter是使用调度程序实例化的,而不是因为它无法知道DI bean。那么上面的工厂模式也会有所帮助。

我可能还有一个问题,但是当我来到它时,我会越过那座桥。但是简单地提一下,如果有人知道我可能遇到的问题......不确定调度程序将为一个实例调用工厂的内容/方式,因为它全部由第三方API控制 - 它调用StatusPollingFilter但是我我假设如果我作为类和参数进入工厂,它会找到它的方式...但初始部分是主要问题。请忽略后者的华夫饼干。提前谢谢。

2 个答案:

答案 0 :(得分:0)

实际上:

  

我假设只能创建单身人士的课程

是你错了。 bean只是一个允许spring实例化的类。 默认情况下,它们被创建为单例,但您可以使用属性scope在bean上指定范围(非常令人惊讶)。您可以指定的值是文档here

中指定的值

因此,您必须注意的一件事是将作为prototyperequest范围的bean注入单身人士。

答案 1 :(得分:0)

阅读更多 - 我遇到了ans。 因为StatusPollingFilter对象受调度程序的控制(我知道调度程序与它有关)然后它不知道spring bean,这就是为什么我在尝试注入bean时一直变为null的原因。

我创建了一个类:

 ApplicationContextProvider implements ApplicationContextAware

添加了静态访问

private static ApplicationContext   appContext;

为它做了一个制定者:

public void setApplicationContext(ApplicationContext context)
{
    appContext = context;
}

并添加了

public static Object getBean(String beanName) throws BeansException
{
    return appContext.getBean(beanName);
}

在代码中用作:

EvoTAMDAOFacade evoDao = (EvoTAMDAOFacade) ApplicationContextProvider.getBean("evoDaoFacade");

我现在可以访问外观bean和所有注入的bean到外观。 我仍然有一个hibernate会话的问题,但由于其他一些问题,这可能是问题。

这里是我无法访问bean,因为它不能控制弹簧容器,所以我需要以某种方式得到它,可能可以通过工厂方法完成它但是为什么有更简单的方法。 感谢任何可能已发布或试图了解我的问题的人的帮助。