一、简介
控制反转 (IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理。
IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖注入。应用广泛。
二、依赖
classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA 对 classB 有依赖。
三、IoC 的实现
依赖注入:DI(Dependency Injection),程序代码不做定位查询,这些工作由容器自行完成。
依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持对象之间依赖关系的管理
Spring 框架使用依赖注入(DI)实现 IoC。
Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称为 Bean。
Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使用依赖注入的方式来管理 Bean 之间的依赖关系。使用 IoC 实现对象之间的解耦和。
四、第一个 Spring 程序
1. 使用Spring框架创建自定义类型对象
1.设置本机仓库
2.创建 Maven 项目
3.引入 Maven 依赖 pom.xml
添加 Spring 依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.14</version>
</dependency>
4.定义接口及实现类
SomeService接口
public interface SomeService {
void doSome();
}
SomeServiceImpl 为SomeService 接口实现类
public class SomeServiceImpl implements SomeService {
public SomeServiceImpl() {
super();
System.out.println("SomeServiceImpl无参数构造方法");
}
@Override
public void doSome() {
System.out.println("====业务方法doSome()===");
}
}
5.创建 Spring 配置文件
在 src / main / resources / 目录现创建一个 xml 文件,文件名可以随意,但 Spring 建议的名称为applicationContext.xml。
步骤:
new --> XML Configuration File --> Spring Config
如果没有 Spring Config 这个选项,则是 pom.xml 中的 Spring 依赖没有配置好的缘故,要记住添加完依赖后要点击旁边的 reload 按钮
创建完后如图所示
<?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">
</beans>
spring 配置中需要加入约束文件才能正常使用,约束文件是 .xsd 扩展名
然后注册bean对象,即在上述代码内部添加
<bean id = "someService" class="com.fancy.SomeServiceImpl">
<bean / >:用于定义一个实例对象。一个实例对应一个 bean 元素。所谓的Java Bean 在 Spring 中即为 Java 对象
6.定义测试类
创建测试类Test 在其中定义方法test01,并写入以下内容
String resource = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContextO(resource);
SomeService service = (SomeService) ac.getBean("someService");
service.doSome();
完整测试类:
package com.fancy;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
@Test
public void test01() {
String resource = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
SomeService service = (SomeService) ac.getBean("someService");
service.doSome();
}
}
2. 使用 Spring 框架创建非自定义类型对象
如果是使用 Spring 创建非自定义类型对象呢 ?
比如创建日期类对象
在 spring 配置文件 applicationContext.xml 文件中 加入 java.util.Date 定义 :
<bean id="myDate" class="java.util.Date"></bean>
在测试类中:
调用 getBean(“myDate”); 获取日期类对象。
3. 容器接口与实现类
- ApplicationContext 接口(容器)
ApplicationContext 用于加载 Spring 的配置文件,在程序中充当”容器”的角色。其实现 类有两个 :ClassPathXmlApplicationContext 与 FileSystemXmlApplicationContext。
- 配置文件在类路径下:若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现类进行加载。
- ApplicationContext 容器中对象的装配时机: ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
- 使用 Spring 容器创建 Java 对象 :
|