Spring相关概念
文章目录
- 一、Spring IOC容器(控制反转)
- 1. 核心思想
- 2. 依赖注入(DI,Dependency Injection)
- 二、Bean对象
- 1. 定义
- 2. Bean的配置方式
- 3. 注解扫描
- 三、依赖注入的具体实现
- 1. 属性赋值规则
- 2. 自动装配(Autowiring)
- 四、Spring Bean的作用域
- 五、AOP(面向切面编程)
- 六、其他核心概念
- 1. 工厂模式与Spring Bean
- 2. 发布(Deployment)
一、Spring IOC容器(控制反转)
1. 核心思想
- IOC(Inversion of Control,控制反转):
传统开发中,对象的创建和依赖关系由开发者手动控制(如new Object()
);IOC模式下,对象的创建、管理及依赖关系由Spring容器负责,开发者仅需定义对象,无需关心其创建过程,实现“控制权反转”。 - 核心容器:
Spring的IOC容器是管理Bean对象的核心,主要实现类为ApplicationContext
(常用)和BeanFactory
,负责Bean的实例化、配置和组装。
2. 依赖注入(DI,Dependency Injection)
- 定义:IOC的具体实现方式,指Spring容器在创建Bean时,自动将其依赖的其他Bean或属性值注入到对象中(即“给属性赋值”)。
- 目的:解除对象间的硬编码依赖,降低耦合度。
- 注入方式:
- 构造方法注入:通过构造函数参数传递依赖。
- Setter方法注入:通过Setter方法给属性赋值(最常用)。
二、Bean对象
1. 定义
- Bean:由Spring IOC容器管理的对象,是应用程序的核心组件(如Service、Dao层对象),需通过配置或注解定义。
2. Bean的配置方式
-
XML配置:
通过<bean>
标签定义Bean,示例:<bean id="userService" class="com.example.UserService"><property name="userDao" ref="userDao"/> <!-- 依赖注入 --> </bean>
id
:Bean的唯一标识(不可重复)。name
:与id
等效,可指定多个别名(用逗号/空格分隔),两者均用于容器中定位Bean。class
:Bean的全类名(容器通过反射创建对象)。
-
注解配置:
通过注解直接标注类,替代XML配置,常用注解:注解 作用 适用场景 @Component
通用组件注解,标识此类为Spring Bean 无明确分层的组件 @Service
继承 @Component
,标识服务层组件Service层类 @Repository
继承 @Component
,标识数据访问层组件Dao层类 @Controller
继承 @Component
,标识控制器组件Spring MVC的Controller层
3. 注解扫描
- 扫描器配置:
若使用注解定义Bean,需在配置类或XML中开启组件扫描,指定需要扫描的包路径:// 配置类方式 @Configuration @ComponentScan(basePackages = "com.example") // 扫描指定包下的注解 public class SpringConfig {}
<!-- XML方式 --> <context:component-scan base-package="com.example"/>
- 是否需要额外注解:
开启扫描后,被@Component
及其派生注解(@Service
等)标注的类会被自动注册为Bean,无需额外配置;未被注解的类不会被扫描。
三、依赖注入的具体实现
1. 属性赋值规则
- 基本类型与包装类:
若Bean的属性是基本类型(int
、String
)或包装类(Integer
、Boolean
),可直接通过value
赋值(XML中用<property name="age" value="20"/>
,注解中用@Value("20")
)。 - 引用类型:
若属性是自定义对象(如UserDao
),需通过ref
引用容器中已存在的Bean(XML中用<property name="userDao" ref="userDao"/>
,注解中用@Autowired
)。
2. 自动装配(Autowiring)
-
定义:Spring容器自动为Bean注入依赖的过程,无需手动指定
ref
或value
。 -
实现方式:
- XML配置:在
<bean>
中通过autowire
属性指定自动装配方式:<bean id="userService" class="com.example.UserService" autowire="byName"/>
- 注解方式:
@Autowired
:Spring提供的注解,默认按类型(byType
)自动装配,需配合@Qualifier("beanId")
指定Bean的id(解决类型冲突)。@Resource
:JDK提供的注解,默认按名称(byName
)自动装配,若找不到名称匹配的Bean,则退化为按类型(byType
)装配。
- XML配置:在
-
自动装配规则:
byName
:根据属性名与容器中Bean的id
匹配(属性名需与Bean的id
一致)。byType
:根据属性类型与容器中Bean的类型匹配,要求容器中该类型的Bean唯一(单匹配),否则报错。- 若
byName
找不到匹配的Bean,@Resource
会自动退化为byType
;@Autowired
默认byType
,不自动退化(需手动指定@Qualifier
)。
四、Spring Bean的作用域
-
定义:Bean在Spring容器中的生命周期和创建方式(单例/多例等)。
-
常用作用域:
作用域 说明 适用场景 singleton
单例模式(默认),容器中仅创建一个Bean实例,所有请求共享此实例 无状态组件(如Service、Dao) prototype
多例模式,每次请求Bean时创建新实例 有状态组件(如Struts2的Action) request
每个HTTP请求创建一个新实例(Web环境) Spring MVC的请求相关组件 session
每个会话创建一个实例(Web环境) 会话相关组件 -
默认值:Spring默认使用 单例模式(singleton),Bean在容器初始化时创建,生命周期与容器一致。
五、AOP(面向切面编程)
- 定义:一种通过“切面”分离横切关注点(如日志、事务)与业务逻辑的编程思想,实现代码复用和解耦。
- 核心概念:
- 切面(Aspect):横切关注点的模块化(如日志切面)。
- 通知(Advice):切面的具体行为(如前置通知、后置通知)。
- 连接点(JoinPoint):程序执行过程中可插入切面的点(如方法调用前)。
- 切入点(Pointcut):定义哪些连接点需要被通知(如指定包下的所有方法)。
- 作用:在不修改业务代码的前提下,为方法添加通用功能(如日志记录、权限校验、事务管理)。
六、其他核心概念
1. 工厂模式与Spring Bean
- Spring IOC容器本质上是工厂模式的实现:容器作为“Bean工厂”,根据配置(XML/注解)创建并管理Bean,开发者通过容器获取Bean(
context.getBean("userService")
),而非直接new
对象。
2. 发布(Deployment)
- Spring应用的发布指将应用部署到服务器(如Tomcat),通过容器启动类(如
main
方法中初始化ApplicationContext
)加载配置,启动IOC容器,完成Bean的创建和依赖注入,使应用对外提供服务。