<Spring必须知道的>
Spring IoC
依赖注入流程
阶段一:收集和注册,我们可以通过XML或者Java代码的方式定义bean,然后通过手动组装或者容器基于某些机制自动扫描的方式,将这些bean定义收集到IoC容器中。
阶段二:分析和组装,分析已经在IoC容器中的bean,然后根据他们之间的依赖关系先后组装它们。
了解一些Java Config
1)表达形式层面
基于XML的配置方式
<beans>
<!-- bean定义>
</beans>
基于JavaConfig的配置方式,任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类
@Configuration
public class MvcConfig{
}2) 注册bean定义层面
基于XML的配置方式
<bean id="service" class="....ServiceImpl">
</bean>
基于JavaConfig的配置形式,任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器
@Bean
public Service service(){
return new ServiceImpl();
}3)表达依赖注入关系层面
基于XML的配置方式
<bean id="service" class="...">
<property name="dependency" ref="dependencyService" />
</bean>
基于JavaConfig的配置形式
@Bean
public Service service(){
return new ServiceImpl();
}
@Bean
public DependencyService dependencyService(){
return new DependencyServiceImpl();
}
@SpringBootApplication
SpringBootApplication是一个三体结构,复合Annotation
@Configuration,一个IoC容器的配置类
@EnableAutoConfiguration,通过Import将所有符合自动配置条件的bean加载到IoC容器中
@ComponentScan
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class
public @interface EnableAutoConfiguration {}借助于Spring框架原有的一个工具类:SpringFactoriesLoader(Spring框架私有的一种扩展方案),主要功能就是从指定的配置文件META-INF/spring.factories加载配置。
@ComponentScan配合一些原信息Java Annotation,比如:@Component, @Repository,自动扫描并批量采集到IoC容器中,默认扫面该类所在包下的所有配置类。
@PropertySource和@PropertySources加载*.properties文件内容到IoC容器
@Import可以导入第三方bean
@ImportResource将多个分开的容器配置合并到一个配置中
过滤器Filter和拦截器Interceptor
使用范围不同
过滤器属于java规范,是Servlet容器规定的,只能在servlet容器中。
拦截器属于spring的一个组件,可以使用spring的所有资源,如service对象,数据源,事务控制。
深度不同
过滤器在servlet前后起作用,典型的调用链。
拦截器能够深入到方法前后,具有更大的弹性,spring框架中可以优先使用。
过滤器和拦截器执行顺序
Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter
Convert/Format机制与HttpMessageConverter关系
Convert/Format SPI,属于spring-core,被整个spring-framework共享。
Convert SPI可以实现任意类型的转换Format支持国际化。
HttpMessageConverter属于spring-web,是SpringMVC对Servlet规范中HttpServletRequest和HttpServletResponse的包装,只负责解析Http包的Body体部分,其余部分交由Convert SPI处理。
*来自:https://segmentfault.com/a/1190000010378116