Loading

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被创建两次的问题

 Bean被创建两次的问题是在组建扫描的配置中指定Springmvc只负责扫描WEB相关的组件,Spring扫描除了Springmvc之外的组件。

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

@Component 和 @Bean 的区别是什么

1. 作用域不同 @Component是作用于类上的,而@Bean是作用于方法上的
2. @Component是通过类路径扫描的方式注入到spring容器中的,而@Bean是在标注该注解的地方生成一个Bean。
3. @Bean比@Component的自定义行更强,很多地方只能通过@Bean的方式来注册Bean.

Spring部分:

来源博客:

https://www.cnblogs.com/429lirui/p/13576999.html

https://www.cnblogs.com/aishangJava/p/13463192.html

SpringMvc部分

https://blog.csdn.net/weixin_44176169/article/details/104852285

Mybatis部分

https://blog.csdn.net/weixin_44176169/article/details/104762550

SpringBoot

相关博客: https://blog.csdn.net/ThinkWon/article/details/104397299

为什么要用 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 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

 

 

 
 
posted @ 2021-02-18 16:11  Robinzhao  阅读(129)  评论(0)    收藏  举报