Spring系列面试题
本文包含spring, spring boot, spring mvc 以及 mybatis的面试题
1. Spring
2. SpringBoot
2.1. SpringBoot 的常用注解有哪些?
@SpringBootApplication
: 标识springboot项目的启动类。
@Configuration
: 用于定义配置类,指出该类是 Bean 配置的信息源,相当于传统的xml配置文件,一般加在主类上。如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。
@ComponentScan
: 组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。默认就会装配标识了@Controller
,@Service
,@Repository
,@Component
注解的类到spring容器中。
@EnableAutoConfiguration
: 允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。
@RestController
: 用于标注控制层组件,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器;它是@Controller
和@ResponseBody
的合集。
@ResponseBody
: 表示该方法的返回结果直接写入HTTP response body中。一般在异步获取数据时使用,在使用@RequestMapping
后,返回值通常解析为跳转路径,加上@responsebody
后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody
后,会直接返回json数据。
@RequestMapping
: RequestMapping是一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@AutoWired
: 把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
@Qualifier
: 当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired
配合使用。
@Bean
: 放在方法上面,而不是类上面,意思是该方法产生的Bean,交给 Spring 来管理。
@Component
: 泛指组件,当组件不好归类的时候,我们可以使用这个注解来标注。
@Service
: 一般作用于 service 层的组件。
@Repository
: 用于标注数据访问组件,即DAO组件。
2.2. SpringBoot 异常处理
通过@ControllerAdvice
和@ExceptionHandler
来处理全局异常。
详细内容参考文章:《SpringBoot异常处理》
2.3. SpringBoot 中如何实现过滤器和拦截器?
(1)过滤器
spring boot 中自定义过滤器只需要实现 Filter 接口,重写里面的init()
,doFilter()
,destroy()
方法即可。
public interface Filter {
//初始化过滤器后执行的操作
default void init(FilterConfig filterConfig) throws ServletException {
}
// 对请求进行过滤
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
// 销毁过滤器后执行的操作,主要用户对某些资源的回收
default void destroy() {
}
}
在配置中注册自定义的过滤器。
@Configuration
public class MyFilterConfig {
@Autowired
MyFilter myFilter;
@Bean
public FilterRegistrationBean<MyFilter> thirdFilter() {
FilterRegistrationBean<MyFilter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(myFilter);
filterRegistrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/api/*")));
return filterRegistrationBean;
}
}
如果有多个过滤器,可以在配置中设置一下顺序,filterRegistrationBean.setOrder(xx);
详情可以参考文章:《SpringBoot 实现过滤器》
(2)拦截器
如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor
接口或继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter
类,并且需要重写下面下面3个方法:
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView)
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex)
注意: preHandle方法返回 true或 false。如果返回 true,则意味着请求将继续到达 Controller 被处理。