1.spring 管理JavaBean的过程(生命周期)
在Spring框架中,Bean的生命周期是指从它被创建、初始化,到最终被销毁的整个过程。
需要注意的是,Bean的销毁并不是由Java的垃圾回收器自动处理的,而是由Spring容器负责管理和销毁的。
如下图就是bean的整个生命周期图,它的一个初始化过程
- 通过XML、Java annotation(注解)以及Java Configuration(配置类),等方式配置JavaBean,现在我用的是xml配置文件的方式,BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中,会将Bean解析成Spring内部的BeanDefinition结构;理解为:将spring.xml中的<bean>标签转换成BeanDefinition结构,有点类似于XML解析。
- BeanDefinition:包含了很多属性和方法。例如:id、class(类名)、scope、ref(依赖的bean)等等。其实就是 将bean(例如<bean>)的定义信息 存储到这个对应BeanDefinition相应的属性中,最终得到List<BeanDefinition>
- BeanFactoryPostProcessor:是Spring容器功能的扩展接口。JavaBean初始化之前 先执行自己的业务
- BeanFactory:bean工厂。它按照我们的要求生产我们需要的各种各样的bean。
- Aware感知接口:在实际开发中,经常需要用到Spring容器本身的功能资源,例如:BeanNameAware、ApplicationContextAware等等,BeanDefinition 实现了 BeanNameAware、ApplicationContextAware
- BeanPostProcessor:后置处理器。在Bean对象实例化和引入注入完毕后,
- destory:销毁
2.spring的JavaBean管理中单例模式及原型(多例)模式
2.1 . 默认为单例,但是可以配置多例
单例的优点:节约内存;缺点:有变量污染;JavaBean是跟着spring上下文初始化的,容器生对象生,容器死对象死,因为单例只创建一次,所以最开始的时候就创建。
多例的优点:无变量污染;缺点:及其消耗内存;JavaBean是使用的时候才会创建,销毁跟着jvm走。
举例:假如你有两个儿子,他们两个都想要一个玩具车。
案例一,买一个,哥哥上午玩,弟弟下午玩,但是上午哥哥玩的时候如果玩具脏了, 刮花了,那么对于弟弟而言这个玩具已经不是原有车的状态,但是给我们省钱了=====》单例
案例二:买两个,一人一个,这样就不存在污染,各玩各的,但是我们的钱包就扁了======》多例
2.2.举例论证
2.2.1 默认单例
这个就是那辆车,bean对象,这里设了一个变量属性 num 来验证是不是单例,变量改变了
package com.sy.beanlife; import com.sy.ioc.service.UserService; import com.sy.ioc.service.impl.UserServiceImp; import com.sy.ioc.service.impl.UserServiceImpl; import java.util.List; public class ParamAction { private int age; private String name; private List<String> hobby; private int num = 1; private UserService userService=new UserServiceImp(); // private UserBiz userBiz = new UserBizImpl1(); public ParamAction() { super(); } public ParamAction(int age, String name, List<String> hobby) { super(); this.age = age; this.name = name; this.hobby = hobby; } public void execute() { // userBiz.upload(); // userBiz = new UserBizImpl2(); System.out.println("this.num=" + this.num++); userService = new UserServiceImpl(); System.out.println(this.name); System.out.println(this.age); System.out.println(this.hobby); } }
再模拟方法数据,进行测试
package com.sy.beanlife; public class InstanceFactory { public void init() { System.out.println("初始化方法"); } public void destroy() { System.out.println("销毁方法"); } public void service() { System.out.println("业务方法"); } }
然后,进行xml文件配置,
前台测试:是否默认为单例模式,并且变量被污染了,num值发生了变化,说明被污染了,默认为单例模式
效果展示:
2.2.2 设置多例
原代码不变,再xml配置文件中,选择多例
前台测试结果,发现num值没有被污染
结果展示:
2.2.3单例与多例的初始化的时间点
当是多例的时候,不会初始化
而当单例的时候,会初始化
今天小编的分享就结束呐,生活总是需要不断去学习新的知识,多想想然后再去实操,持之以恒,经验和思维都会发生转变,我们要保持谦虚学习和自信的态度,各位加油!