以往在定义业务层实现时,在指定具体地Dao时候需要具体地定义出其实现:
public class BookServiceImpl implements BookService{
private BookDao bookDao = new BookDaoImpl();
public void save(){
bookDao.save()
}
}
public class BookDaoImpl implements BookDao {
public void save(){
System.out.println("book dao save...");
}
}
但是当我们想新定义一个实现方法的时候,例如:
public class BookDaoImpl2 implements BookDao {
public void save(){
System.out.println("book dao save...2");
}
}
我们就要修改BookServiceImpl
类,将里面的private BookDao bookDao = new BookDaoImpl()
修改为private BookDao bookDao = new BookDaoImpl2()
,这带来如下所示的问题:耦合度偏高,所以想要使用IoC,将对象创建控制权由程序内部转移到外部
从而,在定义BookServiceImpl
中的bookDao
的时候,就不需要在进行new…进而修改很多的代码
Spring实现IoC的方式如最上面的图,这里给出一个IoC的案例,手动配置Spring中的IoC,做法如下:
- 在
pom.xml
中加入dependency,刷新maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
- 在resource下创建Spring config文件配置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">
<!--1. 导入spring的坐标spring-context-->
<!--2. 配置bean-->
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性标示给bean定义的类型
-->
<bean id="bookDao" class="com.example.demo231116.dao.impl.BookDaoImpl" />
<bean id="bookService" class="com.example.demo231116.service.impl.BookServiceImpl" />
</beans>
- 获取IoC容器和bean:
public class Demo231116Application2 {
public static void main(String[] args) {
// 3. 获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
// 4. 获取bean
// BookDao bookDao = (BookDao) ctx.getBean("bookDao");
// bookDao.save();
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
}
}
这里getBean()
中的参数就是在xml文件中配置的bean的id,配置中直接指向对应的类
所以自然而然也可以知道,我们不可以定义相同id指向不同的类,这是不合法的