问一下,如果我想在静态代码块里面使用某个自动注入的dao类,怎么办?

是不是入错行了 2021-02-19 12:02:11
一个类启动的时候不是最先执行静态代码块么?
我现在希望的是在我这个类启动之前执行静态代码块,通过自动注入的dao去查询数据库加载数据(因为我不希望频繁查,管理说不要用redis),如果直接
@Autowired
private static HolidayDao holidayDao;
这样子,在静态代码块里面会空指针,如何才能在静态代码块里面用到这个dao去查询一次数据
...全文
1031 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂熊猫人 2021-02-19
  • 打赏
  • 举报
回复
根据你的描述,你希望在某个类被加载的时候,执行一次数据初始化,之后就可以一直使用了。所以,你希望在静态代码块中完成这件事,并且还要用到spring的自动注入功能。 个人认为如果要完全使用spring的方式,几乎不可能实现。原因:spring注入属性之前,一定先加载类,加载类就会触发静态代码块的执行,所以无解。 但是我们可以用单例的思想来达到同样的效果。

private HolidayDao holidayDao;
private static Object data;
@Autowired
public void setHolidayDao(HolidayDao holidayDao){
  this.holidayDao = holidayDao;
    //双重检查加锁
    if(data==null){
        synchronized(XXX.class){
      if(data==null){
        //初始化数据
      }
    }
}
}
m0_37178533 2021-02-19
  • 打赏
  • 举报
回复
你的HolidayDao 是在Spring容器中的,但你当前静态代码块所属的类没有对应的实例在Spring容器中,Spring肯定不会管理其中需要注入的HolidayDao。 解决办法: 1、在当前类中使用时直接把HolidayDao在Spring容器中的实例传入需要使用的方法中。这种方法写起来很恶心,不建议使用。 2、通过ApplicationContext获取Spring容器对应的HolidayDay实例,具体如下

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}
//使用方式
public class Test {
private static HolidayDao holidayDao = SpringUtils.getApplicationContext().getBean(HolidayDao.class);
}
3、通过Postconstruct注解
这个自己去网上找找
liuyh1024 2021-02-19
  • 打赏
  • 举报
回复 1
 @Resource
    private KpzMapper kpzMapper;
     private static KpzMapper tl;
    //在静态方法中调用Mapper更新数据库
    @PostConstruct
    public void init() {
        tl = kpzMapper;
    }
在用tl去调用方法就行了。
窃窃私语_ 2022-03-15
  • 举报
回复
@liuyh1024 good good good

81,116

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧