Spring@Autowired与new的区别
前两天写代码的时候遇到⼀个问题,通过new出来的对象,⾃动注⼊的属性总是报空指针的错误。到⽹上查了资料,才发现问题所在,同时也加深了⾃⼰对于容器IOC的理解。现在把这个问题记录⼀下,仅供⼤家参考。
【⽰例】
ller;
ample.SpringBootStudy.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author jyy
* @Description {}
* @Date 2018/12/19 18:28
*/
@RestController
@RequestMapping(value = "/test")
public class TestController {
@Autowired
private TestService testService;
@RequestMapping(value = "/print",method = RequestMethod.GET)
public void test() {
}
}
ample.SpringBootStudy.service;
ample.SpringBootStudy.dao.TestDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author jyy
* @Description {}
* @Date 2018/12/19 18:26
*/
@Service
public class TestService {
@Autowired
private TestDao testDao;
public void test() {
}
}
ample.SpringBootStudy.dao;
import org.springframework.stereotype.Repository;
/
spring framework版本**
* @Author jyy
* @Description {}
* @Date 2018/12/19 18:26
*/
@Repository
public class TestDao {
public void test() {
System.out.println("调⽤成功!");
}
}
输出结果:
调⽤成功!
⼀个很简单的⽰例,Controller调⽤Service,Service调⽤Dao,输出结果。
我们将Controller中testService初始化的⽅式改为new,看下效果:
ller;
ample.SpringBootStudy.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author jyy
* @Description {}
* @Date 2018/12/19 18:28
*/
@RestController
@RequestMapping(value = "/test")
public class TestController {
//@Autowired
//private TestService testService;
private TestService testService = new TestService();
@RequestMapping(value = "/print", method = RequestMethod.GET)
public void test() {
}
}
输出结果:
报出空指针异常,跟踪发现Service中的testDao未正确赋值
总结:@Autowired是从IOC容器中获取已经初始化的对象,此对象中@Autowired的属性也已经通过容器完成了注⼊,整个⽣命周期都交由容器管控。然⽽通过new出来的对象,⽣命周期不受容器管控,⾃然也⽆法完成属性的⾃动注⼊。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。