spring筆記三

xysympy發表於2020-11-10

帶有生命週期的bean

生命週期:建立和銷燬
ioc容器註冊的bean物件:

單例項

容器啟動的時候會建立好,容器關閉的時候也會銷燬建立好的bean物件
就是在bean的標籤裡面有一個“scope”屬性,當然預設是單例項的(singleton)
 <bean id="book2" class="com.yxm.entity.Book" init-method="myInit" destroy-method="myDestory" scope="singleton"></bean>

多例項

獲取(getBean()方法)的時候才會建立,但是容器關閉的時候不會自動幫你銷燬

和單例項的類似就是屬性scope的值變化了

<bean id="book3" class="com.yxm.entity.Book" init-method="myInit" destroy-method="myDestory" scope="prototype"></bean>

還有就是其中的init-method和destroy-method方法,也就是初始化之前產生的和銷燬後會呼叫的方法

bean的後置處理器

概念

Spring有一個介面,後置處理器:可以在bean的初始化前後呼叫方法,而且他不是針對的是一個bean物件,而是所有的bean物件

建立

需要建立一個類來實現介面BeanPostProcessor並且重寫兩個方法postProcessBeforeInitialization和postProcessAfterInitialization,也就是初始化前呼叫和初始化之後呼叫,因為建立了類了,然後又想要spring去自動呼叫,在bean物件初始化的時候,所以需要進行註冊這個bean物件。
到了最後就是bean物件的初始化前,init-method所對應的方法,然後是初始化後的方法,最後就是銷燬時所要呼叫的方法。
需要注意的一點是,在後置處理器裡面的兩個方法的返回值返回的一般都是方法裡面的第一個引數的值(因為返回的是什麼值,那麼容器內部最後就是什麼值)

引用外部屬性檔案

資料庫連線池(作為單例項最好,一個專案只有一個連線池,連線從連線池裡面呼叫),所以可以吧連線池交給spring進行管理

<!-- 引用外部屬性檔案 -->
	<!-- 因為在spring5之前的都是有username的關鍵字的,所以再使用spring框架的時候應該避免,spring5以後就當我沒說 -->
	<context:property-placeholder location="classpath:jdbcConfig.properties"/>
	然後就是和之前的資料庫連線池連線類似了,就是把value裡面用${}表示式引用對應的屬性名,比如這樣
	<property name="user" value="${jdbc.username}"></property>
//進行呼叫
/按照型別獲取元件會獲取到這個型別下的所有實現的子類等等
DataSource dataSource = ac.getBean(DataSource.class);
//ComboPooledDataSource dataSource = ac.getBean("dataSource",ComboPooledDataSource.class);
//就會獲取相同的一個bean物件,當然前提是你這個DataSource是隻有一個bean物件的,不然按照型別進行獲取的話,範圍更大

ecplise裡面有新建原始檔夾和資料夾,前者是會把原始檔夾裡面的檔案載入到bin目錄下,而資料夾下的就沒有,該在哪一級,就在哪一級。

基於xml的自動配置

會為類的屬性進行自動賦值

<!-- 前提是所建立的bean的物件裡面的屬性是自定義的屬性,如果是基本型別的話,就別想了 -->
	  <bean id="car6" class="com.yxm.entity.Car">
	  		<property name="carName" value="luhu"></property>
	  		<property name="color" value="紅色"></property>
	  </bean>
	  <!-- 測試自動配置 -->
	  <!-- 
	  	autowire="default":是由這個屬性決定的,預設情況下是不會進行自動配置的(default)
	  	autowire="byName" :可以理解為ac.getBean("car");這裡面的car是和person11的類物件的屬性變數名是一致的,如果沒有找到的話就賦值null
	  	autowire="byType" : 可以理解為ac.getBean(Car.class);也就是按照Car的型別來找相對應的bean物件,然後來進行自動賦值,如果太多的話
	  						就報錯,如果找不到的話還是賦值null
	  	autowire="constructor:按照構造器進行賦值,如果在型別中有無參構造器的話,他就直接呼叫無參構造器了,下面的情況是針對有參構造器
	  							1,會先按照引數的型別進行查詢,如果找到了一個就直接賦值,如果沒有找到的話就賦值null
	  							2,如果找到的是多個的話,就會按照id進行篩選,找到了裝配,沒有找到的話還是賦值null
	  							3,不會報錯
	  	如果需要自動賦值的是列表或者是這種複雜資料型別的一般是使用bytype,然後就會把你所有的建立的(比如book)的bean物件進行賦值到下面的
	  	這個person11裡面去了,或者你用byname的話,或許可以試試util:map類似於這種,他的id是可以的
	   -->
	  <!-- <bean id="person11" class="com.yxm.entity.Person" autowire="byType"></bean> -->

spel表示式

概念:Spring Expression Language Spring表示式語言
最大的區別是之前的jstl表示式(${})這邊這個是#{}

<bean id="person12" class="com.yxm.entity.Person">
	  	<!-- 字面量 -->
	  	<property name="age" value="#{1*18}"></property>
	  	<!-- 引用其它bean -->
	  	<property name="car" value="#{car6}"></property>
	  	<!-- 引用其它bean的屬性 -->
	  	<property name="name" value="#{car6.carName}"></property>
	  	<!-- 呼叫靜態方法 -->
	  	<!-- <property name="gender" value="java.util.UUID.randomUUID().toString()"></property> -->
	  	<!-- 呼叫非靜態方法 -->
	  	<property name="gender" value="#{car6.getColor()}"></property>
	  </bean>

相關文章