以往在定义业务层实现时,在指定具体地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标签标示配置beanid属性标示给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指向不同的类,这是不合法的