1. 程式人生 > 其它 >Spring入門(一):Spring簡介及IOC控制反轉

Spring入門(一):Spring簡介及IOC控制反轉

技術標籤:Javajavaspringioc

一:Spring基本概念
1.spring是容器框架,建立bean,並維護bean之間的關係,即Spring包含並管理應用物件的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立–基於一個可配置原型(prototype),你的bean可以建立一個單獨的例項或者每次需要時都生成一個新的例項–以及它們是如何相互關聯的。
2.spring可以管理web層,持久層,業務層。spring可以配置各
個層的元件並且維護各個層之間的關係。
二:核心原理之IOC
IOC控制反轉(Inversion Of Control),意義等同於 DI(Dependency Injection)。

概念:控制權由物件本身轉向容器,由容器根據配置檔案建立 物件例項並實現各個物件之間的依賴關係。
即Spring通過一種稱作控制反轉(IoC)的技術促進了低耦合。當應用了IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoC與JNDI相反–不是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。
核心:bean工廠。
三:入門案例
當編寫一個模擬儲存賬戶功能時,如下所示,需要先在持久層完成功能,業務層呼叫持久層,表現層呼叫業務層:

//賬戶持久層實現類
public class AccountDaoImpl implements
AccountDao{ public void saveAccount(){ System.out.println("賬戶儲存成功!"); } }
//賬戶業務層實現類
public class AccountServicesImpl implements AccountServices {
    private AccountDao accountDao = new AccountDaoImpl();
    public void saveAccount(){
        accountDao.saveAccount();
    }
}
//賬戶表現層實現類
public class Client {
    public static void main(String[] args) {
        AccountServices accountServices = new AccountServicesImpl();
        accountServices.saveAccount();
    }
}

在這裡插入圖片描述
可見類與類之間的依賴也就是耦合度比較高,於是我們需要引入第三方,將控制權交給第三方來降低類之間的耦合度。
使用spring控制反轉思想之後:
建立一個配置檔案,用於儲存持久層和表現層實現類物件的建立語句:

accountServices=com.itheima.services.impl.AccountServicesImpl
accountDao=com.itheima.dao.impl.AccountDaoImpl

bean工廠思想:

public class FactoryBean {
    //定義一個properties物件
    private static Properties properties;
    //定義一個Map來儲存物件
    private static Map<String,Object> beans;
    //使用靜態程式碼塊為properties物件賦值
    static {
        try {
            //例項化properties物件
            properties = new Properties();
            //使用類載入器獲取properties檔案的流物件
            InputStream inputStream = FactoryBean.class.getClassLoader().getResourceAsStream("bean.properties");
            //載入配置檔案
            properties.load(inputStream);
            //例項化容器
            beans = new HashMap<String,Object>();
            //取出配置檔案中所有的key
            Enumeration<Object> keys = properties.keys();
            //遍歷列舉
            while(keys.hasMoreElements()){
                //取出每個key
                String key = keys.nextElement().toString();
                //根據Key獲取value
                String beanPath = properties.getProperty(key);
                System.out.println(beanPath);
                //反射建立物件
                Object value = Class.forName(beanPath).newInstance();
                //把key和value存入容器
                beans.put(key, value);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /*
    根據bean的名稱獲取bean物件
     */
   public static Object getBean(String beanName){
        return beans.get(beanName);
    }
}
//賬戶業務層實現類
public class AccountServicesImpl implements AccountServices {
    private AccountDao accountDao = (AccountDao) FactoryBean.getBean("accountDao");
    public void saveAccount(){
        accountDao.saveAccount();
    }
}
//賬戶表現層實現類
public class Client {
    public static void main(String[] args) {
        AccountServices accountServices = (AccountServices) FactoryBean.getBean("accountServices");
        accountServices.saveAccount();
    }
}