0

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

我知道弹簧豆是单例的,所以为了将弹簧豆注入 FClass 类。我需要将 FClass 定义为 bean 并将 DI 添加为属性等。

那么我怎么知道 FClass 是否应该是单例?我假设只能创建单例类和 bean 并对它们进行 DI。

我的问题是:

我需要能够将我的外观 bean xfacade 注入 FClass。x_facacde 处理 dao 对象。它有 Y_dao 和一个作为 DI 注入的 Z_hibernate 会话 bean。

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

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

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

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

文件。

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

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

4

2 回答 2

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。我仍然有休眠会话的问题,但那是由于其他一些问题。

pt 这里是我无法访问 bean,因为它不受 spring 容器的控制,所以我需要以某种方式获取它,可能可以通过工厂方法完成它,但是当有更简单的方法时为什么要乱来。感谢任何可能发布或试图理解我的问题的人的帮助。

于 2013-03-14T15:55:47.387 回答
0

实际上 :

我假设只能创建单例类

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

因此,您必须小心的一件事是将 bean 注入到单例prototyperequest单例中。

于 2013-03-13T20:07:23.883 回答