2 panwei321 panwei321 于 2015.07.15 21:40 提问

@Service注入无效,但是通过Controller进来的可以成功,这是为啥?

spring MVC+Spring+Mybatis的架构
我的扫描配置如下:

 <context:component-scan base-package="com.pp.susf">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan>
在一个类中使用如下注解注入不可行:
@Autowired
private ITestService testService;

而在Controller中
    @Autowired
private ITestService testService;
则调用正常

4个回答

strutce
strutce   Ds   Rxr 2015.07.15 23:53

是不是你的类上没有写注解@Service

panwei321
panwei321 加了的
2 年多之前 回复
panwei321
panwei321   2015.07.16 10:43

补充说明一下,我是用spring加了个任务调度的listener,
我是在listener类中注解的哪些Service,是不是因为这个原因?
web.xml中的调度listener:

<!-- 定时任务 -->

com.xsscd.unionpay.listener.WatchingTaskStatusListener

 任务调度类:
 public class WatchingTaskStatusTimerTask extends TimerTask {

    private static Logger log = Logger.getLogger(WatchingTaskStatusTimerTask.class);

    @Autowired
    private ITaskStatusMonitor taskStatusMonitor;

    @Autowired
    private ITestService testService;

    @Override
    public void run() {
        try {
            // 在这里写要执行的内容
            System.out.println("timeTask start run :"+new Date().toLocaleString());

            System.out.println(testService.test3()); **_//testService为空_**
                //启用到点任务
            if (taskStatusMonitor==null) {
                System.out.println("taskStatusMonitor  that get by @Autowired is null");

                taskStatusMonitor = (TaskStatusMonitor) SpringUtil.getBean("taskStatusMonitor");
                if (taskStatusMonitor==null) {
                    System.out.println("taskStatusMonitor that get by bean name  is null");
                    taskStatusMonitor.activateTask();
                    taskStatusMonitor= new TaskStatusMonitor();
                }
            }
            taskStatusMonitor.activateTask();
strutce
strutce   Ds   Rxr 2015.07.16 10:50

public class WatchingTaskStatusTimerTask extends TimerTask 这里的前面有@Service吗

panwei321
panwei321   2015.07.16 11:34

我大概知道原因了,我发现项目启动时,listener对象是先于哪些注解bean被解析的(不晓得这么说用词是否准确),就感觉这个时候listener的注解bean没有和listener对象挂钩,后面定时任务调用执行的时候也没有。
我的解决办法是直接通过类名来获取的spring bean对象
可以解决当前业务问题了。
后面需要专门研究下,spring的东西太多要理解了,我了解的还不够

Csdn user default icon
上传中...
上传图片
插入图片