深入了解Spring的IOC(DI)、AOP和SpringBoot自动配置原理

本文深入探讨了Spring框架的三大核心特性:IOC(控制反转)和DI(依赖注入)的实现原理,包括bean的创建方式、懒加载、生命周期管理等。同时,讲解了AOP(面向切面编程)的概念,介绍了动态代理的实现方式。此外,文章还剖析了SpringBoot的自动配置机制,解释了如何通过@EnableAutoConfiguration注解实现零配置。
摘要由CSDN通过智能技术生成

1、Spring的IOC和DI
(1)IOC
IOC全称是Inverse of Control,控制反转的意思,就是把对象的创建和生命周期的管理交给spring,这里提到对象的创建,那spring创建对象的方法有几种?
四种:
第一种是针对只有无参构造的类而言,直接利用反射原理创建对象,这种方式创建的对象如何放入spring容器中?在xml中写一个bean标签对,里面写id和class属性;
第二种是针对有参构造的类或者抽象类而言(当然也可以用于只有无参构造的类),此时需要自己创建一个静态工厂类,里面定义一个getInstance()静态方法,那这种方式创建的对象又如何放入spring容器中?在xml中写一个bean标签对,里面除了id和class属性,还要写一个factory属性,这个属性写的是静态工厂方法(注意xml里写两个bean,因为除了工厂类,还需要原材料类)(静态工厂方法在xml中的确只写一个!):
第三种和第二种使用场景一样,也需要创建一个工厂类和里面的工厂方法,但只是这里不用静态方法而是实例方法,从形式上就是少一个static,其他一样,但这种方式创建的对象放到spring容器中的xml里写法不一样,需要注意的是静态工厂方法只有一个bean,实例工厂却是两个,第一个bean是写工厂类的id和class,第二个bean是写原材料类的id、factory-bean(其实就是第一个bean的id值,这个取代class)和factory-method。
第四种是采用Spring内置的工厂接口完成。
随着需求的不断增加,bean标签对里的属性只有上面的id、class、factory-method、factory-bean肯定不够,所以出现了scope、lazy-init、init-method和destroy-method:
1)scope:定义单例还是多例
如果不写,默认是单例,即对象只创建一次后就放在spring容器中,然后每次getbean都是从容器中拿这个对象,不会取一次创建一次,而如果加了这个属性并且值设置为prototype,则说明开启多例模式,那就是每取一次创建一次。
2)lazy-init:定义是否开启懒加载机制
如果项目需要在xml中要写很多的bean而且是在单例模式下,这样解析xml后就会对里面所有bean进行创建对象,这样会耗费很多时间和内存,如果都创建了很多还用不到,那就更是大大浪费了,所以引申出一个属性:懒加载,即一开始解析xml的时候有这个属性的bean就先不创建,只有主程序中第一次用到了才创建,当然这个属性也可以设置为全局,即所有bean都满足,如果全局和局部设置不同而且都有哪个优先?局部优先。
注:为什么这里强调“而且是在单例模式下”?多例模式下不需要懒加载机制,相同点都是用的时候再创建对象,但不同点是单例懒加载机制还是只有第一次才创建对象。
3)init-method和destroy-method
这两个属性体现了spring对对象的生命周期管理,这个类比前面学过的servlet的生命周期,即spring根据id+class或id+class+factory-method或id+class+id+factory-bean+factory-method这三种方法创建对象后(可以设置多例模式、懒加载机制),先调用init方法进行初始化操作,再调用对象里的普通方法,最后在对象销毁之前才调用destroy方法进行销毁操作。
:使用spring不一定是web工程还可以是普通工程;还有就是一定要导spring的包,这样才能完成spring自动解析xml文件等功能;最后要注意写一个xml模板,配置文件和注解的模板形式不一样。
上面提到如果xml中bean太多,那Spring解析这个xml就要创建这么多bean对象很浪费时间和空间,所以为单例模式弄了一个懒加载机制,这是为Spring考虑,那我们能不能为自己考虑下,毕竟写这么多bean太累,而且看起来太麻烦了ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值