2-ioc控制反转思想
IOC控制反转思想举例
仓库地址:点击跳转
1. 创建工程
利用Maven创建一个空白工程spring1,其目录结构如下:
然后创建以下几个接口和类:
- Dao层
- Service业务层
- 用户层(test表示用户测试)
2. 代码实现
目标:用户要在test1中创建一个对象,调用Dao层的某个方法 getUser()
来实现某种功能
Dao层
UserDao接口:
package com.ajream.Dao;
public interface UserDao {
void getUser();
}
UserDaoImpl:
package com.ajream.Dao;
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取用户数据。。。");
}
}
UserMysqlDaoImpl:
package com.ajream.Dao;
public class UserMysqlDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("MySQL获取用户数据。。。");
}
}
没有使用控制反转时的业务层
UserService接口:
package com.ajream.Service;
public interface UserService {
void getUser();
}
UserServiceImpl:
即:
package com.ajream.Service;
import com.ajream.Dao.UserDao;
import com.ajream.Dao.UserDaoImpl;
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl(); //注意此处
public UserServiceImpl() {
}
public void getUser() {
this.userDao.getUser();
}
}
注意没有使用IOC时第8行代码,这样写的缺点:
这样指定创建了一个对象UserDaoImpl,假如我要创建另一个对象UserMysqlDaoImpl,用户就需要修改业务层这一行代码,例如改为:
private UserDao userDao = new UserMysqlDaoImpl();
很明显,这样有些不方便,作为用户,应该不需要关心业务的具体实现
使用控制反转后的业务层
UserService接口不变
UserServiceImpl使用setUser来创建对象:
package com.ajream.Service;
import com.ajream.Dao.UserDao;
public class UserServiceImpl implements UserService{
private UserDao userDao;
@Override
public void getUser() {
userDao.getUser();
}
public void setUser(UserDao userDao){
this.userDao = userDao;
}
}
用户可以通过调用
setUser()
方法来创建不同对象(只需要传入不同参数即可)
对比:
test1(这里是用户调用业务层实现业务的部分)
- 没有使用IOC时
package com.ajream;
import com.ajream.Dao.UserDaoImpl;
import com.ajream.Dao.UserMysqlDaoImpl;
import com.ajream.Service.UserService;
import com.ajream.Service.UserServiceImpl;
public class test1 {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.getUser();
}
}
- 使用了IOC的思想后
package com.ajream;
import com.ajream.Dao.UserDaoImpl;
import com.ajream.Dao.UserMysqlDaoImpl;
import com.ajream.Service.UserService;
import com.ajream.Service.UserServiceImpl;
public class test1 {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
// 通过修改setUser参数来反向创建不同对象
((UserServiceImpl) userService).setUser(new UserDaoImpl());
userService.getUser();
((UserServiceImpl) userService).setUser(new UserMysqlDaoImpl());
userService.getUser();
}
}
对比:
3. 一张图表示三者之间关系
用户希望通过调用业务层来实现各个具体的业务如 Mysql
、Oracle
,…
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383529.html