原先MVC写法:
//UserDao接口
public interface UserDao {
public void getUser();
}
///
//UserDao的实现类
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("hello");
}
}
//UserService的接口
public interface UserService {
public void getUser();
}
//Service的实现类
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
//测试运行
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
此时需求来了,把Userdao的实现类增加一个:
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("MySql!");
}
}
使用UserDaoMySqlImpl的话 , 我们就需要去service实现类里面修改对应的实现
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMySqlImpl();//需要改这里
@Override
public void getUser() {
userDao.getUser();
}
}
问题出现:要使用别的UserDaoXxxImpl , 就需要去service实现类里面修改对应的实现。
解决方法:
public class UserServiceImpl implements UserService {
private UserDao userDao;
//不再写private UserDao userDao = new UserDaoMySqlImpl();
//利用set实现
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );//利用set实现
service.getUser();
/*
service.setUserDao( new UserDaoXxxImpl() );//那又想别的实现
service.getUser();*/
}
结论:以前所有东西都是由程序去进行控制创建,而现在是由我们自行控制创建对象,把主动权交给了调用者 。程序不用去管怎么创建,怎么实现了 。它只负责提供一个接口 。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(Dependency Injection,DI)。
使用IOC :
<?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">
<bean id="MysqlImpl" class="com.koma.dao.impl.UserDaoMySqlImpl"/>
<bean id="XxxxImpl" class="com.koma.dao.impl.UserDaoXxxImpl"/>
<bean id="ServiceImpl" class="com.koma.service.impl.UserServiceImpl">
<property name="userDao" ref="XxxImpl"/>
</bean>
</beans>
@Test
public void Test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("ServiceImpl");
serviceImpl.getUser();
}