spring學習(1)-IOC容器
阿新 • • 發佈:2020-07-19
IOC:控制反轉。程式碼中不需要顯示的new一個例項出來,只要指定好依賴的類名,剩餘交給spring容器去管理初始化等
通過IOC初始化bean的步驟:
一、按照規範定義一個對Bean進行管理的xml配置元資料檔案
定義一個管理Bean的Beans.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說明:一個bean節點表示一個類管理="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd" default-init-method="init" default-destroy-method="destory” > <!--<bean id="helloWorld" class="demo.demo" init-method="initmethod" destroy-method="destroymethod">--><bean id="helloWorld" class="demo.demo"> <property name="message" value="Hello World!"/> </bean> <bean id="hello meitian" parent="helloWorld"> <property name="message" value="hello meitian"/> </bean> </beans>
屬性 | 描述 |
id | bean的名字,容器中通過getBean()獲取物件的入參標識 |
class | 繫結的具體實現類的位置;這個屬性是強制性的,並且指定用來建立 bean 的 bean 類。 |
name | 這個屬性指定唯一的 bean 識別符號。在基於 XML 的配置元資料中,你可以使用 ID 和/或 name 屬性來指定 bean 識別符號。 |
scope | 這個屬性指定由特定的 bean 定義建立的物件的作用域,它將會在 bean 作用域的章節中進行討論。 |
constructor-arg | 它是用來注入依賴關係的,建構函式初始化需要引數的時候用到這個 |
properties | 它是用來注入依賴關係的 |
autowiring mode | 它是用來注入依賴關係的 |
lazy-initialization mode | 延遲初始化的 bean 告訴 IoC 容器在它第一次被請求時,而不是在啟動時去建立一個 bean 例項。 |
initialization 方法 | 在 bean 的所有必需的屬性被容器設定之後,呼叫回撥方法。 |
destruction 方法 | 當包含該 bean 的容器被銷燬時,使用回撥方法。 |
parent | 可以指定一個父bean,當前這個bean沒有定義的屬性賦值等操作,都會使用parent指定bean的內容 當然如果當前bean已經覆蓋的方法,會優先用自己的 |
二、獲得xml路徑,通過Spring容器對xml中定義的bean進行例項化等管理操作
Spring提供的兩種容器: ApplicationContext是BeanFactory的子類,BeanFactory已基本不直接使用它了 其他容器都是繼承這些容器去實現一些個性化的功能 ApplicationContext三種讀取spring配置檔案的方式: 本地檔案中,給出絕對地址(FileSystemXmlApplicationContext) classpath下,classpath的相對地址(ClassPathXmlApplicationContext) web應用程式的範圍下(WebXmlApplicationContext)) 從容器中獲得例項化後的bean例項 bean:載入在IOC容器中的例項,由bean的配置元資料資訊約束 getBean():獲得IOC容器中的spring的bean物件,入參為xml中配置的bean標籤的id值 例項:AbstractApplicationContext context = new FileSystemXmlApplicationContext("//opt/script/zzappcicd/src/main/resources/Beans.xml"); demo obj = (demo) context.getBean("helloWorld”);說明:obj就是初始化後的類例項,可以直接.去呼叫它下面的方法和變數等
三、Bean的生命週期
Bean的生命週期可以表達為:Bean的定義——Bean的初始化——Bean的使用——Bean的銷燬 針對bean的初始化和銷燬,提供了干預方式:實現介面類和基於XML元資料配置檔案指定方法 1、Bean.xml中配置Bean初始化和銷燬時執行的方法1)Bean單獨的初始化方法:init-method,銷燬方法:destroy-method
Bean銷燬的時機:呼叫AbstractApplicationContext類的registerShutdownHook方法會觸發Bean銷燬邏輯 AbstractApplicationContext context=newFileSystemXmlApplicationContext("//opt/script/zzappcicd/src/main/resources/Beans.xml"); demo obj=(demo)context.getBean("helloWorld"); obj.getMessage(); context.registerShutdownHook(); 2)所有Bean通用的初始化方法:default-init-method,銷燬方法:default-destroy-method 注意點:如果Bean下有單獨配置的初始化和登出方法,會走Bean單獨的方法,否則才會走預設的 2、實現介面類方式 1)初始化 publicclass ExampleBean implements InitializingBean{public void afterPropertiesSet(){// do some initialization work} } 2)銷燬 publicclass ExampleBean implements DisposableBean{public void destroy(){// do some destruction work} }四、後置處理器
後置處理器:針對類初始化前後做攔截處理 實現方式:實現介面類,重寫初始化前後的方法public class initbean implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("BeforeInitialization : " + s); return o; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("postProcessAfterInitialization : " + s); return o; } }