IOC理论推导
在Sping前创建项目的操作
1.UserDao 接口
2.UserDaoImpl 实现类
3.UserService 业务接口
4.UserServiceImpl 业务实现类
新建一个maven项目
File->new->project
选择maven项目->next
修改成自己的
在pom.xml文件导入jar包
记得修改maven仓库位置
删除src文件
删除后:
目的:
为了建子项目,可以在一个项目中管理很多东西
新建一个module
Spring出现前的项目流程
新建包:com.kuang.dao
新建UserDao接口
为UserDao接口添加方法
package com.kuang.dao;
public interface UserDao {
void getUser();
}
创建UserDao接口的实现类UserDaoImpl
package com.kuang.dao;
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
创建com.kuang.service包
创建UserService接口
创建UserService接口实现类UserServiceImpl
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试
在Test包下创建myTest类
代码:
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
public class myTest {
public static void main(String[] args) {
UserService userService= new UserServiceImpl();
userService.getUser();
}
}
测试结果
在Dao层添加一个mysql的实现
service层的代码需要去改变
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoMysqlImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试结果
只要用户请求发生变更,service层就需要手动去更改。程序无法适应用户的变更
优化:利用set动态实现值的注入
只需要变更UserDaoServiceImpl层代码
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
测试
import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
public class myTest {
public static void main(String[] args) {
UserService userService= new UserServiceImpl();
((UserServiceImpl)userService).setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!
如果程序代码量非常大,修改一个代码的成本十分昂贵
我们使用一个Set接口实现,代码发生了革命性的变化
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
● 之前:程序是主动创建对象!控制权在程序员手上
● 使用set注入后,程序不再具有主动性,而是变成了被动的接收对象!
这种思想,从本质上解决了问题,程序员不需要去管理对象的创建了,系统的耦合性大大降低,可以更加专注的在业务的实现上
|