2013-11-20 5 views
0

Я использую метод метода поиска в Spring 3, чтобы вставить компонент-прототип в одноэлементный компонент, как описано в документах Spring here. Внутри моего прототипа bean у меня есть зависимость @Autowired от другого компонента, объявленного в моем applicationContext.xml. Инъекция метода поиска, похоже, работает должным образом в том, что мой прототип-боб вводится в мой одноэлементный компонент, однако зависимость прототипа вообще не вводится. Могут ли зависимости быть введены в прототипный компонент обычным способом, когда прототип возвращается методом поиска? Если нет, каков предпочтительный способ сделать это?Вкладные зависимости в прототипе bean

Edit: Определения фасоли заключаются в следующем:

<bean id="jobRouter" class="com.ccn.JobRouter"> 
    <lookup-method name="createJobConsumer" bean="jobConsumer"/> 
</bean> 

<bean id="jobConsumer" class="com.ccn.JobConsumer" scope="prototype"/> 

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="100" /> 
    <property name="WaitForTasksToCompleteOnShutdown" value="true" /> 
</bean> 

JobRouter

public abstract class JobRouter { 

    private LinkedHashMap<String, JobConsumer> jobRoutingMap = new LinkedHashMap<String, JobConsumer>(); 

    public void add(Job Job) { 
     if(!jobRoutingMap.containsKey(job.getObjectKey())){ 
      jobRoutingMap.put(job.getObjectKey(), createJobConsumer()); 
     } 
     //Hand off job to consumer 
     JobConsumer jobConsumer = jobRoutingMap.get(job.getObjectKey()); 
     jobConsumer.add(job); 
    } 

    protected abstract JobConsumer createJobConsumer(); 
} 

JobConsumer

public class JobConsumer { 

    @Autowired private TaskExecutor taskExecutor; 

    private LinkedBlockingQueue<Job> jobQueue = new LinkedBlockingQueue<Job>(); 

    public JobConsumer() { 
     taskExecutor.execute(new JobQueueMonitor()); 
    } 

    public boolean add(Job job) { 
     if(!jobQueue.contains(job)){ 
     return jobQueue.add(job); 
     } 
     return true; 
    } 

    private class JobQueueMonitor implements Runnable{ 
     @Override 
     public void run() { 
     ... 
     } 
    } 
} 
+0

Можете ли вы поделиться определениями bean? –

+0

@kocko Я отредактировал с моим кодом – Tom

ответ

0

Я понял, что зависимость внутри моего прототипа боба был, фактически, вводят должным образом. Проблема заключалась в том, что я пытался получить доступ к зависимостям внутри конструктора (см. Конструктор JobConsumer в моем коде выше) до того, как была введена зависимость, и она была явно нулевой. Я переместил код из конструктора JobConsumer в аннотированный метод @PostConstruct, и он работал, как ожидалось.

Смежные вопросы