配置类
一、Spring 配置类核心注解
@Configuration作用:标记类为 Spring 配置类,等价于 XML 配置中的
<beans>根标签原理:String 启动时会扫描带有
@Configuration的类,解析其中的@Bean、@Autowired等注解,完成 Bean 的注册和注入依赖特性:
@Configuration是@Component的派生注解,因此配置类本省也会被注册为 Spring Bean,可被其他类注入@Bean作用:标注在方法上,方法的返回值会被注册为 IOC 容器中的 Bean,等价于
<bean>标签Bean 命名:默认以方法名为 Bean 的名称;也可以自定义名称:
@Bean(name = "xxxx")作用域:默认是单例(整个 IOC 容器只有一个实例),可通过
@Scope修改
@Bean
@Scope("prototype") // 原型模式,每次获取Bean创建新实例
public User user7() {
return new User();
}
依赖传递:
@Bean方法可直接调用其他@Bean方法@Value作用:实现外部配置的属性注入,从配置源(
application.properties/application.yml、环境变量、命令行参数等)读取值,注入到字段、方法参数、构造器中语法:
@Value("${配置项key:默认值}"),默认值可选(无默认值且配置项不存在时、启动会抛异常)
// 配置文件中无user.username时,使用默认值"defaultName"
@Value("${user.username:defaultName}")
private String username;
二、Spring Bean 配置类
核心是通过外部属性注入创建自定义 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 接口,是自定义配置的核心方式
作用:Spring MVC 的配置扩展接口,支持自定义拦截器、消息转换器、静态资源映射等
特点:接口中所有方法均是
default方法,无需实现所有方法核心方法:
addInterceptors:注册拦截器(核心)addResourceHandlers:配置静态资源映射(如/static/**)configureMessageConverters:配置 HTTP 消息转换器(如 JSON 解析)拦截器(HandlerInterceptor)注册流程
定义拦截器 Bean (@Bean)
// 将TimeIntercept实例注册为Spring Bean,名称为timeIntercept
@Bean
public TimeIntercept timeIntercept() {
return new TimeIntercept();
}
注入拦截器 Bean(@Autowired)
// 自动注入IOC容器中的TimeIntercept类型Bean(即上面@Bean创建的实例)
@Autowired
private TimeIntercept timeIntercept;
@Autowired:按类型(byType) 自动装配 Bean,默认要求必须找到匹配的 Bean(可通过@Autowired(required = false)关闭强制要求)。
注册拦截器到 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路径。
四、自定义拦截器实现
类核心定位与基础依赖
实现了
HandlerInterceptor接口,该接口定义了请求处理过程中 3 个拦截时机核心作用:在请求到达控制器(Controller)前、控制器执行完成后分别执行逻辑,通过请求域(request)传递数据
HandlerInterceptor接口方法接口定义了三个标准方法,覆盖了 HTTP 请求处理的完整生命周期,所有方法均为非抽象方法
执行顺序:请求到达服务器 →
preHandle()(控制器执行前)→ 执行Controller方法 →postHandle()(控制器执行后/视图渲染前)→ 视图渲染(若有)→afterCompletion()(视图渲染完成后/最终回调)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;
}
触发时机:请求到达 Controller 方法之前,是拦截请求的第一关口
参数含义:
HttpServletRequest request:请求对象,封装了 HTTP 请求的所有信息(URI、参数、请求域),本类用其存储跨方法数据HttpServletResponse response:响应对象,再次设置响应头、重定向、返回错误码Object handler:请求的处理器对象,本质是HandlerMethod类型,对应 Controller 中处理当前请求的具体方法
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));
}
触发时机:Controller 方法执行完成后,视图(View)渲染之前执行
@Nullable ModelAndView modelAndView:封装了控制器返回的模型数据和视图信息,@Nullable是 Spring 注解,标识该参数可能为 null

浙公网安备 33010602011771号