SSM SpringBoot
SSM
8.1 请写出 spring 中常用的依赖注入方式
通过 setter 方法注入
通过构造方法注入
8.3 简述Spring中如何基于注解配置Bean和装配Bean
(1)首先要在Spring中配置开启注解扫描
<context:component-scan base-package=” ”></ context:component-scan>
(2)在具体的类上加上具体的注解
(3)Spring 中通常使用@Autowired 或者是@Resource 等注解进行bean的装配
@Autowired的使用:推荐对构造函数进行注释

8.4 说出Spring 或者 Springmvc中常用的5个注解,并解释含义
@Component 基本注解,标识一个受Spring管理的组件
@Controller 标识为一个表示层的组件
@Service 标识为一个业务层的组件
@Repository 标识为一个持久层的组件
@Autowired 自动装配
@Qualifier(“”) 具体指定要装配的组件的id值
@RequestMapping() 完成请求映射
8.5 请解释Spring Bean的生命周期?
默认情况下,IOC容器中bean的生命周期分为五个阶段: ● 调用构造器 或者是通过工厂的方式创建Bean对象 ● bean对象的属性注入值 ● 调用初始化方法,进行初始化,初始化方法是通过init-method来指定的. ● 使用 ● IOC容器关闭时, 销毁Bean对象.
8.6 简单的谈一下SpringMVC的工作流程?
● 用户发送请求至前端控制器DispatcherServlet
● DispatcherServlet收到请求调用HandlerMapping处理器映射器。
● 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返 回给DispatcherServlet。
● DispatcherServlet调用HandlerAdapter处理器适配器
● HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
● Controller执行完成返回ModelAndView
● HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
● DispatcherServlet将ModelAndView传给ViewReslover视图解析器
● ViewReslover解析后返回具体View
● DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
● DispatcherServlet响应用户
8.7 SpringMVC中如何解决POST请求中文乱码问题
Springmvc中通过CharacterEncodingFilter解决中文乱码问题.
在web.xml中加入:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8.8 简述SpringMvc里面拦截器是如何定义,如何配置,拦截器中三个重要的方法
定义:有两种方式
- 实现HandlerInterceptor接口
- 继承HandlerInterceptorAdapte
<mvc:interceptors> <!--默认是对所有请求都拦截 --> <bean id="myFirstInterceptor" class="com.atguigu.interceptor.MyFirstInterceptor"> </bean> <!-- 只针对部分请求拦截或者不拦截 --> <mvc:interceptor> <mvc:mapping path=" " /> <!—指定拦截--> <mvc:exclude-mapping path=””/> <!—指定不拦截--> <bean class=" com.atguigu.interceptor.MySecondInterceptor " /> </mvc:interceptor> </mvc:interceptors>
拦截器中三个重要的方法:
preHandle
postHandle
afterCompletion
preHandle
调用时间:Controller方法处理之前
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
若返回false,则中断执行,注意:不会进入afterCompletion
postHandle
调用前提:preHandle返回true
调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
备注:postHandle虽然post打头,但post、get方法都能处理
afterCompletion
调用前提:preHandle返回true
调用时间:DispatcherServlet进行视图的渲染之后
多用于清理资源
8.9 MyBatis中 #{}和${}的区别是什么?
#{}是预编译处理,${}是字符串替换; Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; Mybatis在处理${}时,就是把${}替换成变量的值; 使用#{}可以有效的防止SQL注入,提高系统安全性。
8.10 Mybatis 结果集的映射方式有几种,并分别解释每种映射方式如何使用。
自动映射 ,通过resultType来指定要映射的类型即可。
自定义映射 通过resultMap来完成具体的映射规则,指定将结果集中的哪个列映射到对象的哪个属性。
8.12 MyBatis如何获取自动生成的(主)键值?
在<insert>标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的主键值。
示例:
<insert id="insertAward" parameterType="com.imooc.myo2o.entity.Award" useGeneratedKeys="true" keyProperty="awardId" keyColumn="award_id">
8.13 简述Mybatis的动态SQL,列出常用的6个标签及作用
常用的标签: <if> : 进行条件的判断 <where>:在<if>判断后的SQL语句前面添加WHERE关键字,并处理SQL语句开始位置的AND 或者OR的问题 <trim>:可以在SQL语句前后进行添加指定字符 或者去掉指定字符. <set>: 主要用于修改操作时出现的逗号问题 <choose> <when> <otherwise>:类似于java中的switch语句.在所有的条件中选择其一 <foreach>:迭代操作
8.14 Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复。
8.15 Mybatis 如何完成MySQL的批量操作,举例说明
<insert id="insertBatch" >
insert into tbl_employee(last_name,email,gender,d_id) values
<foreach collection="emps" item="curr_emp" separator=",">
(#{curr_emp.lastName},#{curr_emp.email},#{curr_emp.gender},#{curr_emp.dept.id})
</foreach>
</insert>
mybatis 有哪些执行器(Executor)?
》》》》 参考文章 《《《《
Mybatis有三种基本的Executor执行器:
SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
Mybatis中如何指定使用哪一种Executor执行器?
答:在Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
8.16 简述Spring中如何给bean对象注入集合类型的属性
Spring使用 <list> <set> <map> 等标签给对应类型的集合注入值
8.17 简述Spring 中bean的作用域
总共有四种作用域:
● Singleton 单例的
● Prototype 原型的
● Request
● Session
8.18 简述Spring中自动装配常用的两种装配模式
byName: 根据bean对象的属性名进行装配
byType: 根据bean对象的属性的类型进行装配,需要注意匹配到多个兼容类型的bean对象时,会抛出异常。
8.19 请解释@Autowired注解的工作机制及required属性的作用
(1)首先会使用byType的方式进行自动装配,如果能唯一匹配,则装配成功,
如果匹配到多个兼容类型的bean, 还会尝试使用byName的方式进行唯一确定.
如果能唯一确定,则装配成功,如果不能唯一确定,则装配失败,抛出异常.
(2)默认情况下, 使用@Autowired标注的属性必须被装配,如果装配不了,也会抛出异常.
可以使用required=false来设置不是必须要被装配.
8.21 简述Mybatis提供的两级缓存,以及缓存的查找顺序
》》》》 参考文章 《《《《
1)MyBatis的缓存分为一级缓存和 二级缓存。 一级缓存是SqlSession级别的缓存,默认开启。 二级缓存是NameSpace级别(Mapper)的缓存,多个SqlSession可以共享,使用时需要进行配置开启。 (2)缓存的查找顺序:二级缓存 => 一级缓存 => 数据库
8.22 简述Spring与Springmvc整合时,如何解决bean被创建两次的问题
8.23 简述Spring与Mybatis整合时,主要整合的两个地方
(1)SqlSession创建的问题,通过SqlSessionFactoryBean来配置用于创建SqlSession的信息。例如: Mybatis的核心配置文件、Mapper映射文件、数据源等
(2)Mapper接口创建的问题, 使用MapperScannerConfigurer批量为MyBatis的Mapper接口生成代理实现类并将具体的对象交给Spring容器管理
8.24 简述Spring声明式事务中@Transaction中常用的两种事务传播行为(沒看懂)
通过propagation来执行事务的传播行为
REQUIRED:使用调用者的事务,如果调用者没有事务,则启动新的事务运行
REQUIRES_NEW:将调用者的事务挂起,开启新的事务运行。
8.25 简述@RequestMapping注解的作用,可标注的位置,常用的属性
(1)该注解的作用是用来完成请求 与 请求处理方法的映射 (2)该注解可以标注在类上或者是方法上 (3)常用的属性: value: 默认属性, 用于指定映射的请求URL method: 指定映射的请求方式 params: 指定映射的请求参数 headers: 指定映射的请求头信息
8.26 简述Springmvc中处理模型数据的两种方式
● 使用ModelAndView 作为方法的返回值,将模型数据和视图信息封装到ModelAndView中
● 使用Map或者是Model 作为方法的形参,将模型数据添加到Map或者是Model中
8.27 简述REST中的四种请求方式及对应的操作
GET 查询操作
POST 添加操作
DELETE 删除操作
PUT 修改操作
8.28 简述视图和视图解析的关系及作用
● 视图是由视图解析器解析得到的。
● 视图解析器的作用是根据ModelAndView中的信息解析得到具体的视图对象
● 视图的作用是完成模型数据的渲染工作,最终完成转发或者是重定向的操作
8.31 简述Springmvc中如何返回JSON数据
Step1:在项目中加入json转换的依赖,例如jackson,fastjson,gson等 Step2:在请求处理方法中将返回值改为具体返回的数据的类型, 例如数据的集合类List<Employee>等 Step3:在请求处理方法上使用@ResponseBody注解 这里再补充一个注意点:使用@ResponseBody注解需要开启注解驱动功能,也就是需要配置
8.34 如何在Springmvc中获取客户端提交的请求参数
直接在请求处理方法中声明对应的形参,也可以是用@RequestParam注解来具体指定将那些请求参数映射到方法中对应的形参。8.35 简述Springmvc中InternalResourceViewResolver解析器的工作机制
使用prefix + 方法的返回值 + suffix 生成一个物理视图路径。
Spring Aop的理解:
8.37 简述Spring中切面中常用的几种通知,并简单解释
前置通知 在目标方法执行之前执行
后置通知 在目标方法执行之后执行,不管目标方法有没有抛出异常
返回通知 在目标方法成功返回之后执行, 可以获取到目标方法的返回值
异常通知 在目标方法抛出异常后执行
环绕通知 环绕着目标方法执行
8.39 简述Mybatis中使用Mapper接口开发,如何完成Mapper接口与SQL映射文件、方法与SQL语句的绑定
Mapper接口与SQL映射文件绑定:SQL映射文件中的namespace的值指定成Mapper接口的全类名
接口中方法与SQL语句的绑定:SQL语句的id 指定成接口中的方法名。
转载自:http://www.atguigu.com/mst/java/gaopin/17832.html
1. 作用域不同 @Component是作用于类上的,而@Bean是作用于方法上的 2. @Component是通过类路径扫描的方式注入到spring容器中的,而@Bean是在标注该注解的地方生成一个Bean。 3. @Bean比@Component的自定义行更强,很多地方只能通过@Bean的方式来注册Bean.
Spring部分:
SpringMvc部分
https://blog.csdn.net/weixin_44176169/article/details/104852285
Mybatis部分
https://blog.csdn.net/weixin_44176169/article/details/104762550
SpringBoot
为什么要用 Spring Boot?
- 独立运行
Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
- 简化配置
spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。除此之外,还提供了各种启动器,开发者能快速上手。
- 自动配置
Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
- 无代码生成和XML配置
Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
- 应用监控
Spring Boot提供一系列端点可以监控服务及应用,做健康检测
- 开箱即用
Spring Boot有哪些缺点?
Spring Boot虽然上手很容易,但如果你不了解其核心技术及流程,所以一旦遇到问题就很棘手,而且现在的解决方案也不是很多,需要一个完善的过程。
什么是 JavaConfig?
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于: (1)面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。 (2)减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。
JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。
从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。 (3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。
Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
● @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,
如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
● @ComponentScan:Spring组件扫描。
开启 Spring Boot 特性有哪几种方式?
1)继承spring-boot-starter-parent项目
2)导入spring-boot-dependencies项目依赖
Spring Boot 自动配置原理是什么?
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,
@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。
筛选有效的自动配置类。
每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能
Spring Boot 有哪几种读取配置的方式?
@Value,@ConfigurationProperties,@PropertySource
Spring Boot 如何定义多套不同环境配置?
spring.profiles.active
Spring Boot 中如何解决跨域问题 ?
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,
在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。
这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,
现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
项目中前后端分离部署,所以需要解决跨域的问题。
我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。
当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。
我们知道一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
什么是 CSRF 攻击?
CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

浙公网安备 33010602011771号