1. 程式人生 > 實用技巧 >spring學習(1)-IOC容器

spring學習(1)-IOC容器

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
="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>

說明:一個bean節點表示一個類管理
屬性 描述
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;
    }
}