当前位置: 首页 > news >正文

配置类

一、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("${user.username:admin}")

三、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

http://www.jsqmd.com/news/325588/

相关文章:

  • hugo
  • CTF Crypto模块系列分享(一):0基础入门!密码学到底在“解什么”
  • CTF Crypto模块系列分享(二):古典密码全解析!签到题秒解秘籍
  • 2026年湖北人造草坪批发实力厂家口碑推荐
  • 基于SpringBoot的设计师约稿平台系统(源码+lw+部署文档+讲解等)
  • 收藏!Java程序员转大模型保姆级指南,小白也能轻松入门(附实战资源)
  • 沃尔玛礼品卡回收平台推荐与回收排行榜揭晓
  • 基于SpringBoot的实验室共享预约系统(源码+lw+部署文档+讲解等)
  • 收藏!年关找工作难?程序员/小白必看,AI大模型两大入门岗位,躺赚春招红利
  • 基于SpringBoot的农业信息管理系统(源码+lw+部署文档+讲解等)
  • 寒假第九天
  • 收藏!大模型技术栈全攻略:从训练部署到 RAG 与 Agent 实战(小白 程序员入门必备)
  • 基于SpringBoot的商场停车场管理系统(源码+lw+部署文档+讲解等)
  • 佳木斯代理记账服务,晨宁财务竞争力强吗,值得选择吗?
  • 2026年黑龙江专业的代理记账企业排名前十有哪些
  • 2026生产管理软件供应服务商推荐,讯睿软件口碑出众
  • 基于SpringBoot的课程评价管理系统(源码+lw+部署文档+讲解等)
  • 2026年佛山口碑好的进销存软件代理企业盘点,哪家更靠谱
  • Return Value Optimization
  • 2026年值得推荐的进销存软件代理企业有哪些
  • 聊聊杭州服务不错的烟酒店,烟酒专卖店口碑哪家好
  • 2026年深圳高温红外测温系统哪家性价比高,铭耀机电上榜
  • 2026年盘点诚信的会计培训在线学校,看看哪个口碑好
  • 2026年株洲靠谱的工程过程审计品牌企业费用情况分析
  • 有名的会计培训网络学校费用多少,哪家比较靠谱?
  • 2026年热收缩包装机推荐厂家,瑞安市华东包装机械好用不贵
  • 探寻全自动尺寸测量仪,好用的品牌排名情况
  • 质量管理AI文档助手:用技术重构质控文档全流程
  • row,column,box控件位置属性的区别
  • JointJS+ v4.2.2 以可视化方式构建和测试营销流程