IoC
是一种思想,它将创建对象交给IOC容器管理,DI依赖注入是实现IOC的灵魂,DI注入(交给容器赋值)一般又分为
- 构造方法注入:需要每次去改变原有的代码,会破坏程序的完整性
- Setter 注入:有set方法的前提下,交给由容器来注入,又分为xml和注解两种方式实现
1、xml配置(name-value注入,name-ref引用注入,name-list-value注入,name-array-value注入,name-map-entry注入等),每个bean相当于IOC容器new一个对象
2、注解(@Configuration,@Bean)
AOP
将一些非核心的业务逻辑抽离,实现核心业务和非核心业务的解耦(事务的管理、日志)
核心概念:
引用一个切面aspect ref=“可自定义一个切面”
- 切入点pointcut 具体要切入哪个类的哪些方法(execution(要执行的位置))
- before method="before"把切面里的before方法切入切点之前
它的底层是基于JDK动态代理或者cglib字节码操作技术
静态代理
代理类和本体类实现相同的接口,代理类又要在实体类的基础上进行增强操作(一个代理类new的是一个具体的实体类)
动态代理
要达到多个实体类使用同一个代理类
代理类 implements InvocationHandler(JDK提供的用来抽象代理类的行为)里面有一个invoke()方法,使用invoke里面的method方法来反射调用实体类的方法
JDK和cglib区别
JDK:实现一个InvocationHandler接口里面有一个invoke()方法,利用反射原理实现
cglib:目标类没有实现接口的话,定义CglibProxy类,实现MethodInterceptor接口,实现intercept方法
bean 的作用域有哪些?
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。(仅适用于 WebApplicationContext 环境。)
- session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。(仅适用于 WebApplicationContext 环境。)
- application 作用域:全局的 Web 作用域,类似于 Servlet 中的 Application。
bean的生命周期
spring的常用注解
@Repository
: 对应持久层即 Dao 层,主要用与数据库相关操作。@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。@Controller
: 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。@ComponentScan(value=com.atguigu)
:atguigu下的@Repository
、@Service
、@Controller
全部加到容器中@Configuration
:声明一个类作为配置类,代替xml文件@Component
在类定义之前添加@Component
注解,他会被spring容器识别,并转为bean@Bean
:声明在方法上,将方法的返回值加入Bean容器,代替<bean>
标签@Autowired
:自动装配(把容器中被标记成@Bean的方法拿过来用,名字默认类名首字母小写)- autowired和@resource的区别:
事务
管理事务的方式有几种?
编程式事务,在代码中硬编码。(不推荐使用)
声明式事务,在配置文件中配置(包含基于XML的声明式事务、基于注解的声明式事务)
Spring 事务中的隔离级别有哪几种?(五种)
DEFAULT:使用数据库默认隔离级别(mysql默认可重复读,Oracle默认读已提交)
读未提交
读已提交
可重复读
串行化
Spring 事务中哪几种事务传播行为?(7种)
-
PROPAGATION_REQUIRED:支持当前事务;如果当前没有事务,则创建一个新的事务(最常见)
-
PROPAGATION_MANDATORY(强制的):支持当前事务,如果当前没有事务,就抛出异常
-
PROPAGATION_REQUIRES_NEW(新建一个): 创建一个新的事务,如果当前存在事务,则把当前事务挂起
-
PROPAGATION_NOT_SUPPORTED(不支持): 以非事务方式运行,如果当前存在事务,则把当前事务挂起
-
PROPAGATION_NEVER(绝不支持):以非事务方式运行,如果当前存在事务,则抛出异常
Spring MVC
工作原理
流程说明(重要):
- 客户端(浏览器)发送请求,直接请求到
DispatcherServlet
。 DispatcherServlet
根据请求信息调用HandlerMapping
,解析请求对应的Handler
。- 解析到对应的
Handler
(也就是我们平常说的Controller
控制器)后,开始由HandlerAdapter
适配器处理。 HandlerAdapter
会根据Handler
来调用真正的处理器开处理请求,并处理相应的业务逻辑。- 处理器处理完业务后,会返回一个
ModelAndView
对象,Model
是返回的数据对象,View
是个逻辑上的View
。 ViewResolver
会根据逻辑View
查找实际的View
。DispaterServlet
把返回的Model
传给View
(视图渲染)。- 把
View
返回给请求者(浏览器)
有哪些组件
Spring MVC提供了一种轻度耦合的方式来开发web应用;它是Spring的一个模块,是一个web框架;通过DispatcherServlet, ModelAndView 和 View Resolver,开发web应用变得很容易;解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
常用注解
@Controller:表明是一个控制层
@RequestMapping:用于处理请求地址映射,可以作用于类和方法上
@ResponseBody:作用于方法上,可以将整个返回结果以某种格式返回,如json或xml格式
@RestController:相当于是@Controller和@ResponseBody的组合
@PathVariable 用来接收路径参数,如/news/001,可接收001作为参数,此注解放置在参数前。
@RequestBody和@ResponseBody的区别
@Autowire和Resource区别
Mybatis
#{}和${}的区别
$ {}:直接替换成值可能导致sql注入 name = ‘Jack’ or 1=1,相当于加入一个条件
#{}:解析为一个JDBC预编译语句的参数标记(#{name}解析为 name = ? )则name = '‘Jack’ or 1=1’行不通,只能算是加入了一个值
除了表名、group by后面用到${}(因为#{}默认加载单引号,而表名要加``),一般使用#{}
缓存机制(适用读多写少)
一级缓存:默认开启,作用域在同一个SqlSession下,如果中间有更新操作,将清空一级缓存
二级缓存:
当前会话关闭,一级缓存会放入二级缓存中
先开启缓存(cacheEnabled),在整个mapper里面生效
<cache
eviction="FIFO"//先进先出缓存,默认清除策略是LRU(清除掉最近不常被使用的数据),还有软引用、弱引用
flushInterval="60000"//每隔60秒刷新
size="512"//最多存储512个引用
readOnly="true"
/>
顺序是先走二级缓存再走一级缓存最后走数据库
在mapper中自定义缓存(Ehcache)
在cache后加type选择第三方缓存覆盖实现更多功能
动态sql
修改一个对象时,部分字段为空时不修改,怎么编写sql语句(动态sql)
分页
直接用limit
使用分页插件PageHelper(start:开启页、limit:每页行数)
spring boot流程和优点
是一个基于spring快速配置的一套脚手架配置文件少了,内嵌了servlet容器,可以将项目打包通过.jar运行,快速整合第三方框架,自用默认配置减少开发工作量
spring boot注解
在其中比较重要的有三个注解,分别是:
1)@SpringBootConfiguration // 继承了Configuration,表示当前是注解类
2)@EnableAutoConfiguration // 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助
3)@ComponentScan(excludeFilters = { // 扫描路径设置(具体使用待确认)
cloud组件、优缺点
1.eureka注册中心(Nacos)
2.Ribbon负载均衡
3.Hystrix熔断器
4.Feign声明式调用
5.Gateway网关
6.SpringcloudConfig配置中心(Nacos)
SpringcloudBus消息总线(Nacos)
优点:
服务拆分粒度更细,有利于资源重复利用,有利于提高开发效率
微服务架构采用去中心化思想,服务之间采用Restful等轻量级通讯,比ESB更轻量
适于互联网时代,产品迭代周期更短
缺点:
微服务和分布式系统,开发成本高,不利于维护