Spring---注解
·
一ApplicationContext和BeanFactory的区别?
BeanFactory 顶级接口 使用对象时才创建
ApplicationContext 子接口 加载配置文件时就创建对象
| 特性 | BeanFactory(基础容器) | ApplicationContext(增强容器) |
|---|---|---|
| 核心定位 | 轻量级 Bean 容器,仅实现基础功能 | 重量级容器,扩展了 BeanFactory 所有功能 |
| Bean 加载方式 | 懒加载(获取 Bean 时才实例化) | 饿加载(容器启动时就实例化所有单例 Bean) |
| 功能范围 | 仅提供 Bean 的创建、获取、管理 | 包含 BeanFactory 所有功能 + 国际化、事件发布、资源加载、AOP 集成等 |
| 常用实现类 | XmlBeanFactory(已过时) |
ClassPathXmlApplicationContext、AnnotationConfigApplicationContext |
| 异常处理 | 获取 Bean 时才抛出异常 | 容器启动时就校验配置,提前抛出异常 |
| 适用场景 | 移动端 / 嵌入式等资源受限场景 | 绝大多数企业级应用(Spring 主流) |


二spring bean
1,spring bean的5个作用域
| 作用域 | 官方定义 | 通俗解释 | 核心特点 |
|---|---|---|---|
| singleton(单例) | IOC 容器中仅创建一个 Bean 实例,全局共享 | 整个应用中只有一个 “对象”,所有人用同一个 | 默认作用域;容器启动时创建(饿加载) |
| prototype(多例) | 每次调用 getBean()/ 注入时创建新实例 |
要一次新对象就 new 一个,每次都不一样 |
按需创建;容器仅创建,不管理销毁 |
| request | 每个 HTTP 请求创建一个新 Bean,请求结束销毁 | 一次请求内共享一个对象,不同请求互不干扰 | 仅 Web 环境生效 |
| session | 每个 HTTP Session(用户会话)创建一个新 Bean,会话结束销毁 | 一个用户的所有请求共享一个对象,不同用户隔离 | 仅 Web 环境生效 |
| application | 整个 Web 应用(ServletContext)共享一个 Bean,应用停止销毁 | 相当于 Web 版的 singleton,范围更大 | 仅 Web 环境生效 |
使用地点

<!-- XML 配置 -->
<bean id="userDao" class="xxx.UserDaoImpl" scope="singleton"/>
<!-- 注解配置(更常用) -->
@Scope("prototype") // 或 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
public class UserConnection {}
iocMap/newInstances ()
- singleton:Bean 存在 Spring 容器的
iocMap中,全局唯一;//单例模式 - prototype:每次获取都会调用
newInstance()新建对象,不存入iocMap。//多例模式
多例(prototype)→ 必须使用场景
| 场景 | 原因 |
|---|---|
| 数据库连接(Connection) | 有状态(绑定会话 / 事务),多线程共享会导致数据混乱,必须每次新建 |
| SqlSession(MyBatis) | 绑定数据库连接,线程不安全,每次操作需新实例 |
| 有状态的 Bean(如购物车) | 存储用户专属数据,不同请求 / 用户需隔离,必须多例 |
单例(singleton)→ 推荐使用场景
| 场景 | 原因 |
|---|---|
| DAO/Service 层 | 无状态(没有成员变量存储请求数据),多线程共享无风险,节省内存 |
| 工厂类(SqlSessionFactory / 连接池) | 工厂创建成本高,单例复用效率最高 |
| 工具类(StringUtils/DateUtils) | 纯静态方法 / 无状态,单例避免重复创建 |
2,spring bean的生命周期


单例:
[创建容器]--->构造方法(实例化)--->set方法(注入)--->init方法(初始化)--->[关闭容器]--->destroy方法(释放初始化的内容)
多例:
[使用对象]--->构造方法(实例化)--->set方法(注入)--->init方法(初始化)--->[jvm垃圾回收]--->destroy方法(释放初始化的内容)
三spring基于注解的IOC
1,注解种类使用地方
1)IOC
@Repository:dao
@Service:service
@Controller:web
@Component:三层架构之外
@Scope:指定bean的作用域,eg:singleton、prototype、request、session、application
2)DI
@Resource:按名称
@Autowired:按类型
@Value:注入四类八种和String
| 注解 | 注入规则 | 适用场景 | 依赖来源 | 示例(非代码框版) |
|---|---|---|---|---|
| @Resource | 按名称匹配 → 按类型匹配 | 注入自定义对象 | JDK 原生注解 | 在 UserServiceImpl 的 userDao 属性上添加 @Resource (name = "userDao") |
| @Autowired | 按类型匹配(默认必须存在) | 注入自定义对象 | Spring 核心注解 | 在 UserServiceImpl 的 userDao 属性上添加 @Autowired (required = false) + @Qualifier ("userDaoImpl") |
| @Value | 注入基本类型 / 字符串 / 配置值 | 注入四类八种 / 字符串 / 外部配置 | Spring 核心注解 | 1. 字符串:@Value ("张三") 赋值给 name 属性2. 配置值:@Value ("${server.port}") 赋值给 port 属性3. 表达式:@Value ("#{10 + 20}") 赋值给 num 属性4. 布尔值:@Value ("true") 赋值给 flag 属性 |
2,xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd ">
读取配置文件

3,注释使用的方式
compeonent Autowired Value


Repository

Service

更多推荐





所有评论(0)