学习日记-day38-spring-6.27
知识点:
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注解基础(类型/元注解/反射读取) | 注解基础与框架实现的衔接点 |