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;
/*
* 业务层(service层)调用数据访问层(dao层)
*
* java中除了继承还有组合的概念
* */
public class UserServiceImpl implements UserService{
// 将UserDao引入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) {
//用户实际调用的是业务层,dao层用户不需要接触
UserService userService= new UserServiceImpl();
// 用户调用业务层的getUser方法
userService.getUser();
}
}
测试结果
在Dao层添加一个mysql的实现
service层的代码需要去改变
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
/*
* 业务层(service层)调用数据访问层(dao层)
*
* java中除了继承还有组合的概念
* */
public class UserServiceImpl implements UserService{
// 将UserDao引入UserService
// private UserDao userDao = new UserDaoImpl();
// 要想实现UserDaoMysqlImpl,private UserDao userDao = new UserDaoImpl();需要修改为下面的
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;
/*
* 业务层(service层)调用数据访问层(dao层)
*
* java中除了继承还有组合的概念
* */
public class UserServiceImpl implements UserService{
// 将UserDao引入UserService
// private UserDao userDao = new UserDaoImpl();
// 要想实现UserDaoMysqlImpl,private UserDao userDao = new UserDaoImpl();需要修改为下面的
// private UserDao userDao = new UserDaoMysqlImpl();
private UserDao userDao;
//利用set方法进行动态实现值的注入
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) {
//用户实际调用的是业务层,dao层用户不需要接触
UserService userService= new UserServiceImpl();
((UserServiceImpl)userService).setUserDao(new UserDaoMysqlImpl());
// 用户调用业务层的getUser方法
userService.getUser();
}
}
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!
如果程序代码量非常大,修改一个代码的成本十分昂贵
我们使用一个Set接口实现,代码发生了革命性的变化
private UserDao userDao;
//利用set方法进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}