面试篇:SSM框架相关
Spring 中常用的依赖注入方式
通过 setter 方法注入
通过构造方法注入
Spring 中IOC 容器常用的接口和具体的实现类
BeanFactory SpringIOC 容器的基本设置,是最底层的实现,面向框架本身的.
ApplicationContext BeanFactory 的子接口, 提供了更多高级的特定. 面向开发者的.
ConfigurableApplicationContext, ApplicationContext 的子接口,扩展出了 close 和 refresh 等关闭刷新容器的方法.
ClassPathXmlApplicationContext:从 classpath 的XML 配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
FileSystemXmlApplicationContext :由文件系统中的XML 配置文件读取上下文。
XmlWebApplicationContext:由Web 应用的 XML 文件读取上下文。
Spring 中如何基于注解配置 Bean 和装配 Bean
(1) 首先要在 Spring中配置开启注解扫描
<context:component-scan base-package=” ”></ context:component-scan>
(2) 在具体的类上加上具体的注解
(3) Spring 中通常使用@Autowired 或者是@Resource 等注解进行 bean 的装配
Spring MVC 中常用注解
注解 | 含义 |
---|---|
@Component | 基本注解,标识一个受 Spring 管理的组件 |
@Controller | 标识为一个表示层的组件 |
@Service | 标识为一个业务层的组件 |
@Repository | 标识为一个持久层的组件 |
@Autowired | 自动装配 |
@Qualifier(“”) | 具体指定要装配的组件的 id 值 |
@RequestMapping() | 完成请求映射 |
@PathVariable | 映射请求 URL 中占位符到请求处理方法的形参 |
Spring Bean 的生命周期
(1) 默认情况下,IOC容器中bean的生命周期分为五个阶段:
调用构造器 或者是通过工厂的方式创建Bean 对象
给 bean 对象的属性注入值
调用初始化方法,进行初始化,初始化方法是通过 init-method 来指定的
使用
IOC 容器关闭时, 销毁 Bean 对象
(2) 当加入了Bean 的后置处理器后,IOC 容器中bean 的生命周期分为七个阶段:
调用构造器 或者是通过工厂的方式创建Bean 对象
给 bean 对象的属性注入值
执行Bean 后置处理器中的 postProcessBeforeInitialization
调用初始化方法,进行初始化, 初始化方法是通过 init-method 来指定的
执行Bean 的后置处理器中 postProcessAfterInitialization
使用
IOC 容器关闭时, 销毁 Bean 对象
Spring MVC 的工作流程
用户发送请求至前端控制器 DispatcherServlet。
DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
DispatcherServlet 调用 HandlerAdapter 处理器适配器。
HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)。
Controller 执行完成返回 ModelAndView。
HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。
DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
ViewReslover 解析后返回具体 View。
DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。
DispatcherServlet 响应用户。
Spring MVC 中拦截器
定义:有两种方式
实现HandlerInterceptor 接口
继承HandlerInterceptorAdapter
<mvc:interceptors> <bean id="myFirstInterceptor" class="com.atguigu.interceptor.MyFirstInterceptor"> <!-- 只针对部分请求拦截或者不拦截 --> <mvc:interceptor> <mvc:mapping path=" " /> <!—指定拦截--> <mvc:exclude-mapping path=””/> <!—指定不拦截--> <bean class=" com.atguigu.interceptor.MySecondInterceptor " /> </mvc:interceptor>
拦截器中三个重要的方法:
preHandle 控制器执行前调用此方法
postHandle 控制器执行后未返回视图调用
afterCompletion 控制器执行后返回视图后调用
MyBatis 相关
MyBatis 中 #{}和${}
#{}是预编译处理,${}是字符串替换;
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
Mybatis 在处理${}时,就是把${}替换成变量的值;
使用#{}可以有效的防止 SQL 注入,提高系统安全性。
Mybatis 结果集的映射方式
自动映射,通过 resultType 来指定要映射的类型即可。
自定义映射,通过 resultMap 来完成具体的映射规则,指定将结果集中的哪个列映射到对象的哪个属性。
MyBatis 如何获取自动生成的(主)键值
在标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的主键值。
示例:
<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
insert into names (name) values (#{name})
</insert>
Mybatis 的动态 SQL
动态 SQL 是 MyBatis 的强大特性之一 基于功能强大的 OGNL 表达式。
动态 SQL 主要是来解决查询条件不确定的情况,在程序运行期间,根据提交的条件动态的完成查询。
常用的标签:
"if" : 进行条件的判断
"where":在"if"判断后的 SQL 语句前面添加 WHERE 关键字,并处理 SQL 语句开始位置的 AND 或者 OR 的问题
"trim":可以在 SQL 语句前后进行添加指定字符 或者去掉指定字符.
"set": 主要用于修改操作时出现的逗号问题
"choose" "when" "otherwise":类似于 java 中的 switch 语句.在所有的条件中选择其一
"foreach":迭代操作
Mybatis 如何完成 MySQL 的批量操作
MyBatis 完成 MySQL 的批量操作主要是通过标签来拼装相应的SQL语句。
例如:
<insert id="insertBatch" >
<foreach collection="emps" item="curr_emp" separator=",">
insert into tbl_employee(last_name,email,gender,d_id) values
</foreach>
</insert>
Spring 中 bean 的作用域
总共有四种作用域:
Singleton 单例的
Prototype 原型的
Request
Session
Spring 中自动装配常
byName: 根据 bean 对象的属性名进行装配
byType: 根据 bean 对象的属性的类型进行装配,需要注意匹配到多个兼容类型的 bean 对象时,会抛出异常。
@Autowired及required属性
(1) 首先会使用 byType 的方式进行自动装配,如果能唯一匹配,则装配成功, 如果匹配到多个兼容类型的 bean, 还会尝试使用 byName 的方式进行唯一确定. 如果能唯一确定,则装配成功,如果不能唯
一确定,则装配失败,抛出异常.
(2) 默认情况下,使用@Autowired 标注的属性必须被装配,如果装配不了,也会抛出异常. 可以使用 required=false 来设置不是必须要被装配.
Springmvc 中 ContextLoaderListener 的作用以及实现原理
作用:
ContextLoaderListener 的作用是通过监听的方式在 WEB 应用服务器启动时将 Spring 的容器对象进行初始化.
原理:
ContextLoaderListener 实现了 ServletContextListener 接口,用于监听
ServletContext 的创建,当监听到 ServletContext 创建时,在对应contextInitialized方法中,将 Spring 的容器对象进行创建,并将创建好的容器对象设置到ServletContext 域对象中, 目
的是让各个组件可以通过 ServletContext 共享到Spring的容器对象
Mybatis 提供的两级缓存,以及缓存的查找顺序
(1)MyBatis 的缓存分为一级缓存和 二级缓存。一级缓存是 SqlSession 级别的缓存,默认开启。二级缓存是 NameSpace 级别(Mapper)的缓存,多个 SqlSession 可以共享,使用时需要进行配置开
启。
(2)缓存的查找顺序:二级缓存 => 一级缓存 => 数据库
Spring 与 Mybatis 整合
(1) SqlSession 创建的问题,通过 SqlSessionFactoryBean 来配置用于创建 SqlSession 的信息。例如: Mybatis 的核心配置文件、Mapper 映射文件、数据源等
(2) Mapper 接口创建的问题, 使用 MapperScannerConŨgurer 批量为 MyBatis 的 Mapper 接口生成代理实现类并将具体的对象交给 Spring 容器管理
Spring 声明式事务中@Transaction 中常用的两种事务传播行为
通过 propagation 来执行事务的传播行为
REQUIRED:使用调用者的事务,如果调用者没有事务,则启动新的事务运行
REQUIRES_NEW:将调用者的事务挂起,开启新的事务运行。
@RequestMapping 注解
(1) 该注解的作用是用来完成请求 与 请求处理方法的映射
(2) 该注解可以标注在类上或者是方法上
(3) 常用的属性:
value: 默认属性, 用于指定映射的请求URL
method: 指定映射的请求方式
params: 指定映射的请求参数
headers: 指定映射的请求头信息
Springmvc 中处理模型数据的两种方式
使用 ModelAndView 作为方法的返回值,将模型数据和视图信息封装到 ModelAndView 中
使用 Map 或者是 Model 作为方法的形参,将模型数据添加到 Map 或者是 Model 中
REST 中的四种请求方式
GET 查询操作
POST 添加操作
DELETE 删除操作
PUT 修改操作
视图和视图解析
视图是由视图解析器解析得到的
视图解析器的作用是根据 ModelAndView 中的信息解析得到具体的视图对象
视图的作用是完成模型数据的渲染工作,最终完成转发或者是重定向的操作
Springmvc 中如何返回 JSON 数据
1:在项目中加入 json 转换的依赖,例如 jackson,fastjson,gson 等
2:在请求处理方法中将返回值改为具体返回的数据的类型, 例如数据的集合类 List等
3:在请求处理方法上使用@ResponseBody 注解
Spring 中切面中常用的几种通知
前置通知 在目标方法执行之前执行
后置通知 在目标方法执行之后执行,不管目标方法有没有抛出异常
返回通知 在目标方法成功返回之后执行, 可以获取到目标方法的返回值异常通知 在目标方法抛出异常后执行
环绕通知 环绕着目标方法执行
SpringMVC 的工作原理
(1)用户向服务器发送请求,请求被 springMVC 前端控制器 DispatchServlet 捕获;
(2)DispatcherServle 对请求 URL 进行解析,得到请求资源标识符( URL), 然后根据该 URL 调用 HandlerMapping 将请求映射到处理器HandlerExcutionChain;
(3)DispatchServlet 根据获得 Handler 选择一个合适的HandlerAdapter 适配器处理;
(4)Handler 对数据处理完成以后将返回一个 ModelAndView()对象给 DisPatchServlet;
(5)Handler 返回的 ModelAndView() 只是一个逻辑视图并不是一个正式的视图, DispatcherSevlet 通过 ViewResolver 试图解析器将逻辑视图转化为真正的视图 View;
(6)DispatcherServle 通过 ModelAndView()view并返回给客户端;
对 Spring 的理解
Spring 是一个开源框架,为简化企业级应用开发而生。Spring 可以是使简单的JavaBean 实现以前只有 EJB 才能实现的功能。Spring 是一个 IOC 和 AOP容器框架。
Spring 容器的主要核心是:
控制反转(IOC)
传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者 getInstance 等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用 spring 提供的对象就可以了,这是控制反转的思想。
依赖注入(DI)
spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想。
面向切面编程(AOP)
在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方 面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用CGLIB 方式实现动态代理。
Spring 中常用的设计模式
(1) 代理模式——spring 中两种代理方式,若目标对象实现了若干接口,spring 使用 jdk 的java.lang.reũect.Proxy 类代理。若目标兑现没有实现任何接口,spring 使用 CGLIB 库生成目标类的子类。
(2) 单例模式——在 spring 的配置文件中设置 bean 默认为单例模式。
(3) 模板方式模式——用来解决代码重复的问题。比如:RestTemplate、JmsTemplate、JpaTemplate
(4) 工厂模式——在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用同一个接口来指向新创建的对象。Spring 中使用beanFactory 来创建对象的实例。
Spring 的事务管理
(1)声明式事务管理的定义:
用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可,这样维护起来极其方便。
基于 TransactionInterceptor 的声明式事务管理:两个次要的属性: transactionManager,用来指定一个事务治理器,并将具体事务相关的操作请托给它;其他一个是 Properties 类型的transactionAttributes 属性,该属性的每一个键值对中,键指定的是方法名,方法名可以行使通配符,而值就是表现呼应方法的所运用的事务属性。
(2)基于 @Transactional 的声明式事务管理:
Spring 2.x 还引入了基于 Annotation 的体式格式,具体次要触及@Transactional 标注。@Transactional 可以浸染于接口、接口方法、类和类方法上。算作用于类上时,该类的一切public 方法将都具有该类型的事务属性。
(3)编程式事物管理的定义:
在代码中显式挪用 beginTransaction()、commit()、rollback()等事务治理相关的方法, 这就是编程式事务管理。Spring 对事物的编程式管理有基于底层 API 的编程式管理和基于 TransactionTemplate 的编程式事务管理两种方式。