目录
1、IoC(Inversion of Control)控制反转
一、Spring核心概念
1、IoC(Inversion of Control)控制反转
使用对象时,由主动new产生的对象转换为由外部提供对象,此过程中对象的创建控制权由程序转移到外部,这种思想称为控制反转。Spring中提供了一个容器,称为IoC容器,充当IoC思想中的“外部”。
2、Bean
IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean。
3、DI(Dependency Injection)依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
如业务层需要依赖数据层,service就要和dao建立依赖关系。
二、IoC入门案例
1、思路分析
(1)Spring管什么?
管理项目中所使用到的类对象,比如(Service和Dao)。
(2)如何将被管理的对象告知IoC容器?
使用配置文件。
(3)被管理的对象交给IoC容器,如何获取到IoC容器?
Spring框架提供相应的接口。
(4)IoC容器得到后,如何从容器中获取bean?
调用Spring框架提供对应接口中的方法。
(5)使用Spring导入哪些坐标?
用哪些东西,就需要在pom.xml添加对应的依赖
2、入门案例代码实现
(1)创建Maven项目
(2)添加Spring的依赖jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
(3) 添加案例中需要的类
//数据层接口
package com.itheima.dao;
public interface BookDao {
public void save();
}
//数据层实现类
package com.itheima.service;
public interface BookService {
public void save();
}
//业务层接口
package com.itheima.service;
public interface BookService {
public void save();
}
//业务层实现类
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 {
private BookDao bookDao = new BookDaoImpl();
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
(4)添加Spring配置文件:applicationContext.xml
(5)在配置文件中完成bean的配置
(6)在itheima包下建一个类App用来运行程序
(7)获取IoC容器并从容器中获取对象进行方法调用
package com.itheima;
import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
//获取Bean
BookDao bookDao =(BookDao) ctx.getBean("bookDao");
BookService bookService = (BookService) ctx.getBean("bookService");
//调用save方法
bookDao.save();
bookService.save();
}
}
(8)运行程序
测试结果为:
三、DI入门案例
1、思路分析
(1)要想实现依赖注入,须必要基于IoC管理Bean,所以DI的入门案例要依赖于前面IoC的入门案例
(2)Service中使用new形式创建的Dao对象是否保留?
需要删除掉,最终要使用IoC容器中的bean对象
(3)Service中需要的Dao对象如何进入到Service中?
在Service中提供方法,让Spring的IoC容器可以通过该方法传入bean对象
(4)Service与Dao间的关系如何描述?
使用配置文件
2、入门案例代码实现
(1)去除BookServiceImpl类中使用new的方式创建的dao对象
public class BookServiceImpl implements BookService {
//删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
(2)在BookServiceImpl类中,为BookDao提供setter方法
public class BookServiceImpl implements BookService {
//删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
// 为BookDao提供setter方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
(3)在配置文件中添加依赖注入的配置
(4)测试BookService的save方法
结果为:
- 注意:配置中的两个bookDao的含义是不一样的
(1)name的bookDao是现在的属性的名称,作用是让Spring的IoC容器在获取到名称后,将首字母大写,前面加set找对应的setBookDao()方法进行对象注入
(2)ref的bookDao是当前容器中对应Bean的名称,作用是让Spring能在IoC容器中找到id为bookDao的Bean对象给bookService进行注入