知识点:
1.通过属性文件配置Bean(1)
知识点 |
核心内容 |
易混淆点/难点 |
应用场景 |
Bean后置处理器 |
配置与底层机制解析,需结合AOP概念逐步讲解 |
底层机制理解需结合源码实践 |
Spring框架中Bean生命周期管理 |
属性文件注入值 |
通过.properties文件动态配置Bean属性(如数据库连接参数) |
Unicode编码处理、classpath:路径前缀的必填性 |
外部化配置(如数据库连接池、多环境切换) |
context:property-placeholder |
指定属性文件位置(需配合location属性及classpath:前缀) |
Namespace未绑定报错(需通过Alt+Enter自动修复) |
集中管理敏感配置或频繁变更的参数 |
属性引用语法 |
使用${key}表达式引用属性文件中的值 |
属性名需与文件中的键名严格一致 |
动态注入Bean属性(如monsterID=${monsterID}) |
中文编码问题 |
属性文件中的中文需处理Unicode转义(示例未展开) |
未配置编码可能导致乱码 |
国际化或多语言支持场景 |
2.通过属性文件配置Bean(2)
知识点 |
核心内容 |
易混淆点/难点 |
操作要点 |
属性文件中文编码问题 |
属性文件读取中文时出现乱码,需转换为Unicode编码 |
文件默认编码(如UTF-8)与Unicode编码的差异 |
使用站长工具转换:将中文(如“乌龟精”)粘贴至工具,生成Unicode编码后替换原内容 |
Unicode编码工具使用 |
通过在线工具(如站长工具)实现中文转Unicode |
工具操作步骤的准确性(如输入框粘贴、点击转换按钮) |
1. 输入中文文本 2. 点击“中文转Unicode” 3. 复制结果至属性文件 |
配置文件编码规范 |
属性文件通常以英文/数字为主,中文需特殊处理 |
中文配置的适用场景(如特殊案例) |
优先避免中文配置,必要时按流程转换 |
乱码问题排查逻辑 |
乱码根源为文件编码不匹配(非Unicode) |
编码类型判断错误(如误用ASCII或UTF-8) |
检查文件编码格式,确认是否为Unicode |
3.自动装配Bean(1)
知识点 |
核心内容 |
重点 |
XML的自动装配 |
通过autowire属性实现Spring容器中对象的自动依赖注入,支持byType和byName两种方式 |
byType需确保容器中同类型对象唯一,否则报错;byName需属性名与bean的id匹配 |
自动装配原理 |
容器根据类型或名称自动查找并注入依赖对象(如OrderService自动注入OrderDao) |
属性必须有setter方法;无属性的类无需配置autowire |
byType装配限制 |
容器中不能存在多个同类型的bean实例(如两个OrderDao会触发NoUniqueBeanDefinitionException) |
需检查重复定义问题,优先保证类型唯一性 |
装配验证方法 |
通过输出对象哈希值或调用链验证依赖是否成功注入(如orderAction.getService().getDao()) |
空指针异常表明装配失败,需检查配置或依赖关系 |
与传统配置对比 |
替代手动<property ref>标签,简化XML配置 |
灵活性较低,复杂场景仍需显式配置 |
4.自动装配Bean(2)
知识点 |
核心内容 |
重点 |
自动装配by name机制 |
通过属性的set方法名(如setOrderDao)而非属性名来匹配容器中的bean ID |
易混淆点:不是按属性名匹配,而是按set方法后缀匹配 |
自动装配by type机制 |
根据类型匹配容器中的bean,不依赖命名 |
当存在多个同类型bean时会报错 |
装配失败场景 |
set方法名与bean ID不匹配时会导致装配失败 |
示例:setOrderService2需要匹配ID为orderService2的bean |
底层实现原理 |
基于反射机制实现自动装配 |
关键点:通过解析set方法名确定匹配规则 |
Spring学习路径 |
掌握反射机制是理解Spring底层的关键 |
对Java基础要求较高,是学习SSM/Spring Boot的基础 |
5.Spring El 表达式配置Bean
知识点 |
核心内容 |
重点 |
Spring EL表达式 |
运行时查询和操作对象的表达式机制 |
井号大括号界定符 vs JSP EL表达式 |
表达式赋值方式 |
字面量赋值、引用其他bean、调用方法返回值 |
静态方法调用需全类名 |
属性注入类型 |
基本类型、对象引用、方法返回值、运算结果 |
对象引用需提前配置对应bean |
方法调用特性 |
支持实例方法和静态方法返回值注入 |
静态方法调用语法T(全类名).方法() |
运算表达式 |
支持算术运算结果直接赋值 |
表达式计算发生在容器初始化阶段 |
6.注解配置Bean基本介绍
知识点 |
核心内容 |
重点 |
基于注解配置Bean |
通过注解(如@Component、@Controller、@Service、@Repository)标识组件类,简化Spring配置 |
注解作用范围区分(@Controller vs @Service vs @Repository) |
@Component |
通用组件注解,标识类为Spring管理的组件 |
需手动实现业务逻辑,注解仅声明作用 |
@Controller |
标识控制器类(如Servlet),用于Web层 |
与传统Servlet配置对比,需结合业务代码 |
@Service |
标识业务逻辑处理类(Service层) |
注解本身不实现功能,需开发者编码 |
@Repository |
标识持久化层类(DAO层) |
与@Component通用性区别,数据库操作专属 |
7.注解配置Bean快速入门(1)
知识点 |
核心内容 |
重点 |
基于注解配置 |
使用注解标识不同层级的类(@Repository/@Service/@Controller/@Component) |
注解与XML配置的区别 |
AOP包引入 |
必须引入aop包并添加到项目库(lib目录下需Add as Library) |
遗漏包导致注解失效 |
注解作用域 |
@Repository标识持久化层;@Service标识业务层;@Controller标识控制器(通常为Servlet);@Component为通用组件 |
混淆@Controller与普通类注解 |
项目结构规范 |
实际开发需按层级分包(如dao/service/web),示例为教学简化统一放在component包 |
包路径对扫描的影响 |
注解扫描机制 |
Spring容器自动扫描注解类并创建实例到IOC容器 |
未正确配置扫描路径的后果 |
8.注解配置Bean快速入门(2)
知识点 |
核心内容 |
重点 |
Spring注解配置 |
通过@ComponentScan配置自动扫描包路径下的注解类 |
必须同时满足:1.类添加注解 2.配置扫描路径 |
四大核心注解 |
@Controller @Service @Repository @Component |
注解功能等效,语义化区分架构层级 |
Bean命名规则 |
默认采用类名首字母小写作为ID |
显式指定ID:@Service("customName") |
扫描机制验证 |
通过Debug模式查看singletonObjects表 |
常见错误:漏配扫描路径/拼写错误 |
依赖注入方式 |
支持按类型和按ID两种获取方式 |
推荐按类型注入(需确保类唯一) |
配置标签详解 |
<context:component-scan base-package="com.xx"> |
必须引入context命名空间 |
测试验证方法 |
1. 移除注解测试 2. 移除扫描配置测试 |
报错信息NoSuchBeanDefinitionException分析 |
9.注解配置Bean注意事项和细节(1)
知识点 |
核心内容 |
重点 |
基于注解配置Bean的依赖包 |
必须引入指定jar包,否则会报错 |
易忽略jar包引入,导致配置失效 |
自动扫描包配置 |
需在Spring配置文件中通过<context:component-scan>标签指定扫描包路径 |
未导入context命名空间会触发错误提示 |
通配符扫描子包 |
使用com.xxx.*格式可递归扫描当前包及其所有子包 |
直接写包名(不加通配符)仍会扫描子包(底层递归机制) |
注解类扫描验证 |
通过getBean()或Debug模式检查容器中是否存在目标类实例 |
需确认类位置是否在指定包/子包下(避免同名类干扰) |
默认Bean ID规则 |
未显式指定ID时,默认以类名首字母小写作为ID(如Pig→pig) |
需注意ID冲突风险 |
10.注解配置Bean注意事项和细节(2)
知识点 |
核心内容 |
重点 |
Spring IOC容器的注解检测机制 |
Spring不会验证@Controller注解类的实际功能,仅根据注解生成对象 |
注解名称仅用于程序员识别,容器不解析实际含义 |
组件注解(@Controller/@Service/@Repository)区别 |
在纯Spring环境中功能相同,Spring MVC环境中存在平台差异 |
需区分基础IOC容器与MVC环境下的注解行为差异 |
包扫描过滤规则(resource-pattern) |
支持user*.class格式匹配,仅扫描符合命名规则的编译后class文件 |
运行时扫描的是out目录的编译文件而非源码 |
注解扫描排除策略 |
不添加注解即可避免被扫描,比resource-pattern更常用 |
显式过滤与隐式排除的优先级差异 |
类加载路径工作机制 |
运行时实际工作目录为out而非src,解释.class后缀的必要性 |
开发环境与运行环境的目录结构差异 |
11.注解配置Bean注意事项和细节(3)
知识点 |
核心内容 |
重点 |
exclude filter |
用于排除指定包及其子包下特定注解类型的类 |
必须填写完整注解路径(如org.springframework.stereotype.Service) |
include filter |
反向操作,仅包含指定注解类型的类 |
需配合useDefaultFilters=false使用 |
注解过滤机制 |
支持多种过滤类型(annotation/aspectj/regex等) |
annotation方式最常用 |
配置演示 |
通过debug展示单例池中对象的变化 |
service/controller等注解类的实际过滤效果验证 |
对比维度 |
exclude与include的逻辑反向关系 |
默认过滤机制开关的影响 |
12.注解配置Bean注意事项和细节(4)
知识点 |
核心内容 |
重点 |
Spring注解ID默认规则 |
类名首字母小写作为默认ID(如UserDao→userDao) |
与手动指定ID的区别 |
注解value属性指定ID |
通过@Repository(value="自定义ID")覆盖默认规则 |
value属性可省略写法 |
注解类型等效性 |
@Controller/@Service/@Repository在纯Spring场景下功能等效 |
与SpringMVC中的差异 |
容器对象获取验证 |
通过applicationContext.getBean("id",Class)双重验证机制 |
ID不存在时的异常处理 |
注解底层机制 |
反射读取注解value值作为容器注册依据 |
元注解(@Target等)的作用解析 |
调试验证方法 |
通过断点查看singletonObjects容器实际存储情况 |
动态修改ID的验证流程 |
学习路径建议 |
需先掌握Java注解基础(类型/元注解/反射读取) |
注解基础与框架实现的衔接点 |