我在一个非常基本的场景中遇到了一些麻烦:我有一个Java Web应用程序( Spring 3),我想将一些对象存储到堆栈中。然后,我想使用调度程序来管理堆栈中的对象,因此我实现了一个 quartz 作业。干净利落。我将堆栈添加到第一个服务类和作业类中,并带有@Autowired批注。对于服务类,表已成功注入(inject),但对于作业类,表为null。
这是代码:

分享的类(class)

package it.unifi.det.telemat.vr.data;
@Component
public class IndexedNodesStack extends HashMap<IndexedObject, Boolean>{

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    @Override
    public synchronized int size() {
        // TODO Auto-generated method stub
        return super.size();
    }

    //all the HashMap methods are implemented in a synchronized wrapper method

}

头等舱(@Autowired成功)
package it.unifi.det.telemat.vr.service;
@Service
public class InnerNodeManager extends ConcreteNodeManager{

    @Autowired
    private IndexedNodesStack indexedNodesStack; //<--- it is actually autowired!


    private void manageIndexedNodes(Boolean isPut, String lri, String features)
    {
        IndexedObject indexedObject = new IndexedObject();
        indexedObject.setId(lri);
        if(features != null && isPut)
            indexedObject.generateFeatures(features);

        indexedNodesStack.put(indexedObject, isPut);
    }

}

作业类别(@Autowired失败)
package it.unifi.det.telemat.vr.service.scheduler;
@Component
public class QuartzJSearchJob extends QuartzJobBean{

    @Autowired
    private IndexedNodesStack indexedNodesStack; //<--- this variable is null :-(

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException
    {
        //do work
    }
}

编辑:这是servlet.xml
<context:component-scan base-package="it.unifi.det.telemat.vr" />

<bean name="searchJob"
class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="it.unifi.det.telemat.vr.service.scheduler.QuartzJSearchJob" />
</bean>

<bean id="searchJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="searchJob" />
    <property name="cronExpression" value="0/50 * * * * ?" />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
    <list>
        <ref bean="searchJobTrigger" />
        </list>
    </property>
</bean>

也许我缺乏有关线程之间资源共享的知识,因为这是我在该领域的第一次尝试。
我想念什么?

最佳答案

仅当从Spring bean factory创建bean时, Autowiring 才有效。您是否在不使用bean工厂的情况下创建了对象,即是否使用new QuartzJSearchJob()语法创建了对象?

关于java - 如果将@Autowired应用于两个线程之间共享的Bean,则无法使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10436111/

10-12 06:19