序言
Java程序员的日常开发一定都离不开Spring的框架,从Spring、SpringMVC、SpringBoot、SpringCloud…
而Spring框架就是Spring家族中最基础也是最重要的一个框架。
Spring
我们常说的Spring往往都绕不开IOC(控制反转)和AOP(切面),其中IOC容器又会帮助我们来管理Java bean,不需要再通过new的方式创建对象,只需要在使用时,在容器中拿即可获得。
而对Spring的使用,基本都是从application-context.xml开始的,xml中的每个bean标签都代表着每个Java的Bean对象,在Bean标签中配置对应的属性,并通过ac来获取具体的Bean对象,那如果在xml中没有配置Bean的信息,在ApplicationContext中也是一定获取不到的。
和Mybatis的步骤相似,从xml到从ac中获取,大体步骤分为以下几步:
Spring中,通过反射来进行对类的创建,避免了new的操作,因为反射照比new操作来讲,更加的灵活,可以获取到对象更多的属性、注解等,并且Spring创建的Bean默认是单例的。
IOC容器
IOC容器负责Spring的Bean管理,从配置文件中获取到Bean和对应的属性,Spring为了方便后续的扩展和预定规范,提供了BeanDefinitionReader来进行规范和扩展。并将xml等配置文件解析成beanDefinition。
通过beanDefinition来生成Bean的实例化对象,那在程序运行的过程中,如果想要动态修改Bean的定义信息,该怎么办?比如说:
<property name = url value =${jdbc.url}>
在读取xml文件时,占位符中的信息都是要根据具体值进行替换的。 如果想随时修改beanDefinition该怎么办?
通过PostProcessor增强器,可以修改Bean的范围、懒加载等。
再回到beanDefinition实例化对象的过程,我们一般说的实例化,其实就是new对象,创建对象的一个过程,而在Spring(JVM)中,实例化是指在堆中开辟空间,对象属性设置默认值。而初始化是填充对象属性,执行init-method方法等。
Spring在创建完整对象的过程中,只是在上面图的基础上进行了更完整的填充。