知方号

知方号

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

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

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太累,而且看起来太麻烦了ÿ

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。