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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人