控制反转-IOC:
- Inversion Of Control 对象的创建控制权, 由程序自身创建(new ClassName), 转移到外部(容器)
依赖注入-DI
- Dependency Injection, 容器为应用程序提供运行时, 所依赖的资源
Bean对象:
- IOC容器中创建, 管理的对象
实现步骤
- 1.先给Service的实现类ServiceA和DAO的实现类DaoA加上注解:
@Compent(表示将类交给IOC容器管理, 成为容器中的Bean)
package com.itheima.service.impl;
import com.itheima.dao.EmpDao;
import com.itheima.dao.impl.EmpDaoA;
import com.itheima.pojo.Emp;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component //表示将类交给IOC容器管理, 成为容器中的Bean
public class EmpServiceA implements EmpService {
// 非IOC方式
// private EmpDao empDao = new EmpDaoA();
// IOC方式, 不需要new对象
@Autowired // // 运行时, IOC容器会提供改类型的bean对象, 并赋值给该变量 - 依赖注入
private EmpDao empDao;
@Override
public List<Emp> listEmp() {
// 1.调用dao获取数据
List<Emp> empList = empDao.listEmp();
// 2.数据处理 -省略代码
return empList;
}
}
package com.itheima.dao.impl;
import com.itheima.dao.EmpDao;
import com.itheima.pojo.Emp;
import com.itheima.utils.XmlParserUtils;
import org.springframework.stereotype.Component;
import java.util.List;
@Component // 表示将类交给IOC容器管理, 成为容器中的Bean
public class EmpDaoA implements EmpDao {
@Override
public List<Emp> listEmp() {
// 1.加载并解析xml
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
return empList;
}
}
- 2.然后给调用上面类的地方, 使用DI的方式给变量赋值, 而不是使用New 的方式
package com.itheima.controller;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.service.impl.EmpServiceA;
import com.itheima.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmpController {
// 非IOC方式, 需要new 对象
//private EmpService empService = new EmpServiceA();
@Autowired // 运行时, IOC容器会提供改类型的bean对象, 并赋值给该变量 - 依赖注入
private EmpService empService;
@RequestMapping("listEmp")
public Result list()
{
// 1.调用service, 获取数据
List<Emp> empList = empService.listEmp();
// 3.响应数据
return Result.success(empList);
}
}
- 3.运行