本文算是觀看狂神說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原型,從本質上解決了上述問題,大大降低了系統的耦合性,使得程序員能夠專注於業務的實現。