IOC、IOC容器、Bean、DI概念介绍
- IOC(Inversion of control) 控制反转
使用对象时,由主动new产生对象转化为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。 - IOC容器
Spring技术提供了对IOC思想的实现,提供了一个容器,称为IOC容器。
IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层(DAO)和业务层(Service)的类的对象。 - Bean
被创建或者被管理的对象在IOC容器中被统称为Bean。
IOC容器中存放的就是一个个的Bean对象。 - DI(dependency injection) 依赖注入
在IOC容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
如业务层(Service)需要依赖数据层(DAO),所以他们之间需要建立依赖关系。
介绍完Spring的IOC和DI概念后,我们会发现这两个概念的最终目的就是:充分解耦。
入门案例代码实现
需求分析:将BookServiceImpl和BookDaoImpl交给Spring管理,并从容器中获取对应的bean对象进行方法调用。
- 创建Maven框架的java项目
- pom.xml中添加spring的依赖jar包
- 创建BookServiceImpl,BookDaoImpl,BookService,BookDao这四个类
- 在resource目录下添加spring配置文件,并完成bean的配置
- 使用spring提供的接口完成IOC容器的创建
- 从容器中获取对象进行方法调用
创建Maven框架的java项目(略)
pom.xml中添加spring的依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
创建BookServiceImpl,BookDaoImpl,BookService,BookDao这四个类
BookDao代码如下:
package com.itheima.dao;
public interface BookDao {
public void save();
}
BookDaoImpl代码如下:
package com.itheima.dao.impl;
import com.itheima.dao.BookDao;
import org.springframework.stereotype.Repository;
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("调用BookDaoImpl的save方法");
}
}
BookService代码如下:
package com.itheima.service;
public interface BookService {
public void save();
}
BookServiceImpl代码如下:
package com.itheima.service.impl;
import com.itheima.dao.BookDao;
import com.itheima.dao.impl.BookDaoImpl;
import com.itheima.service.BookService;
public class BookServiceImpl implements BookService {
public BookDao bookDao;
public String name;
public void setName(String name) {
this.name = name;
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void save() {
System.out.println("调用BookServiceImpl的save方法");
}
}
在resource目录下创建名为applicationContext.xml
的spring配置文件,并完成bean的配置
<?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">
<!--id的值可以任意,class的值为实现类-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--name必须与bean中的属性相对应且必须提供set方法!ref必须与该属性对应的类的id相等-->
<property name="bookDao" ref="bookDao"/>
<property name="name" value="你好呀"/>
</bean>
</beans>
使用spring提供的接口完成IOC容器的创建,从容器中获取对象进行方法调用
package com.itheima;
import com.itheima.dao.impl.BookDaoImpl;
import com.itheima.service.impl.BookServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//使用spring提供的接口完成IOC容器的创建
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//使用getBean方法从容器中获取对象进行方法调用
BookDaoImpl bookDao = (BookDaoImpl) applicationContext.getBean("bookDao");//通过id调用
BookServiceImpl bookService = applicationContext.getBean(BookServiceImpl.class);//通过类.class调用
bookDao.save();//调用BookDaoImpl的save方法
System.out.println(bookDao);//com.itheima.dao.impl.BookDaoImpl@5ace1ed4
bookService.save();//调用BookServiceImpl的save方法
System.out.println(bookService);//com.itheima.service.impl.BookServiceImpl@1613674b
bookService.bookDao.save();//调用BookDaoImpl的save方法
System.out.println(bookService.name);//你好呀
}
}
学习总结
通过以上代码,我们完成了Spring的IOC以及ID。在实现过程中,有以下几点需要注意一下。
- BookServiceImpl类中,在申明属性的同时,需要提供相应的set方法作为DI的入口。
- 在bean的配置文件中,为bean的属性配置简单类型使用value,配置对象则使用ref。