控制反转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 实现对象之间的解耦和。
说明:本程序中需要了解的地方有:
pom.xml配置
添加spring的依赖,以及指定资源文件
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.2.5.RELEASEversion>
dependency>
dependencies>
<build>
<resources>
<resource>
<directory>/src/main/javadirectory>
<includes>
<include>**/*.xmlinclude>
<include>**/*.propertiesinclude>
includes>
resource>
<resource>
<directory>/src/test/javadirectory>
<includes>
<include>**/*.xmlinclude>
<include>**/*.propertiesinclude>
includes>
resource>
resources>
build>
public class Student {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
System.out.println("学生的无参构造方法被调用了......");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
<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="stu" class="com.lcl.pojo.Student">
<property name="name" value="张三">property>
<property name="age" value="21">property>
bean>
beans>
@Test
public void testStudentSpring(){
//有spring容器创建学生对象
//如果想从spring容器中取出对象,则需要先创建容器对象,并且启动
ApplicationContext ac = new ClassPathXmlApplicationContext("s01/applicationContext.xml");
Student stu = (Student) ac.getBean("stu");
System.out.println(stu);
}
set注入简单类型的使用
<bean id="school" class="com.lcl.pojo2.School">
<property name="name" value="郑州大学">property>
<property name="address" value="郑州市">property>
bean>
<bean id="stu" class="com.lcl.pojo2.Student">
<property name="name" value="李华">property>
<property name="age" value="22">property>
<property name="school" ref="school" >property>
bean>
<bean id="school" class="com.lcl.pojo3.School">
<constructor-arg name="name" value="郑州大学">constructor-arg>
<constructor-arg name="address" value="郑州市">constructor-arg>
bean>
<bean id="student" class="com.lcl.pojo3.Student">
<constructor-arg index="0" value="李华">constructor-arg>
<constructor-arg index="1" value="22">constructor-arg>
<constructor-arg index="2" ref="school">constructor-arg>
bean>
<bean id="stu" class="com.lcl.pojo3.Student">
<constructor-arg value="张三">constructor-arg>
<constructor-arg value="22">constructor-arg>
<constructor-arg ref="school">constructor-arg>
bean>
依赖注入:DI(Dependency Injection),对于 DI 使用注解,将不再需要在 Spring 配置文件中声明bean 实例。Spring 中使用注解, 需要在原有 Spring 运行环境基础上再做一些改变。需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
基于注解的方式注入,创建对象和基于set注入的方式可以说成是换汤不换药
使用注解注入的方式创建对象,在创建实体类的需要有无参构造方法
创建对象的注解
依赖注入的注解
说明:
实际上没那么麻烦,是简单类型就是用Value,是引用类型就是用Autowired,其他的都是体会之后的了解内容
简单类型(8种基本类型+String)的注入
引用类型的注入
注意:在有父子类的情况下,使用按类型注入,就意味着有多个可注入的对象.此时按照名称进行二次筛选,选中与被注入对象相同名称的对象进行注入.
学校类
@Component
public class School {
@Value("郑州大学")
private String name;
@Value("郑州市")
private String address;
public School() {
System.out.println("School的无参构造方法被调用......");
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
学生类
@Component
public class Student {
@Value("李华")
private String name;
@Value("22")
private int age;
/* //引用类型
@Autowired
private School school;*/
//引用类型按名称注入,
//使用名称注入时需要子啊Qualifier注解中说明注入名
//两个注解都不能少
@Autowired
@Qualifier("school")
private School school;
public Student() {
System.out.println("Student的无参构造方法被调用了......");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
xml文件中添加配置,spring容器需要扫描的包
<context:component-scan base-package="com.lcl.s02">context:component-scan>
测试:
@Test
public void testStudent(){
ApplicationContext ac = new ClassPathXmlApplicationContext("s02/applicationContext.xml");
Student student = (Student) ac.getBean("student");
System.out.println(student);
}