Spring框架簡介①

Milky-way發表於2018-08-06

Spring是一個開源框架, 採用bean來替換ejb。從簡單性、可測試性、和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和麵向切面(AOP)。

下面簡單介紹一下在沒有使用Spring框架的時候直接new 一個bean的過程(比較繁瑣)

簡單java工程截圖:

dao層:

UserDao.java

package com.rl.spring.dao;

public interface UserDao {

    public void save();
}

UserDaoImpl.java

package com.rl.spring.dao.impl;

import com.rl.spring.dao.UserDao;

public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("user被儲存了!");
    }
}

UserService.java

package com.rl.spring.service;

public interface UserService {

    public void save();
}

UserServiceImpl.java

package com.rl.spring.service.impl;

import com.rl.spring.dao.UserDao;
import com.rl.spring.dao.impl.UserDaoImpl;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao = new UserDaoImpl();
    
    @Override
    public void save() {
        userDao.save();
    }
}

測試程式碼:

package com.rl.spring.service;

import org.junit.jupiter.api.Test;

import com.rl.spring.service.impl.UserServiceImpl;

class UserServiceTest {

    UserService userService = new UserServiceImpl();
    
    @Test
    void testSave() {
        userService.save();
    }
}

控制檯輸出:

user被儲存了!

這種自己new的bean有一個非常不好的地方在於高耦合, 我們做程式講究低耦合, 高內聚, 這種自己new的形式有了一種侵入性.

可以將上面的例子做個修改: 增加一個工廠bean

如圖:

FactoryBean.java

package com.rl.spring.factory;

import com.rl.spring.dao.UserDao;
import com.rl.spring.dao.impl.UserDaoImpl;

public class FactoryBean {

    public static UserDao getDao(String name) {
        if(name == "userDao") {
            return new UserDaoImpl();
        }
        return null;
    }
}

修改UserServiceImpl.java

package com.rl.spring.service.impl;

import com.rl.spring.dao.UserDao;
import com.rl.spring.factory.FactoryBean;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

//    private UserDao userDao = new UserDaoImpl();
    
    //利用工廠Bean的形式來獲得Dao
    private UserDao userDao = new FactoryBean().getDao("userDao");
    
    @Override
    public void save() {
        userDao.save();
    }
}

這樣就解決了侵入性的問題, 這種方式同樣也是Spring的實現邏輯, Spring需要配置檔案來配置, 並把你具體需要的bean利用Factory來建立.

控制反轉就是應用本身不負責物件的建立和維護, 物件和依賴物件建立完全交給Spring的容器去管理和維護, 這個權利反轉給容器.

控制反轉和依賴注入其實是一個概念, 達到了大大降低耦合性的目的(解耦分層), 

相關文章