Spring的实例化和依赖注入时机与延迟实例化

Spring的实例化

使用@Autowired可以注入一个bean进来

	@Autowired
    private Diana diana;

那么如果在容器中没有Diana的对象被实例化的时候应用程序会报错吗?我们可以通过把Diana上面的@Component注释掉来看一下结果如何

//@Component
public class Diana {
	public void r(){
        System.out.println("Diana R");
    }
}

@RestController
@RequestMapping("/v1/banner")
public class BannerController {
    @Autowired
    private Diana diana;
}

启动SpringBoot会出现以下结果:
在这里插入图片描述
由此可见,如果spring无法在容器中找到Diana的对象,在默认的机制下启动时就会直接报错。

当在@Autowired后面加上 (required = false),变成

@RestController
@RequestMapping("/v1/banner")
public class BannerController {

    @Autowired(required = false)
    private Diana diana;
    
	@GetMapping("/test")
    public String test1() {
        diana.r();
        return "Hello test1";
    }
}

SpringBoot可以 正常启动,但是当访问diana下面的方法时会出现下面这样的结果
在这里插入图片描述
出现这样的情况注入是没有问题的,而是由于容器中没有diana这个对象却又调用diana下面的方法

结论:
_如果spring无法在容器中找到Diana的对象,在默认的机制下启动时就会直接报错。我们可以通过@Autowired(required = false)的方式令应用程序可以正常启动。 _

依赖注入时机

IOC容器究竟是在什么时候实例化对象并把对象注入到代码片段里的呢?是当请求访问Controller的时候才进行实例化并注入,还是在SpringBoot应用启动时就开始实例化并把对象注入到代码片段的呢?

由之前的代码可以看出,当把Diana上面的@Component注释掉时,SpringBoot应用启动时应用程序会立即报错,我们也可以通过在Diana这个类中加一个无参的构造方法来验证以下

@Component
public class Diana {
	public Diana() {
        System.out.println("Hello Diana");
    }
    public void r(){
        System.out.println("Diana R");
    }
}

应用程序启动时控制台打印出了"Hello Diana"
在这里插入图片描述
结论:
默认机制下,在SpringBoot应用启动时,IOC容器就开始实例化对象并把对象注入到代码片段里

延迟实例化

SpringBoot默认是立即实例化的机制,我们可以通过 @Lazy让它变成延迟实例化。

@Component
@Lazy
public class Diana {

在这里插入图片描述
当只在Diana上加上 @Lazy,启动应用却发现Diana仍然是立即实例化,@Lazy并没有起作用。这是因为BannerController是立即实例化的,那它下面的属性如果是@Autowired的就也需要立即实例化,只加在Diana上的 @Lazy是会被忽略掉的。如果真的需要延迟实例化就需要在BannerController也加上@Lazy或者是BannerController注入Diana的地方加上@Lazy,示例代码如下:

@RestController
@RequestMapping("/v1/banner")
@Lazy
public class BannerController {

或者

	@Autowired
    @Lazy
    private Diana diana;

当访问当前的Controller控制台打印出了下面的结果:
在这里插入图片描述
由此可见,此时是当请求访问Controller的时候才进行实例化并注入

如果没有特殊理由最好不要开启延迟实例化。使用默认机制提前实例化才是一个比较好的做法,因为可以尽早发现问题,避免很多问题在运行时才被发现。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三毛村滴雪鱼粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值