小王學習錄
- IoC(Inversion of Control)
- 1. 什么是IoC
- 2. 什么是Spring IoC
- 3. 什么是DI
- 4. Spring IoC的作用
- 存儲Bean對象
- 1. 創建Bean
- 2. 將Bean注冊到Spring中.
- 取Bean對象.
- 1. 獲取Spring上下文信息
- 使用ApplicationContext和BeanFactory的區別
- 2. 獲取指定Bean對象
IoC(Inversion of Control)
1. 什么是IoC
Inversion of Control, 控制反轉
. 所謂控制, 就是控制對象的生命周期. 對象的生命周期由創建這個對象的類控制. 有時對控制權進行反轉, 可以起到很好的編程效果, 從而完成特定的功能.
例如: 創建了一個對象, 稱為對象1, 對象1要依賴于對象2, 對象2要依賴于對象3.
如果在對象1中創建對象2, 在對象2中創建對象3. (也就是對象3的控制權在類2中, 對象2的控制權在類1中)
當改變一個類的構造方法時, 如在構造方法中增加參數, 同時也需要對依賴這個類的類中的代碼進行修改.
也就是如果此時要對類3的構造函數進行修改, 同時類2和類1中的構造函數也要進行修改. 這就造成了高耦合.
如果將創建對象的操作都在類1中進行, 也就是將控制權反轉給類1, 那么此時如果要對類3的構造函數進行修改, 只需要對類1和類3的構造函數進行修改即可了.
2. 什么是Spring IoC
上面已經介紹了IoC控制反轉, 所謂Spring IoC就是將控制權交給Spring
, 即將對象的創建以及后續的管理(對象的生命周期交給Spring). 實際上IoC是Spring框架中的一個核心理念
, 因此, Spring也可以看作是實現了IoC功能的容器(框架), 是一個包含了眾多工具和方法的IoC容器.
Spring容器中用于存儲JavaBean對象, 既然是容器, 就又有了兩大核心功能, 即對象(Bean)的存和取
.
3. 什么是DI
Dependency Injection, 依賴注入
. 是將依賴的某個對象注入到當前類的行為.
DI依賴注入是一種技術
, 而IoC是一種思想
. Spring為IoC提供了容器. 而依賴注入是用于解決容器中取Bean的技術之一. 因此可以說DI是IoC的一種實現.
IoC(Inversion of Control)和DI(Dependency Injection)通常被認為是同一件事的不同表述
,因為它們都涉及到將控制權從應用程序本身轉移到外部容器
,并通過容器來管理對象的創建、裝配和生命周期。
在通過將對象之間的關系交給外部容器來實現解耦、可維護和可測試這件事中. IoC強調的是控制的反轉
,即應用程序不再控制對象的創建和生命周期,而是將這些任務交給外部容器。而DI強調的是依賴的注入
,即對象不再負責自己依賴關系的創建,而是通過外部注入的方式獲取依賴。
4. Spring IoC的作用
- Spring IoC通過控制反轉的思想, 將對象的創建和管理交給了Spring, 實現了
解耦
- 使用對象時更加
方便
. 程序員不必關注對象的創建以及這個對象背后的依賴關系, 而是直接向Spring容器中通過DI取對象, 當不需要再利用此對象時, 再交給Spring繼續對對象進行管理即可. - 創建對象更加
高效
. 對于一個類的實例來說, 不必再進行重復的創建操作, 而是由Spring創建(默認是單例的), 每當有程序要用到實例時, 直接從Spring中取即可.
存儲Bean對象
spring作為一個容器, 要完成的兩大核心功能是存儲Bean對象和取出Bean對象.
存儲Bean對象需要先創建Bean, 然后將Bean注冊到Spring容器中.
1. 創建Bean
所謂Bean對象就是java中的普通對象. 在Spring中, 將被多次使用(取)的對象稱為Bean對象. 創建Bean很簡單, 和之前創建一個類的寫法無異. 以下是創建一個簡單的Bean
public class UseController {public void print(){System.out.println("do_useController");}
}
2. 將Bean注冊到Spring中.
- 首先要在resources目錄下創建一個spring配置文件(spring-config.xml).在配置文件中加入如下代碼.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
- 將bean注冊到spring中, 這一步也很簡單. 在配置文件中加入如下代碼
<bean id="useController" class="com.annotation.UseController"></bean>
id是對象名, class是類的路徑. 以上步驟就將useControoller這個Bean對象存儲到Spring中了, 接下來我們看如何從Spring中吧Bean取出來.
取Bean對象.
取Bean對象分為以下兩步:
- 獲取Spring上下文信息. Bean對象交由Spring進行管理, 因此要想獲取到Bean對象, 就需要先獲取Spring上下文信息.
- 使用getBean方法獲取Bean對象.
1. 獲取Spring上下文信息
在獲取Spring上下文信息時, 需要獲取Spring的配置信息. 即xml文件.
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring-config.xml");
獲取Spring上下文信息除了使用ApplicationContext外, 還可以使用BeanFactory, 如下代碼
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("Spring-config.xml"));
使用ApplicationContext和BeanFactory的區別
繼承關系和功能??來說
:Spring 容器有兩個接?:BeanFactory 和
ApplicationContext。其中 BeanFactory 提供了基礎的訪問容器的能?,? ApplicationContext屬于 BeanFactory 的?類
,它除了繼承了 BeanFactory 的所有功能之外,它還擁有獨特的特性,還添加了對國際化?持、資源訪問?持、以及事件傳播等??的?持。
從性能??來說
:ApplicationContext 是在Spring框架使用時?次性加載并初始化所有的 Bean對象, BeanFactory 是需要哪個才去加載哪個,因此更加輕量。
2. 獲取指定Bean對象
獲取指定Bean對象有以下三種寫法:
UseController useController =(UseController) applicationContext.getBean("useController");
//這種方法不適于同一類有多個Bean對象的情況.
//因為當同一類有多個Bean對象時, 不知道具體要獲取UseController的哪個對象
UseController useController =applicationContext.getBean(UseController.class);
UseController useController =applicationContext.getBean("useController", UseController.class);
本篇文章到此結束, 下篇文章將具體介紹如何通過更簡單的方式(基于注解)來存取Bean對象.