Spring__容器启动源码

前言:

Spring的基本原理其实就是通过反射解析类和类的各种信息,然后封装成bean定义信息类,constructor信息类,method信息类,property信息类,最后放到一个map里面,这个map就是容器(container), 当写好配置文件后,spring会通过解析配置文件找到制定的package,通过@service等注解利用反射进行解析,解析后放到map中,并未map中的该类赋与一个指定的ID,当需要使用到一个bean的时候,spring会通过容器中需要这个类的定义,并通过构造器new出来(所以构造器要么无参,要么对应参数)对象,这个对象其实是个代理对象,spring内部可以使用jdk动态代理和cglib动态代理(可以根据需要制定,比如在使用shiro的时候),再需要标有@resource或者@autowired的属性,通过setter方法注入对象(DI),如果没有找到该类则跑出异常.

spring除了创建对象之外,还有管理对象,当bean的scope属性是singleton的时候,则后续会继续使用这个bean而不会再次new重新创建,spring会将这个bean方法servletcontext域中,获取的时候每次都是从map的key指定对象。然后从container中找到即可;如果bean的scope属性是session,那么就是将每次new出来的对象放入session域中,使用的时候各自使用各自的bean.不共用同一个对象。

容器启动

1.super()依次调用了AbstractRefreshableConfigApplicationContext,AbstractXmlApplicationContext,AbstractRefreshableConfigApplicationContext,AbstractRefreshableApplicationContext,AbstractApplicationContext这几个父接口(都是接口,每个都有不同的使用场景,这样设计便于管理)


然后内部通过new出来一个spring的资源加载器;

2.setConfigLocations(configLocations)参数是资源文件路路径字符,这一个方法的主要目的就是定位资源文件

3.if(refresh){refresh();}则是解析的过程,这个方法是如果有beanfactory那么就关了它再创建一个,保证beanfactory是独一无二的存在,当这些都执行完成之后,容器启动成功,.如果有错误则启动失败.

猜你喜欢

转载自blog.csdn.net/alan_waker/article/details/53809183