java - 在Service中注入Dao不成功,Dao为null。

 为谁落慕 发布于 2022-10-26 14:37

在一个普通类中使用bean,代码如下:

public class ReceiveThread extends Thread {
    @Autowired
    private ApplicationContext ctx;
    ConcentratorService concentratorService;
    
    public void init() {
        ctx = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config/datasource.xml");
        concentratorService =(ConcentratorService) ctx.getBean("concentratorService");
    }

    public void run() {
        String macAddr="12:12:12:12:12:12";
        Concentrator c=concentratorService.findConcentratorByCaddress(macAddr);
    }
}

运行多线程之后,service被成功注入了,但是dao为空的。

ConcentratorService中的findConcentratorByCaddress函数如下:

@Service("ConcentratorService")
public class ConcentratorServiceImpl implements ConcentratorService{
    @Autowired
    ConcentratorDao concentratorDao;
    public Concentrator findConcentratorByCaddress(String caddress) throws Exception{
            // TODO Auto-generated method stub
            return concentratorDao.findConcentratorByCaddress(caddress);
    }
}

各位,求救!
============更新内容============
ConcentratorDao:(ConcentratorService雷同,只是把Dao改成Service)

public interface ConcentratorDao {
    public List getConcentratorListByMacAddresses(String[] macAddr) throws Exception;
}

datasource.xml片段

    
    
4 个回答
  • 我认为大概这种情况下可能会出现 dao 为空

    
    @Bean
    ConcentratorDao concetratorDao() {
        // 某个逻辑下
        return null;
    }

    要不然可能就是自己的代码改了 dao 值

    2022-10-27 01:08 回答
  • 你这个逻辑写的让人真的看不懂啊。

    @Autowired
    private ApplicationContext ctx;

    注入ApplicationContext

    ctx = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config/datasource.xml");

    这个又是啥意思?

    另外你的ConcentratorServiceImpl真的有被IoC容器管理吗?如果被IoC容器管理而未找到concentratorDao,又没有在@Autowired上设置required=false。这种情况concentratorDao不可能会为null的吧,spring找不到对应的bean依赖,应该会直接出现Dependency Exception才正确。

    2022-10-27 01:08 回答
  • 两种方式
    1.每次调用这个你所谓的普通类的方法时,在外部依赖dao,把dao实例传进来,并且删掉这个普通类里的关于spring的代码.
    2.把你这个普通类加注解@Component,使当前类被spring管理,给scope为多例,并在类里依赖注入你的daoservice.

    update:

    先在spring中加上这个bean:

    然后在你要使用线程的类里面注入

    用直接就是executor.execute();

    2022-10-27 01:08 回答
  • 我这个蠢人= =,当时脑袋是吃屎了。搅在一块了,把问题复杂化。真是辛苦了认真回答我这个脑残的问题的各位。
    问题的根本原因是,我获取ApplicationContext引用错了xml!!!!
    今天因为要重新解决这个问题。不知道为什么地就发现我这个web项目需要的xml被分成了俩,并被整合到了一个叫root_context.xml的文件中去了。所以!代码应该改成:

    ApplicationContext ctx = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config/root_context.xml");
    concentratorService =(ConcentratorService) ctx.getBean("concentratorService");

    才对,之后就能畅通无阻得使用bean了。希望看到这里,和我犯同样问题的鞋童们(大概只有我吧)好好反省反省自己。

    2022-10-27 01:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有