@Autowired注入失效原因

今天写代码的时候发现@Autowired注入的时候一直注入不进来查询后这里记录一下
网上主要说的有几种原因

  1. 被注入对象所在对象在代码里面被new了,new出来的对象不能调用@Autowired,这里我个人认为可能是执行顺序的原因,因为如果是交由spring管理的bean会执行构造方法之后@PostConstructor之后就是@Autowired但是new了之后对象可能就不执行@Autowired了

  2. 被注入对象使用了多线程
    出现原因代码

// 多线程方式
 @org.junit.Test
    public void show(){
        Thread thread = new Thread(new Runnable() {
            @Autowired
            private TeacherDao teacherDao ;
     
            @Override
            public void run() {
            // 报空指针
                TeacherDao byId = teacherDao .getById("123");
                System.out.println(byId.getObjectId());
            }
        });
        thread.start();
        System.out.println("哈哈哈");
    }

// new对象方式
@Component
public class Test {

    @Autowired
    private TeacherDao teacherDao;

    public void show(){
        TeacherPo byId = 
        teacherDao.getById("123");
        System.out.println(byId.getObjectId());
    }
}

@org.junit.Test
    public void show(){
        Test t123 = new Test();
        // 这里会报空指针,因为Test里面的teacherDao注入失败
        t123.show();
        System.out.println("哈哈哈");
    }

解决办法:

@Component
public TestClass implement ApplicationContextAware{
	/*注意:这里一定要是静态的,因为如果你new出来的TestClass使用静态变量
	类初始化的时候就已经把该变量定义了后面直接通过ApplicationContextAware
	注入进来的容器赋值即可*/
	private static ApplicationContext applicationContext;

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

	public void show(){
		TeacherDao teacherDao = applicationContext.getBean(TeacherDao.class);
		// 该teacherDao是有值的
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值