IOC Inversion of Control 控制反转
之前,在 Servlet 中,我们创建 service 对象:FruitService fruitService = new FruitServiceImpl();
- 如果是在 Servlet 的某个方法中创建对象,则 这个 fruitService 对象的作用域(生命周期)就是这个方法级别
- 如果是在 Servlet 的类中创建对象,则这个 fruitService 对象是一个成员变量,这个对象的作用域(生命周期)就是这个 Servlet 实例级别的,从 Servlet 的实例化开始到销毁
之后,在 applicationContext.xml 中定义了 fruitService,然后通过解析 XML,产生 fruitService 实例,存放在 beanMap 中,beanMap 在一个 BeanFactory 类中实现,每个 Service 实例对象从 beanMap 容器开始创建是产生,容器销毁前销毁,即 Service、DAO 等等实例对象的生命周期被转移了,控制权从程序员转移到 BeanFactory 类中
DI Dependency Injection 依赖注入
之前,在 Controller 层创建 Service 实例:FruitService fruitService = new FruitServiceImpl();
- FruitController 与 FruitService 两个不同层存在耦合
之后,在 applicationContext.xml 文件中配置 bean 标签,每一个 bean 标签对应一层,层间关系通过 bean 标签的子标签 property 实现 -- 即,层间关系不同手动创建实例对象,而是通过 bean 容器实现依赖注入
-
<beans> DAO 层 <bean id="fruitDAO" class="com.atguigu.fruit.dao.impl.FruitDAOImpl"/> <bean id="fruitService" class="com.atguigu.fruit.service.impl.FruitServiceImpl"> <!-- property标签用来表示属性;name表示属性名;ref表示引用其他bean的id值--> <property name="fruitDAO" ref="fruitDAO"/> </bean> <bean id="fruitController" class="com.atguigu.fruit.controllers.FruitController"> <property name="fruitService" ref="fruitService"/> </bean> </beans>
-
DAO 层,实现各种操作数据库的单精度方法
-
<bean id="fruitDAO" class="com.atguigu.fruit.dao.impl.FruitDAOImpl"/>
-
-
Service 层
-
Service 层,提供服务、完成实际业务,需要调用 DAO 层方法 - 设置 property 子标签表层间关系
-
<bean id="fruitService" class="com.atguigu.fruit.service.impl.FruitServiceImpl"> <!-- property标签用来表示属性;name表示属性名;ref表示引用其他bean的id值--> <property name="fruitDAO" ref="fruitDAO"/> </bean>
-
-
Controller 层
-
Controller 层,接受请求、响应请求,需要调用 Service 层方法 - 设置 property 子标签表层间关系
-
<bean id="fruitController" class="com.atguigu.fruit.controllers.FruitController"> <property name="fruitService" ref="fruitService"/> </bean>
-