- 如果要调用UserDaoMysqlImpl接口实现类,那么需要在UserServiceImpl这个业务接口实现类,改变private UserDao userDao= new UserDaoImpl();这句代码为private UserDao userDao= new UserDaoMysqlImpl();
- 由于每一次调用不同的dao接口实现类,都要在业务接口实现类UserServiceImpl做出更改,很不方便,显得不灵通
- 因此我们采用另一种方式【也就是类似IOC的原型思想?】用set来进行动态实现值的注入!使得程序不再具有主动性,它被动地接受对象
- 这种思想从本质上解决了问题,程序员不需要再管理对象的创建,系统的耦合性大大降低~这是IOC的原型!
1.dao层
1.1、UserDao接口
package com.lobster.dao;
public interface UserDao {
void getUser();
}
1.2、UserDaoImpl接口实现类
package com.lobster.dao;
public class UserDaoImpl implements UserDao{
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
1.3、UserDaoMysqlImpl接口实现类
package com.lobster.dao;
public class UserDaoMysqlImpl implements UserDao {
public void getUser() {
System.out.println("Mysql输出");
}
}
2.service层
2.1、UserService业务接口
package com.lobster.service;
public interface UserService {
void getUser();
}
2.2、UserServiceImpl业务接口实现类
package com.lobster.service;
import com.lobster.dao.UserDao;
import com.lobster.dao.UserDaoImpl;
import com.lobster.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements UserService {
private UserDao userDao= new UserDaoImpl() ;
public void getUser() {
userDao.getUser();
}
}
3.测试
import com.lobster.service.UserService;
import com.lobster.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
//用户实际调用的是业务层,不需要接触dao
UserService userService = new UserServiceImpl();
//打印输出的会是dao层
userService.getUser();
}
}
========================================
以IOC的思想来做,利用set动态实现值的注入
dao层的UserDao接口和两个接口实现类UserDaoImpl、UserDaoMysqlImpl以及UserService业务接口跟上面的一样不需改变,
只改变UserServiceImpl和测试类即可
UserServiceImpl业务接口实现类
package com.lobster.service;
import com.lobster.dao.UserDao;
public class UserServiceImpl implements UserService {
private UserDao userDao;
//使用set动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
测试
import com.lobster.dao.UserDaoImpl;
import com.lobster.service.UserService;
import com.lobster.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
//用户实际调用的是业务层,不需要接触dao
UserService userService = new UserServiceImpl();
((UserServiceImpl) userService).setUserDao(new UserDaoImpl());
//打印输出的会是dao层
userService.getUser();
}
}
================================
如果要调用的是UserDaoMysqlImpl,只需要在测试类中将**((UserServiceImpl) userService).setUserDao(new UserDaoImpl());**更改为((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
**也就是说不需要再去动UserServiceImpl这个业务接口实现类,只需要在测试类中稍作改变即可!**