Spring
轻量型,松耦合的集成开发框架
好处
- 轻量
- 控制反转:通过IOC的技术低耦合;一个对象依赖其他对象通过被动的方式传递而不是自己创建对象
- 面向切面:支持面向切面编程,将业务逻辑与系统服务分开
- 容器化
- 方便集成各种框架
- 声明式事务
核心模块
- AOP:通过管理配置管理特性,面向切面编程。该模块基于Spring的应用程序中的对象提供了事务管理服务
- ORM:提供ORM对象关系工具:JDO,Hibernate等
- Web:建立在应用程序上下文模块上,为基于Web应用程序提供上下文
- MVC:是一个全功能的构建Web应用的MVC实现。通过策略接口,MVC编程高度可配置的,MVC容纳了大量视图技术:JSP等
- DAO:DAO抽象层提供了而有意义的异常层次结构,来管理异常处理和不用数据库抛出的错误信息。
- Context:是一个配置文件,向Spring框架提供上下文信息
- Core:提供框架基本功能,管理Spring应用中Bean的创建、配置和管理。主要组件BeanFactory,工厂模式的实现。
IOC和DI
控制反转模式也称作依赖注入:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但是在配置文件中描述哪一个组件需要那一项服务。容器负责将这些联系在一起。
- 原始做法:调用者主动创建被依赖对象,然后再调用被依赖对象的方法
- 简单工厂模式:调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被被依赖对象,最后再调用被依赖对象的方法
IOC就是将这些主动获取变成被动接受。
作用
- 管理对象的创建和依赖关系的维护。
- 解耦,由容器去维护具体的对象
- 托管了类的产生过程,无需关心这些类是怎么产生的
注入方式
- 接口注入
- 构造器注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖
- Setter注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法
Bean的生命周期
- Spring对bean进行实例化
- Spring将值和bean的引用注入到bean对应的属性中
- 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法
- 如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法
- 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用
Spring支持的事务管理类型
- 编程式事务管理:灵活性大,但难维护
- 声明式事务管理:业务与事务分离,只需用注解和xml配置管理
事务的实现方式和实现原理
本质就是数据库对事务的支持,没有数据库的支持,spring也无法提供事务。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现
事务传播行为
- 如果没有事务,就创建一个新的;如果存在就加入
- 如果当前存在就加入,不存在就以非事务执行
- 如果事务存在就加入,不存在就抛异常
- 创建新事务,无论存不存在
- 以非事务执行,如果存在就把事务挂起
- 以非事务执行,如果存在就抛异常
- 如果存在就嵌套事务内执行,不存在就按Required属性执行
BeanFactory与ApplicationContext区别
ApplicationContext是BeanFactory的子接口
依赖关系
BeanFactory是Spring最底层的接口,包含各种Bean的定义。读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。
ApplicationContext因为是子接口,所有拥有BeanFactory的功能外,还提供:
- 继承MessageSource,因此支持国际化
- 统一的资源文件访问方式
- 提供在监听器中注册bean的事件
- 同时加载多个配置文件
- 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
加载方式
BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化
ApplicationContext,它是在容器启动时,一次性创建了所有的Bean
创建方式
BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建
注册方式
BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。
SpringMVC
流程
- 客户端请求
- DispatcherServlet中央处理器接收并寻找处理器HandlerMapping
- 调用处理器Controller
- 调用模型处理业务Service
- 返回ModelAndView给中央处理器
- 处理视图映射
- 将模型数据传给View显示
- 返回客户端
主要包
- 核心容器包
- beans
- context
- core
- expression
- 依赖日志包
- logging
- log4j
- 测试类包
- test
- junit
- 测试类用到AOP包
- aop
常用注解
开启对xx的支持
@EnableAspectJAutoProxy
开启对AOP自动 代理的支持
@EnableAsync
开启异步方法支持
@EnableScheduling
开启计划任务支持
@EnableWebMvc
开启WebMVC的配置支持
@EnableConfigurationProerties
开启对@ConfigurationProperties注解配置Bean的支持
@EnableCaching
开启注解式缓存支持
@EnableTransactionManagement
开启注解式事务支持
用于注册Bean
@Component
调用无参构造创建一个Bean对象,并把对象存入SpringIOC容器,交由容器管理
@Controller
同上,一般作用于表现层
@Service
一般作用于业务层
@Repository
一般作用于持久层
@Bean
用于把当前方法的返回值作为Bean对象存入SpringIOC容器
@Configuration
声明当前类为配置类
@ComponentScan
扫描Component类
@WishlyConfiguration
@Configuration与@ComponentScan结合
用于依赖注入
@Autowired
按照类型装配,若想要按照名称装备需结合@Qualifier
@Qualifier
在自动按照类型注入的基础上,再按照Bean的id注入。
@Resource
按照名称装配,也可通过属性name指定
装配顺序
- 如果同时指定name和type属性,则找到唯一匹配的bean装配
- 如果指定name属性,则按照名称装配
- 如果指定type熟悉感,则按照类型装配
- 既未指定name,又未指定type,则按照名称装配
@Value
将外部的值注入到Bean中
@Value("${jdbc.url}")//注入配置文件
@Value("#{jdbc.url}")//注入其他bean属性
@Value("classpath:com/test.txt")//注入文件资源
用于改变bean的作用范围
@Scope
指定bean作用范围
- value
- singleton:单例
- prototype:多例
- request:每一次请求都会产生一个新的Bean,仅对当前HTTP request内有效
- session:每一次请求都会产生一个新的Bean,仅对当前HTTP session内有效
- global session
生命周期相关的注解
@PostConstruct
指定初始化方法
@PreDestory
指定销毁方法
AOP切面注解
@EnableAspectJAutoProxy
开启Spring对AspectJ代理的支持
@After
在方法执行后执行
@Before
在方法执行前执行
@Aspect
声明切面类
@Around
在方法执行前后执行
@PointCut
声明切点
生命周期
实例化
createBeanInstance()
属性赋值
populateBean()
初始化
initializeBean()
销毁
SpringBoot
好处
- 独立运行:内置Servlet、tomcat、jetty等,不需要打成war包部署
- 简化配置:spring-boot-starter-web启动器自动依赖其他组件,减少了maven配置
- 自动配置:能根据当前类路径下的类、jar包来自动配置bean。
- 无代码生成和xml配置:配置借助于注解完成
- 应用监控:提供一系列端点可以监控服务及应用
核心注解
@SpringBootApplication
- @SpringBootConfiguration:实现配置文件功能
- @EnableAutoConfiguration:打开自动配置功能
- @ComponentScan:Spring组件扫描
SpringBoot中的starters
可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术么不需要到处找示例代码和依赖包。
Spring、SpringMVC、SpringBoot区别
- Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转
- Spring MVC 提供了一种分离式的方法来开发 Web 应用
- Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
MyBatis
半ORM框架,封装了JDBC,开发时只需要关心SQL语句本身,不需要花费精力去加载驱动等过程。可以编写原生态sql,灵活度高
优点
- 基于SQL编写,灵活,接触SQL与程序代码的耦合
- 与JDBC相比,消除了JDBC大量的冗余,不需要手动开关
- 提供映射标签,支持对象与数据库的ORM字段关系映射
缺点
- SQL语句编写工作量大,需要有一定给的SQL功底
- SQL语句依赖于数据库导致数据库移植性差
#{}与${}区别
前者是预编译,后者是字符替换
一级二级缓存
一级缓存
基于HashMap本地缓存,存储作用域为session。默认打开
二级缓存
与一级缓存相同,不同的是作用域为Mapper,并且可自定义存储源。默认不打开,要打开需要实现序列化接口
对于缓存更新机制,当某一作用域下进行了CUD操作后,默认该作用域下所有的select中的缓存将被清空
SqlSession运行过程
映射器的动态代理
-
Mapper映射是通过动态代理来实现的,使用JDK动态代理返回一个代理对象,供调用者访问。
-
实现InvocationHandler接口的类,Mapper是一个接口,会生成MapperMethod对象,调用execute方法
-
MapperMethod采用命令模式,根据不同的sql操作,做不同的处理
-
生成代理类的方法,就是使用JDK动态代理Proxy来创建的
SqlSession下的四大对象
-
Executor:执行器,由它统一调度其他三个对象来执行对应的SQL;
-
StatementHandler:使用数据库的Statement执行操作;
-
ParameterHandler:用于SQL对参数的处理;
-
ResultHandler:进行最后数据集的封装返回处理;
在MyBatis中存在三种执行器
- SIMPLE:简易执行器,默认的执行器;
- REUSE:执行重用预处理语句;
- BATCH:执行重用语句和批量更新,针对批量专用的执行器;