IOC控制反转
IOC是一种编程思想,由主动的编程变成被动的接收
控制: 谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用spring后,对象是由spring来创建的。
反转:程序本身不创建对象,而变成了被动的接受对象
依赖注入: 利用set() 方法进行注入
例子
一、未使用控制反转思想
dao层
public interface UserDao {
void getUser();
}
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("获取用户!!");
}
}
public class UserDaoMysqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("mysql获取数据");
}
}
service层
public interface UserService {
void getUser();
}
注意这里对象是程序写死的
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMysqlImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试
此时是由程序主动的创建对象,增加了耦合性。每次修改业务时都要去修改service层,要不停的的改动代码。业务少少时并不明显,但当业务特别复杂时,改动代码就比较麻烦了。
二、使用IOC控制反转思想
dao层无需改变仅仅修改service层就可以实现
service层
public class UserServiceImpl implements UserService {
private UserDao userDao ;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
测试
虽然改了一点点,但却发生了翻天覆地变化。程序本身不再创建对象,而变成了被动的接受对象。
三、用spring进行改造
dao层不变
service层
import com.fei.dao.UserDao;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void getUser() {
userDao.getUser();
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
bean.xml 自动装配
<bean name="UserDaoImpl" class="com.fei.dao.UserDaoImpl"/>
<bean name="MysqlImpl" class="com.fei.dao.UserDaoMysqlImpl"/>
<!--UserDao 必须setter-->
<bean name="UserServiceImpl" class="com.fei.service.UserServiceImpl">
<property name="UserDao" ref="MysqlImpl"/>
</bean>
测试
小结
根据这个例子我们可以明显的观察到IOC控制反转给我们带来的方便,以及代码的耦合度的降低。
值得注意的是property属性需要 该参数进行setter()
上述用的是遇见狂神说spring课程所举的例子