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
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
定义接口与实体类
public interface SomeService {
void doSome();
}
public class SomeServiceImpl implements SomeService {
public SomeServiceImpl() {
super();
System.out.println("SomeServiceImpl无参数构造方法");
}
@Override
public void doSome() {
System.out.println("====业务方法doSome()===");
}
}
创建spring配置文件
在 src/main/resources/目录现创建一个 xml 文件,文件名可以随意,但 Spring 建议的名称为applicationContext.xml。
spring 配置中需要加入约束文件才能正常使用,约束文件是 xsd 扩展名。
:用于定义一个实例对象。一个实例对应一个 bean 元素
id:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,Bean 与 Bean 间的依 赖关系也是通过 id 属性关联的。
class:指定该 Bean 所属的类,注意这里只能是类,不能是接口。
定义测试类
@Test
public void test2(){
//spring创建对象默认调用的是类的无参数构造方法
//使用spring创建好的对象
//指定spring配置文件的名称
String config = "beans.xml";
//创建表示spring容器的对象,ApplicationContext,表示spring容器,通过容器加载对象
//ClassPathXmlApplicationContext:表示从类路径中加载spring的配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext(config); //Spring创建对象时机:在创建spring容器时,创建spring配置文件中的所有对象
//从容器中获取对象,需要调用对象的方法
//getbean("配置文件中的bean的id值"),返回的是object类型,需要强转一下
SomeService service = (SomeService) ac.getBean("someService");
service.dosome();
}
使用spring创建非自定义类对象
spring 配置文件加入 java.util.Date 定义:
<bean id="myDate" class="java.util.Date" />
MyTest 测试类中: 调用 getBean(“myDate”); 获取日期类对象。
容器接口和实现类
ApplicationContext接口(容器)
ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。其实现类有两个。
-
配置文件在类路径下
若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现 类进行加载。
@Test 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提供的方法获取对象信息
//获取Spring容器中Java对象的信息 @Test 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); } }