Spring入門(一):Spring簡介及IOC控制反轉
阿新 • • 發佈:2021-01-12
一: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();
}
}