本文算是观看狂神说Java视频的笔记吧,视频链接:https://space.bilibili.com/95256449
第一次使用IDEA,记录下使用过程以及IOC理论推导过程,算是今天一天学习的总结复习。
在引入IOC思想之前,要想进行MVC开发,一般模式为:
- UserDao接口
- UserDaoImpl实现类
- UserService业务接口
- UserServiceImpl业务实现类
按照传统编程,将这个模式一一实现,过程如下:
一、IDEA创建项目
1、创建项目:"Create New Project"——>点击左边的"Maven"——>next,并将"GroupId"命名(如com.kuang),"ArtifactId"命名(如spring-study)——>next,project name改为"spring-study",即需要加"-"。
2、导入jar包:导入Spring所需的包,点击"pom.xml",添加以下代码:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
3、为了能创建自己的子项目,可以将spring study的src删掉
4、创建Moudle:new——>"moudle"——>ArtifactId命名为:"spring-01-ioc1"——>next,moubld name 命名为"spring-01-ioc1"
5、创建包:spring study——>spring-01-ioc1——>src——>main——>java,新建包"com.kuang.dao"与"com.kuang.service",并在包dao下创建UserDao接口与UserDaoImpl实现类,在包service下创建UserService业务接口与UserServiceImpl业务实现类
二、MVC实现
各个模块代码如下:
- UserDao接口
package com.kuang.dao;
public interface UserDao {
void getUser();
}
- UserDaoImpl实现类
package com.kuang.dao;
public class UserDaoImpl implements UserDao{
public void getUser(){
System.out.println("默认获取用户的数据");
}
}
- UserService业务接口
package com.kuang.service;
public interface UserService {
void getUser();
}
- UserServiceImpl业务实现类
package com.kuang.service;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
public void getUser(){
//业务层调DAO层,使用了组合方式
userDao.getUser();
}
接下来需要创建一个测试类,spring study——>spring-01-ioc1——>src——>test——>java,创建一个"MyTest.java",内容如下:
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args){
//三层架构,用户调用的是业务层,DAO层他们不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
运行MyTest.java,控制台会输出“默认获取用户数据”,表示运行成功。
三、IOC思想引入
假设用户需求从“默认获取用户数据”变成“使用Mysql获取用户数据”,则需要在dao包下增加一个UserDaoMysqlImpl类,并将UserServiceImpl业务实现类变为:
package com.kuang.service;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoMysqlImpl();
public void getUser(){
//业务层调DAO层,使用了组合方式
userDao.getUser();
}
这样就带来一个问题:用户需求一旦发生变化,就需要改动原有代码,要是代码量庞大,则维护与开发成本太大,费时费力。
为了解决这个问题,可以这样改变:
UserServiceImpl业务实现类变为:
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 UserDaoImpl();
private UserDao userDao;
//利用set实现动态值的注入
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser(){
//业务层调DAO层,使用了组合方式
userDao.getUser();
}
}
MyTest.java变为:
import com.kuang.dao.*;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args){
//三层架构,用户调用的是业务层,DAO层他们不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoOracleImpl());
userService.getUser();
}
}
引入set方法,就可以将控制权从程序员手上转为用户手上,之前是程序主动创建对象,改变之后程序变成了被动接受对象。这就是IOC原型,从本质上解决了上述问题,大大降低了系统的耦合性,使得程序员能够专注于业务的实现。