最近阅读了一下spring的核心代码,彻底弄懂了IOC和AOP的实现原理,下面简单的用自己的话总结归纳一下;
web项目启动时候,无论是使用Tomcat 还是spring boot内嵌tomcat启动,首先都会调用一个servlet,spring使用的servlet是DispatcherServlet
1.他在初始化的时候调用init方法时会做一系列的动作,读取spring指定目录的的配置文件(xml、yml、properties、jar包下的META-INF/spring.factories等),如果文件中的没有的会使用缺省配置,这重要的一步就是拿到扫描路径,spring会扫描指定包路径下的所有class文件,并在其中找到所有带相关注解(@Component@Service@controller等)的类,通过反射的方式创建相应的实体,并维护在spring容器中;之后遍历所有的实体的属性,并将带有相关注解(@autowire 和@resource)的属性通过反射机制予以赋值,这样就实现了IOC;之后还会遍历各个实体中的方法级别的注解,维护一组或多组的对应关系,我打个比方例如@requestMapping注解,其主要是维护一个访问路径和方法的对应关系,当然还有其他的关系维护例如get,post。。。大家应该也能想象的到,不多赘述,之后还会解析形参级的注解(没有注解的形参会视情况给定一个归类)维护一个参数和方法的一个关系,至此初始化的主要工作就做完了(过多细节不多赘述)。
2.初始化完成之后项目就算起来了,之后就可以进行web访问了,一次web的访问流程:首先会根据http访问类型来到DispatcherServlet的相应的get、post。。。方法中,之后根据访问路径来拿取相应的实体和实体下的方法,并根据之前维护的形参注解关系在URL中或者body中拿取到相应的参数集合,之后通过反射的形式调用相应的方法并返回相应结果;其实在这一次的调用的外层还会包裹着其他东西,就是我们要说的AOP了(AOP所说的切面不仅仅是spring中维护的被@Aspect注解实体,其实servlet容器维护的过滤器和spring容器维护的拦截器也都是切面编程的思想体现),他会依次先进去过滤器->拦截器->切面->调用方法->切面->拦截器->过滤器 之后返给servlet,最后返回给调用端;
其实这仅仅是一个简单的描述过程,其中还包含了其他的很多东西比如你引入了持久化层的模块,在容器初始化的时候就会去建立相关的实体,这些实体可以使用连接池,可以是工厂类等,而且他们的属性都是可配置的。
等等等。。。。。。。。。。。。。。