1. 程式人生 > >java框架學習日誌-1

java框架學習日誌-1

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的解耦。
  • 方便拓展。