1.什么是Spring框架坯汤?
Spring是一個輕量級的java開源框架窒升,為了解決企業(yè)級應用開發(fā)的復雜性創(chuàng)建的java開發(fā)平臺奈附,其核心是為了簡化java開發(fā)缚够,為了簡化java開發(fā)隔缀,Spring采取以下四種策略:
- 基于pojo的輕量級和最小入侵式編程题造。
- 通過依賴注入和面向接口編程實現(xiàn)松耦合
- 基于切面實現(xiàn)聲明式編程
- 通過切面和模板減少樣板式代碼
2.Spring框架有哪些主要的模塊?
- Spring IOC : Spring的核心模塊猾瘸,包含了最基本的IoC容器BeanFactory的接口和實現(xiàn)界赔,IOC容器的高級使用行態(tài)ApplicationContext應用上下文供用戶使用丢习。
- Spring Aop: Spring的核心模塊,圍繞著AOP的增強功能淮悼,Spring集成了Aspectj作為AOP的一個特定實現(xiàn)咐低,同時還基于jdk動態(tài)代理(代理對象有接口的時候)/CGLIB(字節(jié)碼生成的開源類庫,代理對象沒接口的時候)的基礎上敛惊,實現(xiàn)了一個AOP框架渊鞋。
- Spring MVC : 以DispatcherServlet為核心,實現(xiàn)了MVC模式瞧挤,包括怎么樣與WEB容器環(huán)境的集成锡宋,web請求的分發(fā),攔截特恬,處理和ModelAndView數(shù)據(jù)的返回执俩,以及如何集成各種UI視圖展現(xiàn)和數(shù)據(jù)表現(xiàn)。
- Spring jdbc/Spring ORM :Spring 對jdbc做了一層封裝癌刽,提供了JdbcTemplate作為模板類役首,Spring提供了許多對ORM工具的封裝。
- Spring 事務處理:Spring事務處理是使用Spring aop對功能進行增強的模塊显拜,提供IOC容器讀入配置衡奥。
3.什么是控制反轉(zhuǎn)?什么是依賴注入远荠?
控制反轉(zhuǎn)也稱為依賴倒置原則矮固,如果對象之間的依賴關系由具體的對象來完成,那么將要導致代碼的高度耦合和可測試性降低譬淳,如果把對象的依賴關系交給Ioc容器或者框架來完成档址,把具體的控制權(quán)交給平臺或者框架來處理,將會降低面向?qū)ο笙到y(tǒng)設計的復雜性和提高系統(tǒng)的可測試性邻梆,控制反轉(zhuǎn)是指一個對象如何獲取它所依賴的對象的引用守伸,反轉(zhuǎn)是指責任的反轉(zhuǎn)。
4.Spring IOC 應用場景
Spring中浦妄,Spring IOC 提供了JavaBean容器尼摹,通過IOC模式管理依賴關系,并通過依賴注入和AOP切面增強了為JavaBean這樣的POJO對象賦予了事務管理等基本功能剂娄,使用IOC容器窘问,把資源獲取的方向反轉(zhuǎn),讓IOC容器主動管理這些依賴關系宜咒,將這些依賴關系注入到組件中,那么會讓這些依賴關系的適配和管理更加靈活把鉴,有三種注入方式:
- 接口注入
- setter注入
- 構(gòu)造器注入
5.BeanFactory和ApplicationContext的區(qū)別
在Spring容器中主要有兩個系列的基本容器故黑,一個是實現(xiàn)BeanFactory接口的簡單系列容器儿咱,這個容器只實現(xiàn)了最基本容器功能;另一個是ApplicationContext應用上下文场晶,它作為容器的高級形態(tài)而混埠,這個容器在簡單容器的基礎上增加了許多面向框架的特性。
ApplicationContext容器提供了BeanFactory不具備的新特性:
- 支持不同的信息源诗轻。
- 訪問資源钳宪。
- 支持應用事件。
- 在ApplicationContext提供附加服務扳炬。
幾種應用上下文(IoC容器):
1.AnnotationConfigApplicationContext:從一個或多個基于java配置類中加載Spring應用上下文吏颖,加載bean,然后包裝成BeanDefinition恨樟。
2.AnnotationConfigWebApplicationContext:從一個或多個基于java配置類中加載Spring Web應用上下文半醉,加載bean。
3.ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中加載Spring應用上下文劝术。
4.FileSystemXmlApplicationContext:從文件系統(tǒng)下的一個或多個XML配置文件中加載上下文定義缩多。
5.XmlWebApplicationContext:從web應用下的一個或多個xml配置文件中加載上下文定義。
6. Spring的配置方式
1.基于xml配置养晋。
2.基于注解的配置
3.基于java類的配置
7.如何使用基于xml配置的方式配置Spring
使用xml文件配置衬吆,bean標簽。
8.如何適應基于java類的方式配置Spring
對于java配置類加上@Configration注解绳泉,對于pojo加上@Bean注解逊抡。
9.如何使用基于注解的方式配置Spring
這種方式也叫做自動化裝配(應用組件之間的協(xié)作),Spring從兩個角度實現(xiàn)自動化裝配
1.組件掃描:Spring會自動發(fā)現(xiàn)應用上下文所創(chuàng)建的bean
為pojo加上@Component注解圈纺,表明它是一個java bean秦忿。在通過@ComponnentScan注解來開啟組件掃描(java 類配置的方式@Configuration注解)或者xml文件,默認會掃描與配置類相同的包蛾娶。
如何設置掃描的基礎包:@ComponentScan(basesPackage={"包名","包名"})
2.自動裝配:Spring自動滿足bean之間的依賴灯谣。
讓Spring自動滿足bean依賴的一種方法,可以使用@Autowired注解進行自動裝配蛔琅。
10.Spring bean的生命周期(bean的創(chuàng)建過程)
- Spring對bean進行實例化
- Spring將值和bean引用注入到bean對應的屬性中
- 如果bean實現(xiàn)了BeanNameAware接口胎许,Spring將bean的id傳給setBeanName()方法
- 如果bean實現(xiàn)了BeanFactoryAware接口,Spring將調(diào)用setBeanFactory()方法罗售,將BeanFactory傳入
- 如果bean實現(xiàn)了ApplicationContextAware接口辜窑,Spring將調(diào)用setApplicationContext()方法,將bean所在的應用上下文的引用傳入進來寨躁。
- 如果bean實現(xiàn)了BeanPostProcessor接口穆碎,Spring將調(diào)用它們的postProcessBeforeInitialization()方法。
- 如果bean實現(xiàn)了InitializingBean接口职恳,Spring將調(diào)用它們的postProcessAfterInitialization()方法所禀。
- 此時bean已經(jīng)準備就緒方面,可以被應用程序所使用了,它們將一直駐留在應用上下文中色徘,直到該應用上下文被銷毀恭金。
11.Spring bean的作用域
在默認情況下Spring IOC容器中的所有bean都是以單例形式創(chuàng)建的,改變bean作用域可以使用@Scope注解來改變褂策。xml 中 <scope = "prototype">
- 單例:在整個應用中横腿,只創(chuàng)建bean的一個實例。
- 原型:每次注入或者通過Spring應用上下文獲取的時候斤寂,都會創(chuàng)建一個bean實例耿焊。
- 會話:在web應用中,為每個會話創(chuàng)建一個bean實例扬蕊。
- 請求:在web應用中搀别,為每個請求創(chuàng)建一個bean實例。
12.Spring用到哪些設計模式
單例模式 --- bean加載默認單例
代理模式 -- AOP
工廠模式 --- Ioc容器BeanFactory就是使用工廠模式
模板方法模式 --- 封裝jdbc的方法尾抑,jdbcTemplate
控制反轉(zhuǎn)模式 --- Spring核心Ioc的生成歇父。
13.Spring 如何實現(xiàn)IoC
Spring有兩種類型的容器BeanFactory和ApplicationContext,
使用Ioc容器時的幾個步驟:
- 創(chuàng)建IoC配置文件的抽象資源再愈,這個抽象資源包含了BeanDefinition的定義信息榜苫。
- 創(chuàng)建一個BeanFactory
- 創(chuàng)建一個BeanDefinition的讀取器,這里使用XmlBeanDefinitionReader來載入XML文件形式的BeanDefinition
- 從定義好的資源位置讀取配置信息翎冲,具體的解析過程由XmlBeanDefinitionReader來完成垂睬。完成整個載入和注冊Bean定義之后,需要的IoC容器就建立起來了抗悍。
IoC容器的實現(xiàn)過程:
第一步:IoC容器的初始化驹饺,這個過程包括BeanDefinition的Resource定位,載入和注冊三個基本過程缴渊。
- 定位:BeanDefinition的資源定位赏壹。
- BeanDefinition的載入過程,這個載入是指把用戶定義好的Bean表示成IoC容器的內(nèi)部數(shù)據(jù)結(jié)構(gòu)BeanDefinition衔沼。
- 向IoC容器中注冊這些BeanDefinition的過程蝌借,就是將BeanDefinition注入到一個HashMap中去,IoC容器就是通過這個HashMap來持有這些BeanDefinition數(shù)據(jù)的指蚁。
第二步:IoC容器的依賴注入
getBean()方法是依賴注入的起點菩佑,Bean對象會依據(jù)BeanDefinition定義的要求生成,提供了兩種實例化java對象的方法凝化,一種通過JVM的反射功能稍坯,一種通過前面提到的CGLIB來生成。其依賴關系在BeanDefinition中搓劫。
14.Spring如何實現(xiàn)AOP
AOP面向切面編程劣光,Spring提供了兩種AOP實現(xiàn):Spring AOP + AspectJ.
第一步:創(chuàng)建AopProxy代理對象袜蚕,代理對象的生成有兩種生成過程,
1.使用JDK的動態(tài)代理绢涡。
2.使用字節(jié)碼生成器CGLIB生成。
如果目標對象是接口類遣疯,則采用JDK動態(tài)代理方式生成,否則使用CGLIB來生成雄可。
第二步:對調(diào)用方法進行攔截,當代理對象的暴露的方法被調(diào)用時缠犀,首先會對這些方法調(diào)用進行攔截数苫,攔截過程在JDK的Proxy代理對象中,是通過invoke方法來完成的辨液,在CGLIB的Proxy代理對象中虐急,攔截是由設置好的回調(diào)callback來完成的。
15.Spring 中bean的創(chuàng)建過程
Spring bean實例化滔迈,然后調(diào)用一系列的生命周期方法完成bean的創(chuàng)建止吁,默認是以單例模式創(chuàng)建的,原型燎悍,會話敬惦,請求模式。
16.Spring bean的加載機制
Spring中的IoC容器來加載bean谈山,有兩種類型的IoC容器俄删,BeanFactory,ApplicationContext奏路。
首先畴椰,初始化IoC容器,就是定位鸽粉,載入和注冊BeanDefinition斜脂,就是在容器內(nèi)部維持一個hashmap裝載BeanDefinition。然后對IoC容器進行依賴注入潜叛,bean對象會根據(jù)BeanDefinition的要求生成秽褒,通過了兩種實例化java對象的方法,JVM反射和CGLIB.
17.Spring MVC是什么威兜?
Spring是一個java軟件開發(fā)平臺销斟,提供IoC AOP 事務處理 持久化等功能,Spring MVC是未用戶開發(fā)web應用提供支持椒舵。
18.Spring IOC容器是怎么樣在web環(huán)境中發(fā)揮作用的蚂踊?
Spring MVC是建立在IOC容器基礎上的,因此要先啟動ioc容器笔宿,啟動過程如下:
從servlet事件中得到ServletContext犁钟,然后通過讀取web.xml中的配置文件棱诱,
ContextLoaderListener被定義為一個監(jiān)聽器,這個監(jiān)聽器是與web服務器生命周期相關聯(lián)的涝动,因為ContextLoaderListener 實現(xiàn)ServletContextListener接口迈勋,這個接口監(jiān)聽ServletContext事件,然后調(diào)用ContextLoader初始化Ioc容器醋粟。
19.Spring MVC的過程靡菇?
Spring MVC的核心是DispatcherServlet,DispatcherServlet繼承HttpServlet米愿,DispatcherSevlet的工作主要有兩個厦凤,
1.DispatcherServlet的啟動和初始化,DispatcherServlet的啟動過程是和Servlet的啟動過程相聯(lián)系的育苟,Servlet初始化時其init方法會被調(diào)用较鼓,DispatcherServlet的初始化過程由其基類的HttpServletBean完成,接著會執(zhí)行DispatcherServlet的持有的IoC容器的初始化過程违柏,初始化時一個新的上下文被建立起來博烂,這個上下文被設置為根上下文的子上下文,和Servlet對應的一個上下文勇垛。DispatcherServlet會初始化HandlerMapping和ViewResolver脖母,默認使用的HandlerMapping是BeanNameUrlHandlerMapping
-
對HTTP請求進行響應:在初始化完成之后,上下文環(huán)境已經(jīng)定義的HandlerMapping已經(jīng)被加載了闲孤,這些加載的HandlerMapping被放到一個List中谆级,這個List中的每一個元素對應著一個具體的HandlerMapping得配置,每個HandlerMapping持有一系列的從url到Controller的映射讼积,通過HandlerMapping接口類的getHandler()方法肥照,可以獲得與HTTP請求對應的HandlerExecutionChain,這個HandlerExecutionChain它有一個Inteceptor鏈和一個Controller對象.
Spring MVC的執(zhí)行步驟 - 建立Controller對象和HTTP請求之間的映射關系,這個工作是由HandlerMapping中封裝的HandlerExecutionChain對象來完成的勤众,對Controller對象和URL的映射關系式在配置bean中描述的舆绎,并在IOC容器(WebApplicationContext)中初始化,這些映射關系會被放入到hashmap中们颜。
- 在mvc框架接受http請求之后吕朵,會在handlermapping中進行查詢,從而得到對應的HandlerExecutionChain,這個HandlerExecutionChain封裝了配置的Controller對象窥突,這個Controller對象會完成的請求的響應動作努溃,生成需要的ModelAndView對象
- 得到ModelAndView以后,DispatcherServlet會把模型數(shù)據(jù)交給特定的視圖對象阻问。
20.Spring支持事物梧税,如何管理?
Spring事務處理模塊是通過AOP功能來實現(xiàn)聲明式事務處理的,通過TransactionProxyFactoryBean可以生成Proxy代理對象第队,在這個代理對象中哮塞,通過TransactionInterceptor來完成代理方法的攔截,將事務處理的功能編織進來凳谦,在實現(xiàn)聲明式事務處理時是AOP和IOC模塊集成的部分忆畅,對于具體的事務處理實現(xiàn),比如事務的生成尸执,提交邻眷,掛起,回滾剔交,對于不同的數(shù)據(jù)庫處理方式做了一個抽象和適配,適配的具體事務處理器包括改衩,對DataSource數(shù)據(jù)源的事務處理支持岖常,對Hibernate數(shù)據(jù)源的事務處理支持等。
21.Spring Dao那種設計模式用的最多葫督?
模板方法設計模式竭鞍,JdbcTemplate就是Spring對jdbc進行封裝的數(shù)據(jù)庫操作的類。
22.Spring MVC用過哪些注解橄镜?
@Controoler ---- 定義這個pojo是Controller
@Autowired ---- 注入這個對象
@RequestMapping --- 定義url映射關系
@SessionAttributes --- 設置會話對象
@ResponseBody --- 響應體
@Transactional --- 對數(shù)據(jù)庫操作做事務處理
23.Spring AOP 場景和底層實現(xiàn)?
事務處理偎快,日志打印就是一個典型的aop應用,生成代理對象AopProxy然后對調(diào)用方法進行攔截洽胶,從而實現(xiàn)對目標對象的增強晒夹,生成AopProxy的過程由兩種,當代理對象實現(xiàn)接口時丐怯,使用jdk動態(tài)代理,當沒有接口時使用CGLIB來生成字節(jié)碼文件翔横,cglib底層采用的是對ASM,ASM是一個可以動態(tài)修改已經(jīng)編譯過的class文件或者是動態(tài)生成新的java class禾唁。