【Spring03】IoC控制反转

1 依赖关系

在MVC设计模式中,我们需要在Service方法中去使用Dao的方法,所以会在Secrvice中去new 一个Dao:

private UserDao userDao = new UserDaoImpl();

然后去调度Dao的相关方法:

userDao.deleteUser(1);

那么我们就认为Service是依赖着Dao,需要借助Dao的功能完成自己的业务。其实不光是Service依赖Dao,Controller(Servlet)也依赖着Service。

2 强耦合

现在满足依赖关系的方式是直接new一个对象,但这其实是由很大的缺陷:强耦合(在一个类中明确引用另外一个类就被称为强耦合)例如当Dao需要修改时,必须连同Service一起修改成倍增加了项目的维护成本。

一个健壮的项目便不应该有强耦合的问题,当我们需要修改一个类的时候,应该只需要修改这个类本身,和这个类关联的类应该不需要做任何修改。类比换鼠标,当我们需要去换一个鼠标的时候,应该只需要换一个鼠标就好,而不应该连带电脑主板上的鼠标实现电路都更换掉。

3 IoC

控制反转IoC(Inverse of Control)反转了依赖关系的满足方式(变主动为被动),有之前自己创建依赖对象(直接new)变为有工厂推送,解决了具有依赖关系组件之间的强耦合,使得项目形态更加稳健。

例如3.1中的例子,通过IoC的思想去实现:

Service:

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    ......

  • 不引用任何一个具体的组件(实现类),在需要其他组件的位置预留取值入口(setter/getter)

  • private UserDao userDao;

    • 不耦合任何Dao实现,消除不稳健因素

    • 为UserDao定义getter/setter,允许userDao属性接收Spring的赋值

Spring配置xml文件:

......
<bean id="userDao" class="com.jackqiang.ch001hellospring.UserDapImpl"></bean>
<bean id="userService" class="com.jackqiang.ch001hellospring.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>
......

  • <bean id="userService" class=".......UserServiceImpl">

    • UserServiceImpl组件

  • <property name="userDao" ref="userDao"/>

    • 由Spring为userDao属性赋值,值为id="userDao"的bean

此时,如果需要更换其他的UserDao实现类,直接更换即可,不需要对UserService做仍和改动。

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/framework/spring/1990/ioc/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录