一ApplicationContext和BeanFactory的区别?

BeanFactory                         顶级接口                  使用对象时才创建

ApplicationContext                 子接口                  加载配置文件时就创建对象

特性 BeanFactory(基础容器) ApplicationContext(增强容器)
核心定位 轻量级 Bean 容器,仅实现基础功能 重量级容器,扩展了 BeanFactory 所有功能
Bean 加载方式 懒加载(获取 Bean 时才实例化) 饿加载(容器启动时就实例化所有单例 Bean)
功能范围 仅提供 Bean 的创建、获取、管理 包含 BeanFactory 所有功能 + 国际化、事件发布、资源加载、AOP 集成等
常用实现类 XmlBeanFactory(已过时) ClassPathXmlApplicationContextAnnotationConfigApplicationContext
异常处理 获取 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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐