Spring
1、什么是 Spring 的 IOC、DI 和 AOP
IOC(Inversion of Control) 和 DI(Dependecy Injection) 是控制反转和依赖注入,对象的创建不是再像原来通过 new 来创建,而是交给 spring配置来创建,因此称为控制反转。创建对象的工作由spring来完成,然后注入调用者,因此也称为依赖注入。IOC就是一个容器,负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
简单理解就是:JAVA每个业务逻辑处理至少需要两个或者以上的对象协作进行工作,但是每个对象在使用它的合作对象的时候,都需要频繁的new对象来实现,你就会发现,对象间的耦合度高了。而IOC的思想是:Spring容器来管理这些,对象只需要处理本身业务关系就好了。至于什么是控制反转,就是获得依赖对象的方式 反转了。
AOP(Aspect Orient Programming) 面向切面编程,用于声明式事务管理、安全检查、缓存、对象池管理等注入方式:setter 注入,构造器注入,接口注入
- a) setter
- 原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和 setter 方法;“让 ioc 容器调用该setter方法”,将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性中。
- b) 构造器
- 原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数。ioc 容器解析时,实例化目标对象时会自动调用构造方法,ioc只需要为构造器中的参数进行赋值;将 ioc实例化的依赖对象作为构造器的参数传入。
- c) 接口注入
- 原理 : 为依赖对象提供一个接口实现,将接口注入给目标对象,实现将接口的实现类注入的效果。比如HttpServletRequest、HttpServletResponse接口。注意:这是 ioc 提供的方式,spring 中的 ioc 技术并没有实现该种注入方式
2、SpringMVC处理流程
3、Spring启动初始化过程
- 1.用户发送请求至前端控制器DispatcherServlet
- 2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
- 3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
- 4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
- 5.执行处理器Handler(Controller,也叫页面控制器)。
- 6.Handler执行完成返回ModelAndView
- 7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
- 8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- 9.ViewReslover解析后返回具体View
- 10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
- 11.DispatcherServlet响应用户。
作者:CoderZS 链接:www.jianshu.com/p/8a20c547e… 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
4、SpringIOC容器初始化过程
SpringBoot
1、Spring Boot Starter 的工作原理?
- 1) Spring Boot 在启动时扫描项目所依赖的 JAR 包, 寻找包含 spring.factories 文件的 JAR。
- 2) 根据 spring.factories 配置加载 AutoConfigure 类。
- 3) 根据@Conditional 注解的条件, 进行自动配置并将 Bean 注入 SpringContext
@SpringBootApplication
----->>>> @EnableAutoConfiguration
----->>>> @EnableAutoConfigurationImportSelector
----->>>> @AutoConfigurationImportSelector
----->>>> SpringFactoriesLoader(核心)
----->>>> spring.factories
至此找到对应的自动注入配置,进行相应加载AutoConfigure类
@ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean
@ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean
@ConditionalOnClass // 当给定的类名在类路径上存在,则实例化当前Bean
@ConditionalOnMissingClass // 当给定的类名在类路径上不存在,则实例化当前Bean
2、RedisAutoConfiguration 源码解析
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}