配置类

一、Spring 配置类核心注解

  1. @Configuration

  2. 作用:标记类为 Spring 配置类,等价于 XML 配置中的 <beans> 根标签

  3. 原理:String 启动时会扫描带有 @Configuration 的类,解析其中的 @Bean@Autowired 等注解,完成 Bean 的注册和注入依赖

  4. 特性:@Configuration@Component 的派生注解,因此配置类本省也会被注册为 Spring Bean,可被其他类注入

  5. @Bean

  6. 作用:标注在方法上,方法的返回值会被注册为 IOC 容器中的 Bean,等价于 <bean> 标签

  7. Bean 命名:默认以方法名为 Bean 的名称;也可以自定义名称:@Bean(name = "xxxx")

  8. 作用域:默认是单例(整个 IOC 容器只有一个实例),可通过 @Scope 修改

@Bean
@Scope("prototype") // 原型模式,每次获取Bean创建新实例
public User user7() {
    
    return new User();
}
  1. 依赖传递:@Bean 方法可直接调用其他 @Bean 方法

  2. @Value

  3. 作用:实现外部配置的属性注入,从配置源(application.properties/application.yml、环境变量、命令行参数等)读取值,注入到字段、方法参数、构造器中

  4. 语法:@Value("${配置项key:默认值}"),默认值可选(无默认值且配置项不存在时、启动会抛异常)

// 配置文件中无user.username时,使用默认值"defaultName"
@Value("${user.username:defaultName}")
private String username;

二、Spring Bean 配置类

  1. 核心是通过外部属性注入创建自定义 Bean

// 从配置文件读取user.username、user.password,注入到成员变量
@Value("${user.username}")
private String username;
@Value("${user.password}")
private String password;

// 注册名为user7的User Bean,构造参数拼接了username+"7"
@Bean
public User user7() {
    return new User(username + "7", password);
}

// 注册名为user8的User Bean,构造参数拼接了username+"8"
@Bean
public User user8() {
    return new User(username + "8", password);
}

核心逻辑:通过@Value读取外部配置,再通过@Bean将配置值注入到User对象中,最终注册为 IOC 容器的 Bean。

注意点:若配置文件中未定义user.username/user.password,启动会抛出IllegalArgumentException,建议添加默认值(如`@Value("$

三、Spring MVC 扩展配置

该类实现 WebMvcConfigurer 接口,是自定义配置的核心方式

  1. 作用:Spring MVC 的配置扩展接口,支持自定义拦截器、消息转换器、静态资源映射等

  2. 特点:接口中所有方法均是 default 方法,无需实现所有方法

  3. 核心方法:

  4. addInterceptors:注册拦截器(核心)

  5. addResourceHandlers:配置静态资源映射(如/static/**

  6. configureMessageConverters:配置 HTTP 消息转换器(如 JSON 解析)

  7. 拦截器(HandlerInterceptor)注册流程

  8. 定义拦截器 Bean (@Bean)

 // 将TimeIntercept实例注册为Spring Bean,名称为timeIntercept
@Bean
public TimeIntercept timeIntercept() {
    return new TimeIntercept();
}
  1. 注入拦截器 Bean(@Autowired)

// 自动注入IOC容器中的TimeIntercept类型Bean(即上面@Bean创建的实例)
@Autowired
private TimeIntercept timeIntercept;

@Autowired:按类型(byType) 自动装配 Bean,默认要求必须找到匹配的 Bean(可通过@Autowired(required = false)关闭强制要求)。

  1. 注册拦截器到 Spring MVC(addInterceptors)

@Override
public void addInterceptors(InterceptorRegistry registry) {
    // 添加拦截器实例 + 指定拦截路径(/**匹配所有层级的路径)
    registry.addInterceptor(timeIntercept).addPathPatterns("/**");
}

InterceptorRegistry:拦截器注册器,支持:

  • addInterceptor(拦截器实例):添加自定义拦截器;

  • addPathPatterns(路径):指定拦截的 URL 路径(Ant 风格匹配);

  • excludePathPatterns(路径):指定排除的 URL 路径

路径匹配规则(Ant 风格):

  • /**:匹配所有层级的路径(如//user/user/1);

  • /*:匹配单层路径(如//user,不匹配/user/1);

  • /user:精确匹配/user路径。

四、自定义拦截器实现

  1. 类核心定位与基础依赖

  2. 实现了 HandlerInterceptor 接口,该接口定义了请求处理过程中 3 个拦截时机

  3. 核心作用:在请求到达控制器(Controller)前、控制器执行完成后分别执行逻辑,通过请求域(request)传递数据

  4. HandlerInterceptor 接口方法

  5. 接口定义了三个标准方法,覆盖了 HTTP 请求处理的完整生命周期,所有方法均为非抽象方法

  6. 执行顺序:请求到达服务器 → preHandle()(控制器执行前)→ 执行Controller方法 → postHandle()(控制器执行后/视图渲染前)→ 视图渲染(若有)→ afterCompletion()(视图渲染完成后/最终回调)

  7. preHandle() 方法

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("拦截器执行了,记录开始时间");
    // 获取当前系统时间戳(毫秒),作为请求开始时间
    long t1 = new Date().getTime();
    // 将开始时间存入request请求域,键为startTime,供后续postHandle方法获取
    request.setAttribute("startTime", t1);
    // 核心返回值:true表示放行,false表示拦截
    return true;
}
  1. 触发时机:请求到达 Controller 方法之前,是拦截请求的第一关口

  2. 参数含义:

  • HttpServletRequest request:请求对象,封装了 HTTP 请求的所有信息(URI、参数、请求域),本类用其存储跨方法数据

  • HttpServletResponse response:响应对象,再次设置响应头、重定向、返回错误码

  • Object handler:请求的处理器对象,本质是HandlerMethod类型,对应 Controller 中处理当前请求的具体方法

  1. postHandle () 方法

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
                       @Nullable ModelAndView modelAndView) throws Exception {
    // 从请求域中获取preHandle存入的开始时间,强制转换为Long类型
    long startTime = (Long) request.getAttribute("startTime");
    // 获取当前系统时间戳,作为请求处理的结束时间
    long endTime = new Date().getTime();
    // 打印请求URI + 耗时(结束时间 - 开始时间,单位:毫秒)
    System.out.println(request.getRequestURI() + " 耗时:" + (endTime - startTime));
}
  1. 触发时机:Controller 方法执行完成后,视图(View)渲染之前执行

  2. @Nullable ModelAndView modelAndView:封装了控制器返回的模型数据和视图信息,@Nullable是 Spring 注解,标识该参数可能为 null

posted @ 2026-01-31 11:48  北海道第一原神高手  阅读(0)  评论(0)    收藏  举报