Spring框架總結(筆面試題)
目錄
5.IOC:控制反轉,將原本在程式中手動建立物件的控制權交給了Spring框架來管理。
6.DI:依賴注入,在Spring負責建立Bean物件時,動態的將依賴物件屬性注入到bean元件
8.BeanFactory介面和ApplicationContext介面的區別
21.是否直接可以在Servlet中載入Spring配置檔案
Spring
1.談談Spring
Spring是分層的JavaEE/SE的一站式的輕量級的開源框架,是為了簡化企業級開發應用而誕生的,其核心是IOC和AOP,IOC是控制反轉,AOP是面向切面程式設計,Spring框架提供了JavaEE每一層的解決方法,web層:SpringMVC ,業務層:SpringBean、事務管理,AOP,持久層:jdbcTemplate、ORM框架等如:MyBatis和Struts2等,利用Spring框架,可以讓開發者通過配置檔案建立和組裝物件及物件之間的依賴關係,Spring面向切面程式設計,可以幫助開發者無耦合實現日誌記錄,許可權管理,效能分析,事務管理等。
2.Spring包含JavaEE中三層每一層的解決方案
Web層 :SpringMVC
業務邏輯層:SpringBean管理、AOP、事務管理
資料持久層:SpringJDBCTemplate、ORM模組
3.Spring 框架的優點
(1)方便解耦,簡化開發:Spring是一個大場,可以將所有物件的建立和依賴關係的維護都交給Spring來管理
(2)AOP程式設計的支援:Spring提供面向切面程式設計,可以方便的對程式進行許可權攔截、執行監控等
(3)宣告式事務的管理:只需要通過配置就可以完成對事務的管理,而無需手動程式設計
(4)方便程式的測試:支援junit4
(5)方便整合各種優秀的框架
(6)降低了JavaEE API的使用難度
4.首先需要匯入的4個包
bean(提供框架基礎部分,控制反轉和依賴注入)
core(常用工具類)
context(拓展類)
expression -Spring表示式語言包
5.IOC:控制反轉,將原本在程式中手動建立物件的控制權交給了Spring框架來管理。
6.DI:依賴注入,在Spring負責建立Bean物件時,動態的將依賴物件屬性注入到bean元件
7.IOC和DI的區別
(1)IOC是將原來物件的建立權交給了Spring框架來管理
(2)DI是指在Spring負責建立Bean物件時,將依賴屬性通過配置注入到bean元件當中
(3)DI依賴於IOC
8.BeanFactory介面和ApplicationContext介面的區別
(1)ApplicationContext藉口繼承BeanFactoy介面,Spring核心工廠是BeanFactory
BeanFactory採取延時載入,第一次getBean時才會初始化Bean
(2)ApplicationContext是在載入配置檔案的時候初始化Bean,ApplicationContext是對
BeanFactory的擴充套件
9.Spring提供配置Bean的三種例項化方式
(1)使用構造器例項化
<bean id="bean1" class="com.guigu.hello.Bean1"></bean>
(2)使用靜態工廠方法例項化
<bean id="bean2" class="com.guigu.hello.Bean2">
factory-method="getBean2"
</bean>
public static BeangetBean2(){
return new Bean();
}
其中:class表示的是類的全名稱,factory-method表示的是靜態方法
(3)使用例項工廠方法例項化
<bean id="beanfactory" class="com.guigu.hello.Bean3"></bean>
<bean id="bean3" factory-bean="beanfactory"></bean>
public Bean getBean3(){
return new Bean();
}
10.<bean>元素的id屬性和name屬性的區別
(1)通常指定id屬性作為Bean的名稱
(2)id屬性必須是唯一的
(3)id屬性的命名服從XML對ID屬性的命名規範
(4)如果Bean的名稱中含有特殊字元,就需要使用name屬性
(5)name屬性可以重複,後出現的Bean會覆蓋之前出現的Bean
11.Bean元素的作用域
scope=“singleton”單例,在SpringIOC容器中僅存有一個Bean例項
scope=“prototype”多例,每次呼叫getBean()時,都獲得一個新的例項
scope=“request” 用於web開發中,該作用域適用於WebApplicationContext環境當中
scope=“session” 用於web開發中,同樣,適用僅適用於WebApplicationContext環境當中
scope=“globalSession”一般用於Porlet應用環境 ,僅適用於WebApplicationContext環境當中
12. Bean的初始化和銷燬
<bean id="bean" class="com.guigu.hello.bean" init-method="setup" destory-method="teardown"></bean>
通過 init-method 指定Bean的初始化方法,通過 destroy-method 指定Bean銷燬方法
destroy-method 只對 scope="singleton" 有效,銷燬方法,必須關閉ApplicationContext物件
13.Bean 屬性的依賴注入
(1)建構函式注入
<bean id="car1" class="com.guigu.hello.car1">
<constructor-agr index="0" value="保時捷"></constructor-agr>
</bean>
(2)屬性setter方法注入
<bean id="car2" class="com.guigu.hello.car2">
<property name="name" value="保時捷"></property>
<property name="price" value="1000"></property>
</bean>
(3)複雜型別注入
<bean id="car2" class="com.guigu.hello.car2">
<property name="name" value="保時捷"></property>
<property name="car1" ref="car1"></property>
</bean>
<property name=""></property>
(4)p空間的使用
<bean id="person"class="com.guigu.hello.Person">
<property name="name" value="李四"></property>
<property name="car" ref="car2"></property>
</bean>
改寫
<bean id="person" class="com.guigu.hello.Person" p:name="李四" p:car-ref="car2"></bean>
(5)EL表示式
1.完成物件的注入
<bean id="car"class="com.guigu.hello.car>
<property name="car2" ref="car2"></property>
</bean>
改寫為
<bean id="car"class="com.guigu.hello.car>
<property name="car2" value="#{car}"></property>
</bean>
2.使用另外一個Bean屬性完成注入
<bean id="carInfo" class="com.guigu.spring.e_di.CarInfo"></bean>
<bean id="car2_2" class="com.guigu.spring.e_di.Car2">
<property name="name" value="#{carInfo.name}"></property>
</bean>
3.使用另外一個Bean方法完成注入
<bean id="carInfo" class="com.guigu.spring.e_di.CarInfo"></bean>
<bean id="car2_2" class="com.guigu.spring.e_di.Car2">
<property name="price" value="#{carInfo.getPrice()}"></property>
</bean>
14.集合的注入
(1)List集合
<property name="hubbies">
<list>
<!-- <value>注入簡單型別,<ref />注入複雜型別 -->
<value>爬山</value>
<value>游泳</value>
</list>
</property>
(2)set集合
<property name="num">
<set>
<!-- <value>注入簡單型別,<ref />注入複雜型別 -->
<value>10</value>
<value>2</value>
</set>
</property>
(3)Map集合
<property name="map">
<!-- 複雜型別<entry key-ref="" value-ref=""></entry> -->
<entry key="name" value="guigu"></entry>
<entry key="name" value="guigu"></entry>
<entry key="adress" value="杭州"></entry>
</map>
</property>
15.XML檔案的引入
(1)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans1.xml", "beans2.xml");
(2)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
在applicationContext.xml 中
<import resource="classpath:bean1.xml"/>
<import resource="classpath:bean2.xml"/>
16.註解形式進行開發 @Component
17.三個衍生註解
@Controller (表現層) @Services(業務層) @Repository(持久層)
18.屬性注入
(1)簡單屬性注入@Value
@Service("UserService")
public class UserService{
@Value("張三")
private String name;
}
(2)複雜屬性注入@Autowired
@Service("UserService")
public class UserService{
@Autowired("UserDao")
private UserDao userDao;
}
@Repository("UserDao")
public class UserDao{
}
(3)指定名稱注入@Resource
@Resource(name="userDAO")
private UserDAO userDAO ;
19.Bean的初始化和銷燬(註解)
@PostContruct 初始化
@PreDestroy 銷燬
20.Bean 的作用範圍
@Scope(value="prototype") //預設為singleton
21.是否直接可以在Servlet中載入Spring配置檔案
每次請求都會載入Spring環境,初始化所有Bean ,產生效能問題!
22.AOP底層實現
AOP底層使用JDK動態代理和CGlib的動態代理
面向物件程式設計中,我們將事物縱向抽象成了一個個物件。而在面向切面程式設計中,我們將
物件的某些相似的方法橫向抽成一個切面,對這個切面進行許可權控制,事務管理,記錄日誌等操作。
23.代理模式
抽象角色:宣告真實角色和代理角色的共同介面
代理角色:對真實物件進行封裝
真實角色:我們最終要引用的物件
24.JDK動態代理只是針對於介面
25.常見概念
JoinPoint:連線點,指那些被攔截到的點,Spring實際中攔截到的是方法
Pointcut:切入點,指我們要對那些Joinpoint進行攔截,可以是一個或者一組
Advice:增強/通知,攔截到連線點後要做的事情
Target:目標物件,要代理的目標物件
Weaving:織入,指把增強應用到目標物件來建立新的代理物件的過程
Proxy:代理,一個類被AOP織入增強後,就產生了代理結果類
Aspect:切面,是切入點和通知的結合,一個切面可以由多個切點或者通知組成
26.AOP的五類通知
(1)前置通知:MethodBeforeAdvice
(2)後置通知:AfterReturningAdvice
(3)環繞通知:MethodInterceptor
(4)異常通知:ThrownAdvice
(5)引介通知
27.常用註解
@AspectJ常用註解
@Aspect 定義切面
@Before 前置通知:MethodBeforeAdvice
@AfterReturning後置增強:AfterReturningAdvice
@Around:環繞通知,MethodInterceptor
@AfterThrowing 異常通知,ThrowAdvice
28.Spring 對事物的管理
(1)程式設計式事物管理
(2)宣告式事物管理
第一步:在需要管理事物類上或者方法上新增@Transactional
第二步:在ApplicationContext.xml中配置
補充
1.Spring中的模式:代理,工廠模式,模板模式
2.log4j日誌級別:
致命錯誤(fatal)->普通錯誤(error)->警告(warn)->資訊(info) ->除錯(debug)-> 堆疊(trace)
3.Spring 可以幫我們做什麼
(1)Spring可以根據配置檔案建立及組裝物件之間的依賴關係
(2)Spring面向切面程式設計可以幫助我們無耦合實現日誌記錄,事務管理,效能分析等操作
(3)整合第三方框架
4.BeanFactory的實現類
XmlBeanFactory、ApplicationContext
5.Spring配置檔案有什麼用
Spring配置檔案是個XMl檔案,包含了類資訊,描述瞭如何配置他們,以及相互之間如何呼叫
6.IOC的優點,降低程式碼量,簡化程式設計
7.ApplicationContext的實現類
ClasspathXMLApplicationContext、WebXmlApplicationContext
8. 什麼是Spring Beans
Spring beans 是那些形成Spring應用的主幹java物件,它們被Spring IOC容器初始化,裝配和管理
9.Spring的內部Bean
當一個Bean僅僅被用作另一個bean的屬性時,他就是一個內部bean
10.什麼是bean的自動裝配
無須在Spring配置檔案中描述JavaBean之間的依賴關係,IOC容器自動建立javaBean之間的關聯關係
11.自動裝配
(1)no:預設的方式是不進行自動裝配,通過顯式設定 ref 屬性來進行裝配
(2)byName:通過引數名自動裝配
(3)byType::通過引數型別自動裝配
12.SpringAOP中,關注點和橫切關注點的區別是什麼
關注點是應用中一個模組的行為,一個關注點,可能會被定義成一個我們想要實現的功能。橫向關注點是一個整個應用都會使用的功能,影響整個應用,比如日誌等。