UserDao接口
package com.dream.dao; public interface UserDao { void getUser(); }
UserDao实现类
package com.dream.dao; public class UserDaoImpl implements UserDao{ @Override public void getUser() { System.out.println("获取用户数据"); } }
UserService接口
package com.dream.service; public interface UserService { void getUser(); }
UserService实现类
package com.dream.service; import com.dream.dao.UserDao; import com.dream.dao.UserDaoImpl; public class UserServiceImpl implements UserService{ UserDao userDao = new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
测试类
import com.dream.service.UserServiceImpl; import org.junit.Test; public class MyTest { @Test public void test(){ UserServiceImpl userService = new UserServiceImpl(); userService.getUser(); } }
如果我们有新的需求
package com.dream.dao; public class UserDaoMysqlImpl implements UserDao{ @Override public void getUser() { System.out.println("MySql获取数据"); } }
就需要去UserService修改代码
package com.dream.service; import com.dream.dao.UserDao; import com.dream.dao.UserDaoImpl; import com.dream.dao.UserDaoMysqlImpl; public class UserServiceImpl implements UserService{ UserDao userDao = new UserDaoMysqlImpl(); @Override public void getUser() { userDao.getUser(); } }
同理
package com.dream.dao; public class UserDaoOracleImpl implements UserDao{ @Override public void getUser() { System.out.println("Oracle获取数据"); } }
package com.dream.service; import com.dream.dao.UserDao; import com.dream.dao.UserDaoImpl; import com.dream.dao.UserDaoMysqlImpl; import com.dream.dao.UserDaoOracleImpl; public class UserServiceImpl implements UserService{ UserDao userDao = new UserDaoOracleImpl(); @Override public void getUser() { userDao.getUser(); } }
可如果这种需求很多,每次变动就需要修改大量代码,代码写死了,耦合性太高,这种方式就不适用了
那这种问题该怎么解决呢
重写修改一下UserServiceImpl代码
package com.dream.service; import com.dream.dao.UserDao; import com.dream.dao.UserDaoImpl; import com.dream.dao.UserDaoMysqlImpl; import com.dream.dao.UserDaoOracleImpl; public class UserServiceImpl implements UserService{ private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser() { userDao.getUser(); } }
测试
import com.dream.dao.UserDaoImpl; import com.dream.dao.UserDaoMysqlImpl; import com.dream.dao.UserDaoOracleImpl; import com.dream.service.UserServiceImpl; import org.junit.Test; public class MyTest { @Test public void test(){ UserServiceImpl userService = new UserServiceImpl(); userService.setUserDao(new UserDaoImpl()); userService.getUser(); userService.setUserDao(new UserDaoMysqlImpl()); userService.getUser(); userService.setUserDao(new UserDaoOracleImpl()); userService.getUser(); } }
可以看到UserServiceImpl相当于提供了一个接口,面对不同的需求,我们可以自行创建对象传递给他。主动权交给了调用者,程序不用去管怎么创建,怎么实现,只负责提供一个接口, 这也就是IoC的原型
IoC本质控制反转(IoC)是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(DI)
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)