Spring
控制反转:IOC
理解:反转资源获取方向。把自己创建资源变成环境将资源准备好,我们享受资源注入。
面向切面编程:AOP
理解:在不修改源代码的基础上增强代码功能。
容器:Spring IOC
理解: 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。
1. 普通容器
普通容器只是负责存储数据(对象):数组、List、Map等等
2. 复杂容器
复杂容器不仅要负责存储对象,还需要具备创建对象、调用对象方法、管理对象生命周期、并且在一定情况下负责销毁对象----------Tomcat就是一个复杂容器,它能够负责创建Servlet、Filter、Listener等等对象,并且管理他们的生命周期
IOC的概念
我们传统的创建方式就是要哪个方法就创建那个方法,这样就导致耦合度偏高
IOC方式创建对象:将对象的创建反转给spring框架来创建和管理,把对象创建的工作交给spring容器去维护。我们只需要告诉spring容器我们需要什么对象即可
IOC的作用:消减计算机程序的耦合
IOC容器在Spring中的实现
spring提供两种实现方式
①BeanFactory ,此实现面向spring框架内部本身使用,不提供开发者使用(封装的)
②ApplicationContext :提高了更高级方法,几乎所有的场合都使用比 BeanFactory方法多
ApplicationContext的主要实现类
类名 | 简介 |
---|---|
ClassPathXmlApplicationContext | 通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象 |
AnnotationConfigApplicationContext | 可以实现基于Java的配置类加载Spring的应用上下文,创建IOC容器对象 |
WebApplicationContext | 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引用存入 ServletContext 域中。 |
Spring IOC快速入门
springIOC容器创建类的对象,并从中获取对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDCbWjN7-1639744887607)(img/001.jpg)]
在配置文件的时候
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--
每一个实现类就对应一个bean标签
id属性: 对象的唯一标识,根据这个唯一标识,就可以从核心容器中获取对象
class属性: 对象所属的实现类的全限定名
-->
<bean id="happyComponent" class="com.atguigu.ioc.component.HappyComponent"/>
</beans>
bean标签:告诉ioc容器需要创建对象的组件是什么
id属性:bean的唯一标识
class属性:组件类全类名
如何从核心容器里面获取对象
方式一:
根据id获取
// 创建 IOC 容器对象,为便于其他实验方法使用声明为成员变量
private ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void testExperiment01() {
// 从 IOC 容器对象中获取bean,也就是组件对象 .getbean(id)
HappyComponent happyComponent = (HappyComponent) iocContainer.getBean("happyComponent");
happyComponent.doWork();
}
方式二:
根据类型获取
@Test
public void testExperiment02() {
HappyComponent component = iocContainer.getBean(HappyComponent.class);
component.doWork();
}
方式二会抛下异常
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘com.atguigu.ioc.component.HappyComponent’ available: expected single matching bean but found 2: happyComponent,happyComponent2
注意:::
如果组件类型,实现接口,这些类型都配了唯一的bean对象,可以获取bean对象
配置文件方式
写一个方法,然后在xml文件里面扫描方法,给唯一的id,然后
ApplicationContext act = new ClassPathXmlApplicationContext(“配置文件路径”)
act.getBean()
- 给一个对象的成员变量赋值的方式:
-
- 调用set方法
-
- 通过构造器
-
- 通过暴力反射
依赖注入:
构造函数:
前提是当前类有对应的带参数的构造函数
标签
name属性:对应构造函数的参数名
value:注入简单类型的值
ref:注入Bean的id
set方法:
前提是要注入的属性有对应的set方法
标签
name属性:对应set方法的名字
value:注入简单类型的值
ref:注入Bean的id
p命名空间:
前提是要注入的属性有对应的set方法
在spring的配置文件中引入p
在bean标签上添加属性
p:属性名=
p:属性名-ref=
Bean的生命周期
bean的生命周期清单
- bean对象创建(调用无参构造器)
- 给bean对象设置属性(依赖注入)
- bean对象初始化之前操作(由bean的后置处理器前置方法负责)
- bean对象初始化(需在配置bean时指定初始化方法)
- bean对象初始化之后操作(由bean的后置处理器后置方法负责)
- bean对象就绪可以使用
- bean对象销毁(需在配置bean时指定销毁方法)
- IOC容器关闭