Spring
核心组成模块:
1.spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能
2.spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean
3.spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法
4,spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC
5.spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等
6.spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext
7.spring test:主要为测试提供支持的,支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试
设计模式:工厂模式,单例模式,代理模式,模块模式,观察者模式
IOC:控制反转,即将代码的控制权交给spring容器,让spring容器去进行管理,本质上是工厂模式和反射机制的使用
DI:依赖注入,有spring容器去动态的将依赖关系的对象注入到各种关联组件中
实现方式:接口注入,Setter方法注入,构造器注入
Bean的作用域:singleton,prototype,request,seesion,global-seesion
spring如何处理并发问题:使用ThreadLocal,对每个线程提供一个独立的变量副本,这样每个线程对变量的访问操作都不会影响到其他线程的独立变量,一次也无需对变量进行同步
Bean的生命周期:
bean的实例化阶段
bean的设置属性阶段
bean的初始化阶段
bean的销毁阶段
在bean的初始化阶段,有一个BeanPostProcessor接口,会在初始化前后都调用,在设置属性阶段结束后,调用BeanPostProcessorBeforeInitialization方法之前,会按照顺序执行一系列Aware类型的接口
- BeanNameAware
- BeanClassLoaderAware
- BeanFactoryAware
- EnvironmentAware
- ResourceLoaderAware
- ApplicationEventPublisherAware
- ApplicationContextAware
会依次判断是否执行了该接口,如果执行了则调用改接口的set方法进行配置,然后再初始化
spring的一些注解:@Component,@Controller,@Service,@Autowired,@Resource,@Qualifier,@RequestMapping
@Autowired:通过类型进行匹配,适合Spring
@Resource:默认根据名称进行匹配,再通过类型进行匹配,适合Java SE,也是有J2EE提供
@Component:把对象注入到spring容器中
@Configuration:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象
AOP:面向切面编程,私以为是在不破坏原有代码的情况下,添加跟代码业务无关的功能,然后对多个对象都产生了影响,且可以多次复用,一般用于权限认证,日志,事务处理等等,其本质是代理模式
过滤器:servlet接受请求之后,调用之前使用的,通过web.xml进行配置,依赖于servlet容器,只能操作request跟response
拦截器:servlet调用之后使用的,通过spring文件或者注解(AOP)的方式进行配置,不依赖于servlet容器,可以操作request,response,handler,modeAndView和exception
代理模式:在访问实际对象时,实际上是通过代理对象去访问实际对象,而我们可以在代理对象中添加一些其他的操作,这就是代理模式的本质
静态代理:由程序员编写,或者特定程序生成的,在程序运行之前,已经编译成class文件,但是因此静态代理是固定的,无法对所有的代理类进行统一的处理
动态代理:
JDK动态代理:InvocationHandler接口实现Invoke方法反射调用目标类中的代码,然后Proxy利用InvocationHandler动态创建符合接口的实例,生成目标类的代理对象
CGLIB动态代理:通过继承的方法,当目标没有实现InvocationHandler接口时,指定一个类的子类进行覆盖其中的方法并增强代码
SpringMVC
工作流程:
1、用户发送请求至前端控制器DispatcherServlet;
2 、DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
4、DispatcherServlet 调用 HandlerAdapter处理器适配器;
5、HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
6、Handler执行完成返回ModelAndView;
7、HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
8、DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
9、ViewResolver解析后返回具体View;
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
11、DispatcherServlet响应用户
SpringBoot
核心注解和自动装配原理:
@SpringBootApplication包含了三个注解,@SpringBootConfiguration和@ComponentScan保证了配置和扫描的作用,@EnableAutoConfiguration开启了自动装配。@EnableAutoConfiguration也是一个派生注解,其中的关键功能由@Import实现,其导入的AutoConfigurationImportSelector的selectImpoet()方法,通过SpringFactoriesLoader.loadFactoryNames()方法,去扫描META-INF下的spring.factories文件中所有后缀为EnableAutoConfiguration的配置项所对应的文件,进行自动装配
MyBatis
${}和#{}的区别:${}是拼接符,安全性低,容易出现SQL注入问题,#{}是占位符,会进行预编译处理,安全性高,不会出现SQL注入问题