一、Spring框架概述
Spring框架是一个开源的Java企业级应用开发 框架,由Rod Johnson于2003年首次提出。它通过提供全面的基础设施支持,简化了Java企业级应用的开发。Spring的核心特性包括依赖注入(DI)和面向切面编程(AOP),这两大特性使得应用程序的组件更加松散耦合,代码更加模块化,易于测试和维护。
二、Spring核心模块
1. Spring Core Container(核心容器)
这是Spring框架最基础的部分,包含以下关键组件:
- BeanFactory:Spring IoC容器的基本实现,负责管理Bean的生命周期和依赖关系。
- ApplicationContext:BeanFactory的增强版,提供了更多企业级功能,如国际化、事件传播、资源加载等。
- Bean Definition:描述Bean的配置元数据,包括类名、作用域、属性值、依赖关系等。
2. Spring AOP(面向切面编程)
AOP模块提供了面向切面编程的实现,允许开发者将横切关注点(如日志、事务、安全)从业务逻辑中分离出来。主要组件包括:
- 切面(Aspect):横切关注点的模块化,通常是一个类。
- 连接点(Join Point):程序执行过程中的某个特定点,如方法调用或异常抛出。
- 通知(Advice):在特定连接点执行的动作,包括前置通知、后置通知、环绕通知等。
- 切入点(Pointcut):匹配连接点的表达式,用于确定哪些连接点需要应用通知。
三、IoC(控制反转)
1. IoC容器工作原理
IoC(控制反转)是Spring框架的核心设计原则。传统编程中,对象自己创建和管理依赖对象;而在IoC模式中,容器负责创建和管理对象,并将依赖注入到对象中。这种模式实现了控制权的反转,降低了组件间的耦合度。
2. Bean的生命周期
Spring Bean的生命周期包括以下阶段:
- 实例化:
、构造器实例化 通过无参构造器方法创建,必须要有无参构造方法,否则创建失败
静态工厂实例化 定义静态工厂类,类中定义静态方法,该静态方法返回实例化的bean对象
实例化工厂实例化 定义工厂类,类中定义普通方法,方法返回实例化的bean对象
- 属性赋值:容器注入Bean的依赖属性。
- 初始化:调用初始化方法(如@PostConstruct、init-method)。
- 使用:Bean处于就绪状态,可供应用程序使用。
- 销毁:容器关闭时调用销毁方法(如@PreDestroy、destroy-method)。
3. 依赖注入方式
1.手动注入
set方法实现注入 属性字段要有set方法,通过该属性的set方法设置属性字段的值
- 构造器实现注入:通过构造器形参设置属性值(问题:无法解决循环依赖)
- 解决循环依赖-->set方法
- 解决循环依赖-->set方法
- 静态工厂注入
- 实例化工厂注入
2.自动注入(重点)
(1)@Resource
默认根据bean标签的id属性值查找,属性字段名和bean里的id属性值相等;
如果属性名称未找到,则会根据类型查找;
默认利用set方法实现注入,可以提供set方法,也可以不提供;
注解可以声明在属性字段上也可以放在set方法上;
可以设置name属性,name属性必须与bean标签上的id属性值一样,设置name无法根据类型查找;
当注入的是接口时,如果有多个实现类则需要使用name属性
(2)@Autowired
默认根据类型查找,与属性字段名无关
可以提供set方法,也可以不提供;
注解可以声明在属性字段上也可以放在set方法上;
可与@Qualifier结合使用,值与bean标签的id属性值对应
开启扫描
(1)@Component 任意类
(2)@Repository Dao层
(3)@Service Service层
(4)@Controller Controller
4. Bean的作用域
Spring Bean支持多种作用域:
- singleton(默认):每个Spring容器中只有一个Bean实例。
- prototype:每次请求都会创建一个新的Bean实例。
- request:每个HTTP请求创建一个Bean实例(仅Web应用)。
- session:每个HTTP会话创建一个Bean实例(仅Web应用)。
- application:每个ServletContext创建一个Bean实例(仅Web应用)。
四、AOP(面向切面编程)
Joinpoint 连接点 程序执行过程中能够插入切面的点 类里的方法都可以称为连接点
Pointcut 切入点 程序执行时真正被插入切面的方法
Advice 增强/通知 实际添加的代码逻辑 前置通知、后置通知、最终通知、异常通知、环绕通知
Aspect 切面 将通知应用到切入点的过程
1.xml配置文件方式
引入依赖
pom.xml
applicationContext.xml
注意:环绕通知时需要手动放行