原创声明
本文作者:泉幽
转载请务必在文章开头注明出处和作者。
Spring
概念:是一个容器,用于管理对象,底层运用反射将数据存入map;具有lOC控制反转,AOP面向切面编程的特性。
IOC控制反转
概念:本质是一个BeanFactory工厂,采用了单例模式创建代理bean对象,并赋值管理等;最终都交给Spring容器。
使用:通过DI(依赖注入)实现功能
基于XML的DI
基于注解的DI
常见的注解DI注入:@Component,@Respotory,@Service,@Controller
@Autowired | Spring提供的;默认ByType注入引用属性。结合@Qualifier使用ByName。 |
@Ressource | JDK提供的;默认ByName注入引用属性,失败自动使用ByType。 |
注:BeanFactory与FactoryBean的区别,前者是工厂用于创建实例Bean,后者是普通的类。
AOP面向切面编
概念:与业务无关却为业务模块共同调用的逻辑封装(封装公共逻辑),底层是jdk动态代理/CJLIB动态代理,使用AspectJ框架。
使用
横切关注点 | 对哪些方法进行拦截,拦截后怎么处理 |
切面 | 横切关注点的抽象 |
连接点 | 被拦截到的方法 |
切入点 | 对连接点进行拦截的定义 |
通知(advice) | 拦截到连接点之后要执行的代码 前置:@Before |
Spring事务
概念:统一事务的管理及实现类模型,底层运用@Around;具有ACID事务特性,原子性 ( Atomicity )、一致性( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )
使用:一个是编程式事务(精准),另一个是声明式事务(注解)
TransactionTemplate模板
IOC注解@Transactional:
①包含的属性,传播行为,隔离级别,提交/回滚时间,可读性,超时时间等。
②使用的位置,可以标注在类(所有非静态开启事务)或者方法上。
Spring的Bean
bean的生命周期
Bean 创建、Bean 的初始化、Bean的生存期、 Bean 的销毁。
bean的创建方式有四种,构造器,静态工厂,实例工厂,setter注入的方式
不同的bean初始化和创建的时间也不相同。
在作用域为singleton的时候,bean是随着容器一起被创建好并且实例化的
在作用域为pritotype的时候,bean是随着它被调用的时候才创建和实例化完成
bean的作用域
Bean在Spring容器中是单例的(默认情况),@Scope注解来修改Bean的作用域。
singleton :单例(默认)
prototype :每次调用getBean()时,都会执行new操作,返回一个新的Bean。
request :每次HTTP请求都会创建一个新的Bean。
session:同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。
globalSession:同一个全局的Session共享一个Bean,一般用于Portlet环境。
SpringMVC
概念:Spring 的模型-视图-控制器(MVC)框架,核心是围绕一个 DispatcherServlet 来设计的(底层是servlet)。
Mode:对现实事务的抽象,封装了数据和对数据的操作。负责与数据库进行交互。
View:用户界面。
Controller:①能控制对用户输入的响应、响应方式和流程。负责视图和模型之间的交互。
②表现层、业务层、数据访问层。(古老方式有jsp+servlet+javabean)。
SpringMVC执行原理
前端控制器是DispatcherServlet接口实现类,
映射处理器是HandlerMapping接口实现类,
视图解析器是ViewResolver接口实现类,
页面控制器是Controller接口实现类。
![](https://i-blog.csdnimg.cn/blog_migrate/84a04a440db0e9f9b4bdb1b32d89ea8e.png)
图2.1 SpringMVC执行原理
SpringMVC核心技术
重定向 | redirect:"完整路径",不受制于视图解析器。 |
请求转发 | fowrd:"完整路径",不受制于视图解析器。 |
拦截器 | 实现HandlerInterceptor接口三个方法: 1)preHandle(预处理) |
异常处理 | @ExceptionHandler,属性value=异常名.calss;默认=处理其他异常 |
SpringBoot
概念:简化了Spring的开发与项目搭建过程,拥有高效性。同时具有自动配置,起步依赖starter的特性。
嵌入的 Tomcat,无需部署 WAR 文件
简化 Maven 配置
由yam/properties代替了xml的配置
自动配置 Spring(所需功能对应start都存在spring-boot-autoconfigure依赖包中,使用了@Conditonal满足条件则自动实例化bean)
启动流程
SpringBootApplication启动,调用run方法;
=》获取监听器参数配置=》打印Banner信息=》创建并初始化容器=》监听器发送通知。
核心注解
起步类注解 | @SpringBootApplication @CompoentScan( ) |
声明bean对象注解 | @Configuration @Bean(“自定义组件名”) @RestController:等同于@Controller+@ResponseBody 查询:@GetMapping |
扫描注册bean对象包注解 | @MapperScan(“指定mapper包路径” ) @ServletCompoentScan( ) |
导入注册bean对象注解 | @import( "导入指定组件.class") @importResources( ) |
条件注解 | @Conditional:是否实例化bean @AutoConfigAfter |
Mybatis
概念:是一个增强的JDBC,运用反射,动态代理实现DAO接口,能简化数据库CURD。
缓存机制
一级缓存原理(默认且无法关闭)
SqlSession级别,同一个 SqlSession 中进行相同的 SQL 语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存 1024 条 SQL。
二级缓存原理(手动开启)
Mapper级别,同在Mapper的命名空间中,且不同的SqlSession 是可以共享,通过CacheExecutor 先匹配缓存中是否存在,不存在则查询数据库。
注:SqlSession中的getMapper()方法,运用反射,把<mapper>中namesapce和id整合在一起。
配置文件SQL语句
sql语句as,like区别
as:用于修改列别名=属性名
like:模糊查询中使用#{属性名}等同于?
sql语句#{},${} 区别
1.,#占位符号代替【?】,使用PreparedStatement执行sql,效率高,避免sql注入,更安全。
3.,$不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低,有sql注入的风险,缺乏安全性。
5.,$原理是字符串连接,可以控制sql语句,(替换列名,表名等)
配置文件返回值
resultType:同名的列覆给同名属性,一般通过配置文件,设定别名。
resultMap:代码复用方便,列名可以对应不同名字自定义属性。
定义方法返回List<Student> | reslutType=“Student全限定路径/别名” |
定义方法返回int | reslutType=“java.lang.Integer/int” |
定义方法放回Student类 | resultType=“Student全限定路径/别名” |
定义方法返回map | resultType=“java.lang.map/map”,返回一条key:列名,value:列值 |