什么是IOC?
IOC(Inverse of Control)即控制反转,它将对象的创建和依赖注入的过程由程序员手动控制转化为由容器自动创建和注入。
是Spring框架的核心特性之一,它通过将对象的创建和依赖关系的管理交给容器来实现应用程序的松耦合。IoC容器负责实例化、配置和装配对象,使得开发人员可以更加专注于业务逻辑的编写,而不必关心对象的创建和管理。
在Spring中,IoC容器通过读取XML文件或注解配置信息来了解如何创建和组装对象。容器在启动时会自动扫描指定的路径下的所有类,并将这些类实例化并存储到容器中。当需要使用某个对象时,容器会根据对象的定义信息创建一个新的实例,并自动注入该对象所依赖的其他对象。
什么是DI?
DI(Dependency Injection)即依赖注入,它是IOC的一种实现方式,通过容器自动将所需的依赖注入到需要它们的对象中,从而实现对象之间的解耦。
DI实现了“控制反转”(Inversion of Control,简称IOC)的概念,即将应用程序对组件的控制权交给了容器。容器负责维护对象之间的依赖关系,并在适当的时候将依赖注入到对象中。
IOC和DI的关系及在Spring框架中的应用
IOC和DI是紧密相关的,IOC通过将对象的创建和依赖注入的控制权交给容器,实现了依赖注入。
Spring框架是一个轻量级的IOC容器,通过使用DI实现对象之间的解耦,从而使应用程序更加灵活、可扩展、易维护。
在Spring框架中,容器会自动管理对象之间的依赖关系,从而实现了依赖注入。Spring提供了多种方式来进行依赖注入,包括构造器注入、Setter注入、字段注入等。
项目结构
首先创建Dao接口
package com.shi.dao;
public interface BookDao {
public void insert();
}
实现dao接口的实现类
package com.shi.dao.impl;
import com.shi.dao.BookDao;
public class BookDaoImpl implements BookDao {
@Override
public void insert() {
System.out.println("BookDaoImpl...save");
}
}
service层
BookService 接口
package com.shi.service;
public interface BookService {
public void save();
}
实现BookService 的两个类
package com.shi.service.impl;
import com.shi.dao.BookDao;
import com.shi.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
public class BookServiceImpl implements BookService {
public String name;
public int age;
private BookDao bookDao;
@Override
public String toString() {
return "BookServiceImpl{" +
"name='" + name + '\'' +
", age=" + age +
", bookDao=" + bookDao +
'}';
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Autowired
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public BookServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
public BookServiceImpl() {
// 默认构造函数体
}
@Override
public void save() {
System.out.println("BookServiceImpl.......save");
bookDao.insert();
}
}
package com.shi.service.impl;
import com.shi.service.BookService;
public class BookServiceVip implements BookService {
@Override
public void save() {
System.out.println("BookServiceVip..............save");
}
}
xml文件
<?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">
<!--把所有对象创建到spring的IOC容器中,并起上名字id:表示给对象起名字class:类的全类名-->
<bean id="bookDao" class="com.yyz.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.yyz.service.impl.BookServiceImpl ">
<property name="name" value="张三"></property>
<property name="age" value="9"></property>
<property name="bookDao" ref="bookDao"></property>
</bean>
</beans>
测试层
Test01
package com.shi.servlet;
import com.shi.service.BookService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test01{
BookService bookService;
@Test
public void add() {
System.out.println("BookServlet...add");
//1.获得IOC容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//2.根据名字从容器中获取对象
bookService = (BookService) context.getBean("bookService");
bookService.save();
}
}