高傲面試官:小夥子,給我說一下spring框架吧

1. spring是什麼

輕量級開源框架 以 IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面編程)爲內核。 還能整合開源世界衆多著名的第三方框架和類庫。

2. spring解決了什麼問題

方便解耦,簡化開發。 普通項目中A模塊用到B模塊,需要使用到new關鍵字,那麼當B模塊不存在時,A模塊編譯報錯。(這就是程序耦合) 解決方案: 我們可以使用反射技術來實現B的調用,提供B的全限定類名,使用Class.forname(""),方法去加載B,那麼編譯的時候就不會報錯,不過運行時沒有B,報運行異常。 AOP 編程的支持 通過 Spring 的 AOP 功能,方便進行面向切面的編程,許多不容易用傳統 OOP 實現的功能可以通過 AOP 輕鬆應付。 聲明式事務的支持 可以將我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務的管理,提高開發效率和質量。 方便程序的測試 可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是隨手可做的事情。 方便集成各種優秀框架 降低 JavaEE API 的使用難度 Java 源碼是經典學習範例

3. spring如何去維護javabean

在配置文件中配置JavaBean的相關信息(唯一標識,全限定類名,可以需要的數據等等)。 在程序中根據加載配置文件,產生ioc容器,使用容器的getBean方法,根據唯一標識獲取相關的JavaBean。

4. 構建spring工廠或容器的兩種方式

BeanFactory 和 ApplicationContext的區別 創建對象的時間點不一樣。 ApplicationContext:只要一讀取配置文件,默認情況下就會創建對象。 BeanFactory:什麼使用什麼時候創建對象。 ApplicationContext的三個實現類 *ClassPathXmlApplicationContext: 它是從類的根路徑下加載配置文件 推薦使用這種 *FileSystemXmlApplicationContext: 它是從磁盤路徑上加載配置文件,配置文件可以在磁盤的任意位置。 *AnnotationConfigApplicationContext: 當我們使用註解配置容器對象時,需要使用此類來創建 spring 容器。它用來讀取註解。

5. bean標籤的使用

默認情況下使用空參構造方法實例化對象,如果沒有就沒辦法創建。 屬性:

id: class: scope:指定對象的作用範圍。 init-method:指定類中的初始化方法名稱。 destroy-method:指定類中銷燬方法名稱。 指定對象的作用範圍:

singleton :默認值,單例的. prototype :多例的. request :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中. session :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中. global session :WEB 項目中,應用在 Portlet 環境.如果沒有 Portlet 環境那麼 globalSession 相當於 session.

6. bean的生命週期

單例對象:scope=“singleton” 一個應用只有一個對象的實例。它的作用範圍就是整個引用。 生命週期: 對象出生:當應用加載,創建容器時,對象就被創建了。 對象活着:只要容器在,對象一直活着。 對象死亡:當應用卸載,銷燬容器時,對象就被銷燬了。 多例對象:scope=“prototype” 每次訪問對象時,都會重新創建對象實例。 生命週期: 對象出生:當使用對象時,創建新的對象實例。 對象活着:只要對象在使用中,就一直活着。 對象死亡:當對象長時間不用時,被 java 的垃圾回收器回收了。

7. bean的三種實例化方式

默認使用空參構造函數實例化 使用靜態工廠實例化

/**
* 模擬一個靜態工廠,創建業務層實現類
*/
public class StaticFactory {
public static IAccountService createAccountService(){
return new AccountServiceImpl();
} }
複製代碼
<!-- 此種方式是:
使用 StaticFactory 類中的靜態方法 createAccountService 創建對象,並存入 spring 容器
id 屬性:指定 bean 的 id,用於從容器中獲取
class 屬性:指定靜態工廠的全限定類名
factory-method 屬性:指定生產對象的靜態方法
--> <bean id="accountService"
 class="com.itheima.factory.StaticFactory"
 factory-method="createAccountService"></bean>
複製代碼

spring 管理實例工廠-使用實例工廠的方法創建對象

/**
* 模擬一個實例工廠,創建業務層實現類
* 此工廠創建對象,必須現有工廠實例對象,再調用方法
*/
public class InstanceFactory {
public IAccountService createAccountService(){
return new AccountServiceImpl();
} }
複製代碼
<!-- 此種方式是:
先把工廠的創建交給 spring 來管理。
然後在使用工廠的 bean 來調用裏面的方法
factory-bean 屬性:用於指定實例工廠 bean 的 id。
factory-method 屬性:用於指定實例工廠中創建對象的方法。
--> <bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean> 
<bean id="accountService"
 factory-bean="instancFactory"
 factory-method="createAccountService"></bean>
複製代碼

8. bean依賴注入(成員變量的賦值)

構造函數注入

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> 
<constructor-arg name="name" value="張三"></constructor-arg> 
<constructor-arg name="age" value="18"></constructor-arg> 
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean> <bean id="now" class="java.util.Date"></bean>
複製代碼

set注入

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<property name="name" value="test"></property>
<property name="age" value="21"></property>
<property name="birthday" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"></bean>
複製代碼

使用 p 名稱空間注入數據(本質還是調用 set 方法)

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:p="http://www.springframework.org/schema/p"
 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">
 
<bean id="accountService" 
 class="com.itheima.service.impl.AccountServiceImpl4"
 p:name="test" p:age="21" p:birthday-ref="now"/>
</beans>
複製代碼

9. bean注入集合屬性(成員變量的賦值)

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<!-- 在注入集合數據時,只要結構相同,標籤可以互換 -->
<!-- 給數組注入數據 -->
<property name="myStrs">
	<set>
		<value>AAA</value>
		<value>BBB</value>
		<value>CCC</value>
	</set>
</property>
<!-- 注入 list 集合數據 --> 
<property name="myList"> 
	<array> 
		<value>AAA</value> 
		<value>BBB</value> 
		<value>CCC</value>
	</array>
</property>
<!-- 注入 set 集合數據 --> 
<property name="mySet"> 
	<list>
		<value>AAA</value> 
		<value>BBB</value> 
		<value>CCC</value>
	</list>
</property>
<!-- 注入 Map 數據 --> 
<property name="myMap"> 
	<props> 
		<prop key="testA">aaa</prop> 
		<prop key="testB">bbb</prop>
	</props>
</property>
<!-- 注入 properties 數據 -->
<property name="myProps"> 
	<map>
		<entry key="testA" value="aaa"></entry> 
		<entry key="testB"> <value>bbb</value></entry>
	</map>
</property>
</bean>
複製代碼

覺得這篇文章有幫助的點贊關注小編私信關鍵字(spring)可獲得免費最新spring電子版書籍哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章