IOC
控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对 象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值, 依赖的管理。
IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖 注入。应用广泛。
依赖注入
依赖:classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA 对 classB 有依赖。
Ioc 的实现:
➢ 依赖注入:DI(Dependency Injection),程序代码不做定位查询,这些工作由容器自行 完成。
依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持对象之间依赖关 的管理。
Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,这些 Java 对象被称为 Bean。Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使用“依赖注入”的方式 来管理 Bean 之间的依赖关系。使用 IoC 实现对象之间的解耦和。
开发工具准备
开发工具:idea2017 以上 依赖管理:maven3 以上 jdk:1.8 以上
需要设置maven本机仓库
Spring的第一个程序
创建Maven项目
引入maven依赖pom.xml
1 | <dependency> |
定义接口与实体类
1 | public interface SomeService { |
创建spring配置文件
在 src/main/resources/目录现创建一个 xml 文件,文件名可以随意,但 Spring 建议的名称为applicationContext.xml。
spring 配置中需要加入约束文件才能正常使用,约束文件是 xsd 扩展名。
id:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,Bean 与 Bean 间的依 赖关系也是通过 id 属性关联的。
class:指定该 Bean 所属的类,注意这里只能是类,不能是接口。
定义测试类
1 |
|
使用spring创建非自定义类对象
spring 配置文件加入 java.util.Date 定义:
1 | <bean id="myDate" class="java.util.Date" /> |
MyTest 测试类中: 调用 getBean(“myDate”); 获取日期类对象。
容器接口和实现类
ApplicationContext接口(容器)
ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。其实现类有两个。
配置文件在类路径下
若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现 类进行加载。
1
2
3
4
5
6
7
8
public void test02(){
//spring配置文件在类路径下(classpath)
String resource = "applicationContext.xml";
ApplicationContext ac = ClassPathXmlApplicationContext(resource);
SomeService service = (SomeService) ac.getbean("someService");
service.dosome();
}
ApplicationContext容器中对象的装配时机
ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。 以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
使用spring容器创建的Java对象
使用spring提供的方法获取对象信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14//获取Spring容器中Java对象的信息
public void test3(){
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config); //这里的参数传入不能加双引号
//使用spring提供的方法,获取容器中定义的对象的数量与名称
int nums = ac.getBeanDefinitionCount();
System.out.println("容器中定义的对象数量"+nums);
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for(String name:beanDefinitionNames){
System.out.println(name);
}
}