java框架學習日誌-1
阿新 • • 發佈:2018-12-11
spring有幾個關鍵字:輕量級框架,Ioc容器(控制反轉),AOP(面向切面程式設計),對事物的支援,對框架的支援。
首先看ioc,視訊中給了一個例子,(我也不知道這個和控制反轉這4個字有什麼關係):
首先是介面層,有一個介面。
package cn.sxt.dao;
public interface UserDao {
public void getUser();//不用管幹啥,反正就是模擬獲取使用者的一個方法
}
然後是兩個介面實現類。作用一樣,只是一個模擬通過MySql獲取使用者資料,一個模擬通過Oracle獲取使用者資料。
MySQL獲取使用者資料
package cn.sxt.dao.impl; import cn.sxt.dao.UserDao; public class UserDaoMySqlImpl implements UserDao{ @Override public void getUser() { System.out.println("獲取使用者資料---MySql"); } }
Oracle獲取使用者資料
package cn.sxt.dao.impl;
import cn.sxt.dao.UserDao;
public class UserDaoOracleImpl implements UserDao{
@Override
public void getUser() {
System.out.println("獲取使用者資料---Oracle");
}
}
然後是服務層介面
package cn.sxt.sevice; public interface UserService { public void getUser(); }
服務層介面實現類
package cn.sxt.sevice.impl; import cn.sxt.dao.UserDao; import cn.sxt.dao.impl.UserDaoMySqlImpl; import cn.sxt.dao.impl.UserDaoOracleImpl; import cn.sxt.sevice.UserService; public class UserServicImpl implements UserService{ @Override public void getUser() { } }
注意了,UserServiceImpl裡面的getUser方法需要呼叫UserDao的getUser方法。比如,如果我們需要用MySql去獲取使用者資料,那麼就要需要new一個UserDaoMySqlUmpl的物件,然後呼叫getUser方法。
public class UserServicImpl implements UserService{
private UserDao userDaoMySql=new UserDaoMySqlImpl();
@Override
public void getUser() {
userDaoMySql.getUser();
}
}
這樣寫是沒有問題,但是如果需要用Oracle的方法獲取使用者資料呢?那麼又需要去new一個UserDaoOracleImpl物件
public class UserServicImpl implements UserService{
private UserDao userDaoOracle=new UserDaoOracleImpl();
@Override
public void getUser() {
userDaoOracle.getUser();
}
}
這樣就需要去程式內部去修改程式碼。如果需要有更多的方法去獲取使用者資料,那麼就需要每次都需要修改原始碼,很不方便,這種寫法就違反了開閉原則(對修改關閉,對拓展開放)而且Servic類與Dao之間的耦合太高了。那麼就需要解耦。首先修改一下UserServicImpl的程式碼
public class UserServicImpl implements UserService{
private UserDao userDao=null;//原來是在這裡直接給userDao指定實現的是哪個類。現在先把NUll賦給userDao。
/**
* 新增一個setUserDao去給UserDao指定物件,這樣的話UserServicImpl和UserDao就解耦了。
* @param userDao
*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
然後測試一下
public class test {
public static void main(String[] args) {
UserServicImpl userServic=new UserServicImpl();
userServic.setUserDao(new UserDaoOracleImpl());
userServic.getUser();
userServic.setUserDao(new UserDaoMySqlImpl());
}
}
測試結果
這個例子其實程式碼很簡單,關鍵要理解為什麼這麼寫,這麼寫有什麼好處。程式碼改進後,從結果上來看好像和之前一樣,但是改進後,把new物件這一把從原始碼移到客戶端。這樣就有幾個好處:
- 應用程式本身不建立物件了,現在只是被動地接收物件。
- 程式設計師可以不再關注物件的建立,而只需要關注業務的實現。
- 實現了Service與Dao的解耦。
- 方便拓展。