Bean的作用域
在spring中,使用在bean标签使用的是scope属性设置的bean的作用域,确定bean是单个实例还是多实例的。
在默认的情况下,spring在每个IOC容器里面声明的的bean创建一个唯一的实例,整个IOC容器范围内的都能够共享该实例的,所有的后续的getBean()调用和bean引用的都将会返回这个唯一的bean实例。singleton,是所有bean的默认作用域。在此作用域下,spring能够精准的知道bean什么时候创建什么时候完成什么时候销毁
当bean的作用域为单例时,Spring会在IOC容器对象创建时就创建bean的对象实例。而当bean的作用域为prototype时,IOC容器在获取bean的实例时创建bean的实例对象,而且每调用一次getBean()就创建一个实例。每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态。当容器创建了bean的实例后,bean的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的bean的生命周期。
类别 | 说明 |
singleton | 在Spring的IOC容器中仅存在一个Bean实例 |
prototype | 每次调用getBean方法都返回一个新的Bean实例 |
request | 每次HTTP请求都会创建一个新的Bean实例,该作用域仅适用于WebApplicationContext环境 bean只是在当前的Request内有效 |
session | 同一个Session会话共享一个Bean实例,该作用域仅适用于WebApplicationContext环境 bean实例只是在当前的session内有效的。 |
Bean的生命周期
spring IOC容器可以管理bean生命周期,spring允许在bean生命周期内特定的时间点进行执行指定的任务。
spring的IOC容器对bean的生命周期进行管理的过程
1、通过构造方法或者是setter的方式创建javabean实例
2、为bean的属性设置值和其他的bean的引用,判断当前 bean的作用域是否为单例,若是,在在对应的缓存中查找,没有查找到的话则新建实例保存。如果不是单例,直接的创建新的实例
3、新建实例后再将注入属性(populateBean),并处理回调创建bean找到@Autowired的对象
创建注入对象,并赋值
在配置bean的时候,可以通过init-method和destory-method属性bean指定初始化和销毁的方法。
IOC的大致流程如下:
大致流程
1.首先根据配置文件找到对应的包,读取包中的类,,找到所有含有@bean,@service等注解的类,利用反射解析它们,包括解析构造器,方法,属性等等,然后封装成各种信息类放到container(其实是一个map)里(ioc容器初始化)
2.获取类时,首先从container中查找是否有这个类,如果没有,则报错,如果有,则通过构造器信息将这个类new出来
3.如果这个类含有其他需要注入的属性,则进行依赖注入,如果有则还是从container找对应的解析类,new出对象,并通过之前解析出来的信息类找到setter方法(setter方法注入),然后用该方法注入对象(这就是依赖注入)。如果其中有一个类container里没找到,则抛出异常
4.如果有嵌套bean的情况,则通过递归解析
5.如果bean的scope是singleton,则会重用这个bean不再重新创建,将这个bean放到一个map里,每次用都先从这个map里面找。如果scope是session,则该bean会放到session里面。
总结:通过解析 xml 文件,获取到bean的属性(id,name,class,scope,属性等等)里面的内容,利用反射原理创建配置文件里类的实例对象,存入到 Spring 的 bean 容器中