Contents

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方法返回 truefalse。如果返回 true,则意味着请求将继续到达 Controller 被处理。

3. MyBatis