第一篇:spring總結(jié)
Spring 一:Spring流程
1.創(chuàng)建一個(gè)java項(xiàng)目
2.導(dǎo)入spring的支持包
3.寫一個(gè)類作為被啟動(dòng)的類
4.書寫spring的配置文件
5.啟動(dòng)spring容器
6.使用spring容器創(chuàng)建目標(biāo)類對(duì)象
7.對(duì)象進(jìn)行操作 二:springIOC
1.springIOC也叫作控制反轉(zhuǎn),就是讓spring容器控制目標(biāo)類的創(chuàng)建,初始化,銷毀等操作。當(dāng)spring是多例的時(shí)候并不能控制對(duì)象的銷毀
創(chuàng)建bean的三種形式:
1.利用默認(rèn)的構(gòu)造器(必須有默認(rèn)的構(gòu)造函數(shù))
2.利用靜態(tài)構(gòu)造方法(利用靜態(tài)代碼塊)
3.利用實(shí)例工廠方法 只學(xué)習(xí)了兩種:
創(chuàng)建bean的時(shí)機(jī):
別名:alias
Spring的創(chuàng)建和銷毀:
*初始化:
由spring容器調(diào)用init方法
在構(gòu)造函數(shù)之后執(zhí)行
*銷毀:
單例時(shí),由spring容器執(zhí)行銷毀操作,并且對(duì)象必須為ClassPathXmlApplicationContext的時(shí)候才可以,多例的情況下spring不能銷毀他
三:springDI:依賴注入:給屬性賦值
1.在spring中基本數(shù)據(jù)類型包括包裝類和String類型
2.基本數(shù)據(jù)類型使用set方法賦值時(shí)依據(jù)的是setxxx的方法名,所以屬性名和方法名要一致。
1.利用set方法給屬性賦值
構(gòu)造函數(shù)給屬性賦值.xml
2.注解的匹配:
1、導(dǎo)入命名空間
xmlns:context=“http://www.004km.cn.itcast.spring0909.scan”> 原理
*
* 啟動(dòng)spring容器,加載配置文件
*
* spring容器解析到
*
* spring容器會(huì)在指定的包及子包中查找類上是否有@Component *
* 如果@Component注解沒有寫任何屬性
*
@Component *
public class Person{ *
*
} *
== *
如果@Component(“aa”)*
@Component *
public class Person{ *
*
} *
== *
* 在納入spring管理的bean的范圍內(nèi)查找@Resource注解
*
* 執(zhí)行@Resource注解的過程
* 說明:
*
xml效率比較高,但是書寫比較麻煩 *
注解效率比較低,書寫比較簡單
繼承:
四:代理
代理比較簡單,所以先不寫。
1.如何使用 Java 動(dòng)態(tài)代理。具體有如下四步驟:
1.通過實(shí)現(xiàn) InvocationHandler 接口創(chuàng)建自己的調(diào)用處理器;
2.通過為 Proxy 類指定 ClassLoader 對(duì)象和一組 interface 來創(chuàng)建動(dòng)態(tài)代理類; 3.通過反射機(jī)制獲得動(dòng)態(tài)代理類的構(gòu)造函數(shù),其唯一參數(shù)類型是調(diào)用處理器接口類型;
4.通過構(gòu)造函數(shù)創(chuàng)建動(dòng)態(tài)代理類實(shí)例,構(gòu)造時(shí)調(diào)用處理器對(duì)象作為參數(shù)被傳入。
1.SpringAOP的各個(gè)概念:
1.切面:就是流程中需要執(zhí)行的類
2.通知:切面中的方法
3.切入點(diǎn):就是invoke方法中方法執(zhí)行的條件
4.目標(biāo)對(duì)象:被代理對(duì)象
5.aop對(duì)象:代理對(duì)象
6.織入:形成代理方法的過程
7.連接點(diǎn):客戶端調(diào)用的方法 代理對(duì)象的方法等于通知+目標(biāo)方法。
1.Spring注解用的很少,了解就可以了。五:struts2深度解析:
六:spring和hibernate整合1.切入點(diǎn)表達(dá)式:
/表示文件夾,.表示包 七:三大框架整合 三大框架的整合步驟:
* 新建一個(gè)工程
* 把整個(gè)工程的編碼改變成utf-8
* 把整個(gè)jsp頁面也改變成utf-8
* 導(dǎo)包
web-inf
lib
struts
hibernate
spring
db
junit
* 建三個(gè)src folder
src
存放源代碼的
cn.itcast.s2sh0909.struts2.action
cn.itcast.s2sh0909.dao
cn.itcast.s2sh0909.dao.impl
cn.itcast.s2sh0909.service
cn.itcast.s2sh0909.service.impl
cn.itcast.s2sh0909.domain
config
存放所有的配置文件
struts2
hibernate
spring
applicationContext.xml
applicationContext-db.xml
...........test
存放測試類
cn.itcast.s2sh0909.test
* 在dao和service層相應(yīng)的包中寫接口和類
* 在applicationContext-db.xml文件中寫sessionFactory
* 在cn.itcast.s2sh0909.test包中新建一個(gè)類SessionFactoryTest,目的是為了測試SessionFactory
是否配置正確
* 寫spring的聲明式事務(wù)處理
* 在spring的配置文件中寫dao和service
* 通過savePerson方法測試聲明式事務(wù)處理
在Struts.xml中的action配置中,class應(yīng)該寫applicationContext.xml中配置Action類bean的id.
第二篇:Spring IOC原理總結(jié)
Spring IOC原理總結(jié)
Spring容器高層視圖Spring 啟動(dòng)時(shí)讀取應(yīng)用程序提供的Bean配置信息,并在Spring容器中生成一份相應(yīng)的Bean配置注冊表,然后根據(jù)這張注冊表實(shí)例化Bean,裝配好Bean之間的依賴關(guān)系,為上層應(yīng)用提供準(zhǔn)備就緒的運(yùn)行環(huán)境。Bean緩存池:HashMap實(shí)現(xiàn)IOC容器介紹Spring 通過一個(gè)配置文件描述 Bean 及 Bean 之間的依賴關(guān)系,利用 Java 語言的反射功能實(shí)例化 Bean 并建立 Bean 之間的依賴關(guān)系。Spring 的 IoC 容器在完成這些底層工作的基礎(chǔ)上,還提供了 Bean 實(shí)例緩存、生命周期管理、Bean 實(shí)例代理、事件發(fā)布、資源裝載等高級(jí)服務(wù)。BeanFactory 是 Spring 框架的基礎(chǔ)設(shè)施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的開發(fā)者,幾乎所有的應(yīng)用場合我們都直接使用 ApplicationContext 而非底層的 BeanFactory。BeanFactoryBeanFactory體系架構(gòu):BeanDefinitionRegistry: Spring 配置文件中每一個(gè)節(jié)點(diǎn)元素在 Spring 容器里都通過一個(gè) BeanDefinition 對(duì)象表示,它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工注冊 BeanDefinition 對(duì)象的方法。BeanFactory 接口位于類結(jié)構(gòu)樹的頂端,它最主要的方法就是 getBean(String beanName),該方法從容器中返回特定名稱的 Bean,BeanFactory 的功能通過其他的接口得到不斷擴(kuò)展:ListableBeanFactory:該接口定義了訪問容器中 Bean 基本信息的若干方法,如查看Bean 的個(gè)數(shù)、獲取某一類型 Bean 的配置名、查看容器中是否包括某一 Bean 等方法;HierarchicalBeanFactory:父子級(jí)聯(lián) IoC 容器的接口,子容器可以通過接口方法訪問父容器; 通過 HierarchicalBeanFactory 接口,Spring 的 IoC 容器可以建立父子層級(jí)關(guān)聯(lián)的容器體系,子容器可以訪問父容器中的 Bean,但父容器不能訪問子容器的 Bean。Spring 使用父子容器實(shí)現(xiàn)了很多功能,比如在 Spring MVC 中,展現(xiàn)層 Bean 位于一個(gè)子容器中,而業(yè)務(wù)層和持久層的 Bean 位于父容器中。這樣,展現(xiàn)層 Bean 就可以引用業(yè)務(wù)層和持久層的 Bean,而業(yè)務(wù)層和持久層的 Bean 則看不到展現(xiàn)層的 Bean。ConfigurableBeanFactory:是一個(gè)重要的接口,增強(qiáng)了 IoC 容器的可定制性,它定義了設(shè)置類裝載器、屬性編輯器、容器初始化后置處理器等方法;AutowireCapableBeanFactory:定義了將容器中的 Bean 按某種規(guī)則(如按名字匹配、按類型匹配等)進(jìn)行自動(dòng)裝配的方法;SingletonBeanRegistry:定義了允許在運(yùn)行期間向容器注冊單實(shí)例 Bean 的方法;例子:使用 Spring 配置文件為 Car 提供配置信息:beans.xml:通過 BeanFactory 裝載配置文件,啟動(dòng) Spring IoC 容器:XmlBeanFactory 通過 Resource 裝載 Spring 配置信息并啟動(dòng) IoC 容器,然后就可以通過 BeanFactory#getBean(beanName)方法從 IoC 容器中獲取 Bean 了。通過 BeanFactory 啟動(dòng)IoC 容器時(shí),并不會(huì)初始化配置文件中定義的 Bean,初始化動(dòng)作發(fā)生在第一個(gè)調(diào)用時(shí)。對(duì)于單實(shí)例(singleton)的 Bean 來說,BeanFactory會(huì)緩存 Bean 實(shí)例,所以第二次使用 getBean()獲取 Bean 時(shí)將直接從 IoC 容器的緩存中獲取 Bean 實(shí)例。Spring 在 DefaultSingletonBeanRegistry 類中提供了一個(gè)用于緩存單實(shí)例 Bean 的緩存器,它是一個(gè)用HashMap 實(shí)現(xiàn)的緩存器,單實(shí)例的 Bean 以 beanName 為鍵保存在這個(gè)HashMap 中。值得一提的是,在初始化 BeanFactory 時(shí),必須為其提供一種日志框架,比如使用Log4J,即在類路徑下提供 Log4J 配置文件,這樣啟動(dòng) Spring 容器才不會(huì)報(bào)錯(cuò)。ApplicationContextApplicationContext 由 BeanFactory 派生而來,提供了更多面向?qū)嶋H應(yīng)用的功能。在BeanFactory 中,很多功能需要以編程的方式實(shí)現(xiàn),而在 ApplicationContext 中則可以通過配置的方式實(shí)現(xiàn)。ApplicationContext 繼承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基礎(chǔ)上,還通過多個(gè)其他的接口擴(kuò)展了 BeanFactory 的功能:ClassPathXmlApplicationContext:默認(rèn)從類路徑加載配置文件FileSystemXmlApplicationContext:默認(rèn)從文件系統(tǒng)中裝載配置文件ApplicationEventPublisher:讓容器擁有發(fā)布應(yīng)用上下文事件的功能,包括容器啟動(dòng)事件、關(guān)閉事件等。實(shí)現(xiàn)了 ApplicationListener 事件監(jiān)聽接口的 Bean 可以接收到容器事件,并對(duì)事件進(jìn)行響應(yīng)處理。在 ApplicationContext 抽象實(shí)現(xiàn)類AbstractApplicationContext 中,我們可以發(fā)現(xiàn)存在一個(gè) ApplicationEventMulticaster,它負(fù)責(zé)保存所有監(jiān)聽器,以便在容器產(chǎn)生上下文事件時(shí)通知這些事件監(jiān)聽者。MessageSource:為應(yīng)用提供 i18n 國際化消息訪問的功能;ResourcePatternResolver : 所 有 ApplicationContext 實(shí)現(xiàn)類都實(shí)現(xiàn)了類似于PathMatchingResourcePatternResolver 的功能,可以通過帶前綴的 Ant 風(fēng)格的資源文件路徑裝載 Spring 的配置文件。LifeCycle:該接口是 Spring 2.0 加入的,該接口提供了 start()和 stop()兩個(gè)方法,主要用于控制異步處理過程。在具體使用時(shí),該接口同時(shí)被 ApplicationContext 實(shí)現(xiàn)及具體 Bean 實(shí)現(xiàn),ApplicationContext 會(huì)將 start/stop 的信息傳遞給容器中所有實(shí)現(xiàn)了該接口的 Bean,以達(dá)到管理和控制 JMX、任務(wù)調(diào)度等目的。ConfigurableApplicationContext 擴(kuò)展于
ApplicationContext,它新增加了兩個(gè)主要的方法: refresh()和 close(),讓 ApplicationContext 具有啟動(dòng)、刷新和關(guān)閉應(yīng)用上下文的能力。在應(yīng)用上下文關(guān)閉的情況下調(diào)用 refresh()即可啟動(dòng)應(yīng)用上下文,在已經(jīng)啟動(dòng)的狀態(tài)下,調(diào)用 refresh()則清除緩存并重新裝載配置信息,而調(diào)用close()則可關(guān)閉應(yīng)用上下文。這些接口方法為容器的控制管理帶來了便利,但作為開發(fā)者,我們并不需要過多關(guān)心這些方法。使用:如果配置文件放置在類路徑下,用戶可以優(yōu)先使用 ClassPathXmlApplicationContext 實(shí)現(xiàn)類:如果配置文件放置在文件系統(tǒng)的路徑下,則可以優(yōu)先考慮使用
FileSystemXmlApplicationContext 實(shí)現(xiàn)類:Spring 3.0 支持基于類注解的配置方式,主要功能來自于 Spring 的一個(gè)名為 JavaConfig 子項(xiàng)目,目前 JavaConfig已經(jīng)升級(jí)為 Spring核心框架的一部分。ApplicationContext 在初始化應(yīng)用上下文時(shí)就實(shí)例化所有單實(shí)例的 Bean。WebApplicationContextWebApplication體系架構(gòu):WebApplicationContext 是專門為 Web 應(yīng)用準(zhǔn)備的,它允許從相對(duì)于 Web 根目錄的路徑中裝載配置文件完成初始化工作。從WebApplicationContext 中可以獲得
ServletContext 的引用,整個(gè) Web 應(yīng)用上下文對(duì)象將作為屬性放置到 ServletContext 中,以便 Web 應(yīng)用環(huán)境可以訪問 Spring 應(yīng)用上下文。WebApplicationContext 定義了一個(gè)常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,在上下文啟動(dòng)時(shí),WebApplicationContext 實(shí)例即以此為鍵放置在 ServletContext 的屬性列表中,因此我們可以直接通過以下語句從 Web 容器中獲取WebApplicationContext:Spring 和 Web 應(yīng)用的上下文融合:WebApplicationContext 的初始化方式:WebApplicationContext 需要 ServletContext 實(shí)例,它必須在擁有 Web 容器的前提下才能完成啟動(dòng)的工作??梢栽?web.xml 中配置自啟動(dòng)的 Servlet 或定義 Web 容器監(jiān)聽器(ServletContextListener),借助這兩者中的任何一個(gè)就可以完成啟動(dòng) Spring Web 應(yīng)用上下文的工作。Spring 分別提供了用于啟動(dòng) WebApplicationContext 的 Servlet 和 Web 容器監(jiān)聽器:org.springframework.web.context.ContextLoaderServlet;org.springframework.web.context.ContextLoaderListener由于 WebApplicationContext 需要使用日志功能,比如日志框架使用Log4J,用戶可以將 Log4J 的配置文件放置到類路徑 WEB-INF/classes 下,這時(shí) Log4J 引擎即可順利啟動(dòng)。如果 Log4J 配置文件放置在其他位置,用戶還必須在 web.xml 指定 Log4J 配置文件位置。Bean的生命周期1.當(dāng)調(diào)用者通過 getBean(beanName)向容器請求某一個(gè) Bean 時(shí),如果容器注冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 接口,在實(shí)例化 Bean 之前,將調(diào)用接口的 postProcessBeforeInstantiation()方法;2.根據(jù)配置情況調(diào)用 Bean 構(gòu)造函數(shù)或工廠方法實(shí)例化 Bean;3.如果容器注冊了 InstantiationAwareBeanPostProcessor 接口,在實(shí)例化 Bean 之后,調(diào)用該接口的
postProcessAfterInstantiation()方法,可在這里對(duì)已經(jīng)實(shí)例化的對(duì)象進(jìn)行一些“梳妝打扮”;4.如果 Bean 配置了屬性信息,容器在這一步著手將配置值設(shè)置到 Bean 對(duì)應(yīng)的屬性中,不過在設(shè)置每個(gè)屬性之前將先調(diào)用InstantiationAwareBeanPostProcessor 接口的postProcessPropertyValues()方法;5.調(diào)用 Bean 的屬性設(shè)置方法設(shè)置屬性值;6.如果 Bean 實(shí)現(xiàn)了
org.springframework.beans.factory.BeanNameAware 接口,將調(diào)用setBeanName()接口方法,將配置文件中該 Bean 對(duì)應(yīng)的名稱設(shè)置到 Bean 中;7.如果 Bean 實(shí)現(xiàn)了 org.springframework.beans.factory.BeanFactoryAware 接口,將調(diào)用 setBeanFactory()接口方法,將 BeanFactory 容器實(shí)例設(shè)置到 Bean 中;8.如果 BeanFactory 裝配了 org.springframework.beans.factory.config.BeanPostProcessor后處理器,將調(diào)用 BeanPostProcessor 的 Object postProcessBeforeInitialization(Object bean, String beanName)接口方法對(duì) Bean 進(jìn)行加工操作。其中入?yún)?bean 是當(dāng)前正在處理的 Bean,而 beanName 是當(dāng)前 Bean 的配置名,返回的對(duì)象為加工處理后的 Bean。用戶可以使用該方法對(duì)某些 Bean 進(jìn)行特殊的處理,甚至改變 Bean 的行為,BeanPostProcessor 在 Spring 框架中占有重要的地位,為容器提供對(duì) Bean 進(jìn)行后續(xù)加工處理的切入點(diǎn),Spring 容器所提供的各種“神奇功能”(如 AOP,動(dòng)態(tài)代理等)都通過 BeanPostProcessor 實(shí)施;9.如果 Bean 實(shí)現(xiàn)了 InitializingBean 的接口,將調(diào)用接口的
afterPropertiesSet()方法;10.如果在通過 init-method 屬性定義了初始化方法,將執(zhí)行這個(gè)方法;11.BeanPostProcessor 后處理器定義了兩個(gè)方法:其一是 postProcessBeforeInitialization()在第 8 步調(diào)用;其二是 Object postProcessAfterInitialization(Object bean, String beanName)方法,這個(gè)方法在此時(shí)調(diào)用,容器再次獲得對(duì) Bean 進(jìn)行加工處理的機(jī)會(huì);12.如果在中指定 Bean 的作用范圍為 scope=“prototype”,將 Bean 返回給調(diào)用者,調(diào)用者負(fù)責(zé) Bean 后續(xù)生命的管理,Spring 不再管理這個(gè) Bean 的生命周期。如果作用范圍設(shè)置為 scope=“singleton”,則將 Bean 放入到 Spring IoC 容器的緩存池中,并將 Bean引用返回給調(diào)用者,Spring 繼續(xù)對(duì)這些 Bean 進(jìn)行后續(xù)的生命管理;13.對(duì)于 scope=“singleton”的 Bean,當(dāng)容器關(guān)閉時(shí),將觸發(fā) Spring 對(duì) Bean 的后續(xù)生命周期的管理工作,首先如果 Bean 實(shí)現(xiàn)了 DisposableBean 接口,則將調(diào)用接口的afterPropertiesSet()方法,可以在此編寫釋放資源、記錄日志等操作;14.對(duì)于 scope=“singleton”的 Bean,如果通過的 destroy-method 屬性指定了 Bean 的銷毀方法,Spring 將執(zhí)行 Bean 的這個(gè)方法,完成 Bean 資源的釋放等操作。可以將這些方法大致劃分為三類:Bean 自身的方法:如調(diào)用 Bean 構(gòu)造函數(shù)實(shí)例化 Bean,調(diào)用 Setter 設(shè)置 Bean 的屬性值以及通過的 init-method 和 destroy-method 所指定的方法;Bean 級(jí)生命周期接口方法:如 BeanNameAware、BeanFactoryAware、InitializingBean 和 DisposableBean,這些接口方法由 Bean 類直接實(shí)現(xiàn);容器級(jí)生命周期接口方法:在上圖中帶“★” 的步驟是由 InstantiationAwareBean PostProcessor 和BeanPostProcessor 這兩個(gè)接口實(shí)現(xiàn),一般稱它們的實(shí)現(xiàn)類為“ 后處理器”。后處理器接口一般不由 Bean 本身實(shí)現(xiàn),它們獨(dú)立于 Bean,實(shí)現(xiàn)類以容器附加裝置的形式注冊到 Spring 容器中并通過接口反射為 Spring 容器預(yù)先識(shí)別。當(dāng)Spring 容器創(chuàng)建任何 Bean 的時(shí)候,這些后處理器都會(huì)發(fā)生作用,所以這些后處理器的影響是全局性的。當(dāng)然,用戶可以通過合理地編寫后處理器,讓其僅對(duì)感興趣Bean 進(jìn)行加工處理ApplicationContext 和 BeanFactory 另一個(gè)最大的不同之處在于:ApplicationContext會(huì)利用 Java 反射機(jī)制自動(dòng)識(shí)別出配置文件中定義的 BeanPostProcessor、InstantiationAwareBeanPostProcessor 和
BeanFactoryPostProcessor,并自動(dòng)將它們注冊到應(yīng)用上下文中;而后者需要在代碼中通過手工調(diào)用
addBeanPostProcessor()方法進(jìn)行注冊。這也是為什么在應(yīng)用開發(fā)時(shí),我們普遍使用 ApplicationContext 而很少使用 BeanFactory 的原因之一IOC容器工作機(jī)制容器啟動(dòng)過程web環(huán)境下Spring容器、SpringMVC容器啟動(dòng)過程:首先,對(duì)于一個(gè)web應(yīng)用,其部署在web容器中,web容器提供其一個(gè)全局的上下文環(huán)境,這個(gè)上下文就是ServletContext,其為后面的spring IoC容器提供宿主環(huán)境;其次,在web.xml中會(huì)提供有contextLoaderListener(或ContextLoaderServlet)。在web容器啟動(dòng)時(shí),會(huì)觸發(fā)容器初始化事件,此時(shí)contextLoaderListener會(huì)監(jiān)聽到這個(gè)事件,其contextInitialized方法會(huì)被調(diào)用,在這個(gè)方法中,spring會(huì)初始化一個(gè)啟動(dòng)上下文,這個(gè)上下文被稱為根上下文,即WebApplicationContext,這是一個(gè)接口類,確切的說,其實(shí)際的實(shí)現(xiàn)類是XmlWebApplicationContext。這個(gè)就是spring的IoC容器,其對(duì)應(yīng)的Bean定義的配置由web.xml中的context-param標(biāo)簽指定。在這個(gè)IoC容器初始化完畢后,spring容器以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE為屬性Key,將其存儲(chǔ)到ServletContext中,便于獲?。辉俅?,contextLoaderListener監(jiān)聽器初始化完畢后,開始初始化web.xml中配置的Servlet,這個(gè)servlet可以配置多個(gè),以最常見的DispatcherServlet為例(Spring MVC),這個(gè)servlet實(shí)際上是一個(gè)標(biāo)準(zhǔn)的前端控制器,用以轉(zhuǎn)發(fā)、匹配、處理每個(gè)servlet請求。DispatcherServlet上下文在初始化的時(shí)候會(huì)建立自己的IoC上下文容器,用以持有spring mvc相關(guān)的bean,這個(gè)servlet自己持有的上下文默認(rèn)實(shí)現(xiàn)類也是XmlWebApplicationContext。在建立DispatcherServlet自己的IoC上下文時(shí),會(huì)利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先從ServletContext中獲取之前的根上下文(即WebApplicationContext)作為自己上下文的parent上下文(即第2步中初始化的XmlWebApplicationContext作為自己的父容器)。有了這個(gè)parent上下文之后,再初始化自己持有的上下文(這個(gè)DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化處理器映射、視圖解析等)。初始化完畢后,spring以與servlet的名字相關(guān)(此處不是簡單的以servlet名為Key,而是通過一些轉(zhuǎn)換)的屬性為屬性Key,也將其存到ServletContext中,以便后續(xù)使用。這樣每個(gè)servlet就持有自己的上下文,即擁有自己獨(dú)立的bean空間,同時(shí)各個(gè)servlet共享相同的bean,即根上下文定義的那些bean。Bean加載過程Spring的高明之處在于,它使用眾多接口描繪出了所有裝置的藍(lán)圖,構(gòu)建好Spring的骨架,繼而通過繼承體系層層推演,不斷豐富,最終讓Spring成為有血有肉的完整的框架。所以查看Spring框架的源碼時(shí),有兩條清晰可見的脈絡(luò):1)接口層描述了容器的重要組件及組件間的協(xié)作關(guān)系;2)繼承體系逐步實(shí)現(xiàn)組件的各項(xiàng)功能。接口層清晰地勾勒出Spring框架的高層功能,框架脈絡(luò)呼之欲出。有了接口層抽象的描述后,不但Spring自己可以提供具體的實(shí)現(xiàn),任何第三方組織也可以提供不同實(shí)現(xiàn),可以說Spring完善的接口層使框架的擴(kuò)展性得到了很好的保證??v向繼承體系的逐步擴(kuò)展,分步驟地實(shí)現(xiàn)框架的功能,這種實(shí)現(xiàn)方案保證了框架功能不會(huì)堆積在某些類的身上,造成過重的代碼邏輯負(fù)載,框架的復(fù)雜度被完美地分解開了。Spring組件按其所承擔(dān)的角色可以劃分為兩類:1)物料組件:Resource、BeanDefinition、PropertyEditor以及最終的Bean等,它們是加工流程中被加工、被消費(fèi)的組件,就像流水線上被加工的物料;BeanDefinition:Spring通過BeanDefinition將配置文件中的配置信息轉(zhuǎn)換為容器的內(nèi)部表示,并將這些BeanDefinition注冊到BeanDefinitionRegistry中。Spring容器的后續(xù)操作直接從BeanDefinitionRegistry中讀取配置信息。2)加工設(shè)備組件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等組件像是流水線上不同環(huán)節(jié)的加工設(shè)備,對(duì)物料組件進(jìn)行加工處理。InstantiationStrategy:負(fù)責(zé)實(shí)例化Bean操作,相當(dāng)于Java語言中new的功能,并不會(huì)參與Bean屬性的配置工作。屬性填充工作留待BeanWrapper完成BeanWrapper:繼承了PropertyAccessor和PropertyEditorRegistry接口,BeanWrapperImpl內(nèi)部封裝了兩類組件:(1)被封裝的目標(biāo)Bean(2)一套用于設(shè)置Bean屬性的屬性編輯器;具有三重身份:(1)Bean包裹器(2)屬性訪問器(3)屬性編輯器注冊表。PropertyAccessor:定義了各種訪問Bean屬性的方法。PropertyEditorRegistry:屬性編輯器的注冊表該圖描述了Spring容器從加載配置文件到創(chuàng)建出一個(gè)完整Bean的作業(yè)流程:1、ResourceLoader從存儲(chǔ)介質(zhì)中加載Spring配置信息,并使用Resource表示這個(gè)配置文件的資源;2、BeanDefinitionReader讀取Resource所指向的配置文件資源,然后解析配置文件。配置文件中每一個(gè)解析成一個(gè)BeanDefinition對(duì)象,并保存到BeanDefinitionRegistry中;3、容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機(jī)制自動(dòng)識(shí)別出Bean工廠后處理后器(實(shí)現(xiàn)BeanFactoryPostProcessor接口)的Bean,然后調(diào)用這些Bean工廠后處理器對(duì)BeanDefinitionRegistry中的BeanDefinition進(jìn)行加工處理。主要完成以下兩項(xiàng)工作:1)對(duì)使用到占位符的元素標(biāo)簽進(jìn)行解析,得到最終的配置值,這意味對(duì)一些半成品式的BeanDefinition對(duì)象進(jìn)行加工處理并得到成品的BeanDefinition對(duì)象;2)對(duì)BeanDefinitionRegistry中的BeanDefinition進(jìn)行掃描,通過Java反射機(jī)制找出所有屬性編輯器的Bean(實(shí)現(xiàn)java.beans.PropertyEditor接口的Bean),并自動(dòng)將它們注冊到Spring容器的屬性編輯器注冊表中(PropertyEditorRegistry);4.Spring容器從BeanDefinitionRegistry中取出加工后的BeanDefinition,并調(diào)用InstantiationStrategy著手進(jìn)行Bean實(shí)例化的工作;5.在實(shí)例化Bean時(shí),Spring容器使用BeanWrapper對(duì)Bean進(jìn)行封裝,BeanWrapper提供了很多以Java反射機(jī)制操作Bean的方法,它將結(jié)合該Bean的BeanDefinition以及容器中屬性編輯器,完成Bean屬性的設(shè)置工作;6.利用容器中注冊的Bean后處理器(實(shí)現(xiàn)BeanPostProcessor接口的Bean)對(duì)已經(jīng)完成屬性設(shè)置工作的Bean進(jìn)行后續(xù)加工,直接裝配出一個(gè)準(zhǔn)備就緒的Bean??偨Y(jié)Spring IOC容器主要有繼承體系底層的BeanFactory、高層的ApplicationContext和WebApplicationContextBean有自己的生命周期容器啟動(dòng)原理:Spring應(yīng)用的IOC容器通過tomcat的Servlet或Listener監(jiān)聽啟動(dòng)加載;Spring MVC的容器由DispatchServlet作為入口加載;Spring容器是Spring MVC容器的父容器容器加載Bean原理:BeanDefinitionReader讀取Resource所指向的配置文件資源,然后解析配置文件。配置文件中每一個(gè)解析成一個(gè)BeanDefinition對(duì)象,并保存到BeanDefinitionRegistry中;容器掃描BeanDefinitionRegistry中的BeanDefinition;調(diào)用InstantiationStrategy進(jìn)行Bean實(shí)例化的工作;使用BeanWrapper完成Bean屬性的設(shè)置工作;單例Bean緩存池:Spring 在 DefaultSingletonBeanRegistry 類中提供了一個(gè)用于緩存單實(shí)例 Bean 的緩存器,它是一個(gè)用 HashMap 實(shí)現(xiàn)的緩存器,單實(shí)例的 Bean 以 beanName 為鍵保存在這個(gè)HashMap 中。
1、具有1-5工作經(jīng)驗(yàn)的,面對(duì)目前流行的技術(shù)不知從何下手,需要突破技術(shù)瓶頸的可以加群。
2、在公司待久了,過得很安逸,但跳槽時(shí)面試碰壁。需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加群。
3、如果沒有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí),對(duì)java工作機(jī)制,常用設(shè)計(jì)思想,常用java開發(fā)框架掌握熟練的,可以加群。
4、覺得自己很牛B,一般需求都能搞定。但是所學(xué)的知識(shí)點(diǎn)沒有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加群。5.Java架構(gòu)進(jìn)階群號(hào):668395460
第三篇:Spring MVC使用總結(jié)
Org.springframework.ui.ModelMap傳遞數(shù)據(jù)供視圖所用
${base}取的是當(dāng)前頁面所在的路徑。它隨頁面的位置改變而改變。
web開發(fā)一共有四個(gè)作用域,范圍從高到低分為appliaction作用域(全局作用域),session作用域,request作用域和page作用域。
${base}是el表達(dá)式語法,它會(huì)自動(dòng)先從page作用域開始查找,如果沒有再找request作用域,然后是session,最后再是application作用域。
動(dòng)態(tài)網(wǎng)頁項(xiàng)目,頁面直接訪問的是webcontent下的。
Weblogic.xml配置文件作用: weblogic.xml主要配置web容器的一些屬性,比較JSP編譯時(shí)間間隔、編譯路徑等 web.xml是配置整個(gè)應(yīng)用工程的屬性,如servlet等
你用tomcatjboss等web容器和weblogic一樣,它們單獨(dú)有自己的配置文件
視圖解析器
SpringMVC用于處理視圖最重要的兩個(gè)接口是ViewResolver和View
FreeMarkerViewResolver是繼承自springmvc的一個(gè)接口,只是和freemarker同名而已
XmlViewResolver
貌似工具庫里面定義好了(如ftl、分詞庫),然后在common中用
<@s.m “error.errorMessage”/>什么意思??
視頻
spring mvc
freemarker
金磊
今天問題
VECTOR-
腳本語言-
注解--
為什么frame要經(jīng)過FrameAct.java一下,再返回??
@Controller是spring的Controller控制器?
為什么我新建的html是
別人是
jar包
apache下的jar包
apache-ant-zip-1.8.0.jar(ant是什么??它的jar包??ant是腳本引擎,腳本語言有
JavaScript)
c3p0-0.9.1.2.jar
commons-codec-1.3.jar
commons-net-2.0.jar
commons-net-ftp-2.0.jar
dwr.jar
ehcache-1.6.2.jar
ganymed-ssh2-build251beta1.jar
htmlparser-1.6.jar
httpclient-4.0.3.jar
httpcore-4.1.jar
IKAnalyzer2012_u6.jar
jcaptcha-1.0.jar
jcl-over-slf4j-1.6.1.jar
jmagick.jar
json.jar
jta-1.1.jar
jug-2.0.0.jar
log4j-over-slf4j-1.6.1.jar
logback-classic-0.9.27.jar
logback-core-0.9.27.jar
lucene-core-3.0.3.jar
mailapi-1.4.2.jar
memcachedclient-2.0.1.jar
mysql-connector-5.1.8.jar
quartz-1.6.0.jar
slf4j-api-1.6.1.jar
smtp-1.4.2.jar
spymemcached-2.3.1.jar
----
spring mvc環(huán)境搭建:
1、web.xml,啟動(dòng)Dispatcher2、創(chuàng)建servlet3、創(chuàng)建controller.java(在spring mvc中,只要加了@controller就說明它是一個(gè)controller控制器了,非常簡單)
其它注解
@RequestMapping(“/frame/config_main.do”)只要頁面上訪問這個(gè)路徑,就會(huì)返回這
個(gè)注解下的方法的return的方法。
學(xué)習(xí)任何MVC都要掌握的步驟:
1、搭建環(huán)境(寫hello world)
2、傳值
3、截獲值
4、分發(fā)值
5、源碼
6、異常
7、上傳下載
第四篇:Spring 事物機(jī)制總結(jié)
spring兩種事物處理機(jī)制,一是聲明式事物,二是編程式事物 聲明式事物
1)Spring的聲明式事務(wù)管理在底層是建立在AOP的基礎(chǔ)之上的。其本質(zhì)是對(duì)方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。聲明式事務(wù)最大的優(yōu)點(diǎn)就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過等價(jià)的基于標(biāo)注的方式),便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。因?yàn)槭聞?wù)管理本身就是一個(gè)典型的橫切邏輯,正是AOP的用武之地。Spring開發(fā)團(tuán)隊(duì)也意識(shí)到了這一點(diǎn),為聲明式事務(wù)提供了簡單而強(qiáng)大的支持。Spring強(qiáng)大的聲明式事務(wù)管理功能,這主要得益于Spring依賴注入容器和Spring AOP的支持。依賴注入容器為聲明式事務(wù)管理提供了基礎(chǔ)設(shè)施,使得Bean對(duì)于Spring框架而言是可管理的;而Spring AOP則是聲明式事務(wù)管理的直接實(shí)現(xiàn)者。和編程式事務(wù)相比,聲明式事務(wù)唯一不足地方是,后者的最細(xì)粒度只能作用到方法級(jí)別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級(jí)別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進(jìn)行事務(wù)管理的代碼塊獨(dú)立為方法等等。2)5種配置方式
Spring配置文件中關(guān)于事務(wù)配置總是由三個(gè)組成部分,分別是DataSource、TransactionManager和代理機(jī)制這三部分,無論哪種配置方式,一般變化的只是代理機(jī)制這部分。
DataSource、TransactionManager這兩部分只是會(huì)根據(jù)數(shù)據(jù)訪問方式有所變化,比如使用hibernate進(jìn)行數(shù)據(jù)訪問時(shí),DataSource實(shí)際為SessionFactory,TransactionManager的實(shí)現(xiàn)為HibernateTransactionManager。關(guān)系圖如下:
[html] view plain copy
1.
3.4.5.
6.7.
8.
9.10.
注意:sessionFactorty和transactionManager是下面5中配置方式的基本配置,第一種方式:每個(gè)Bean都有一個(gè)代理
[html] view plain copy
1.
2.
3.4.
5.6.
7.
8.9.
10.11.
12.13.
14.PROPAGATION_REQUIRED
15.
16.
17.
第二種方式:所有Bean共享一個(gè)代理基類
[html] view plain copy
1.
2.
3.4.
5.6.
7.PROPAGATION_REQUIRED
8. 9.
10.
11.12.
13.
14.15.
16.17.
18.19.
第三種方式:使用攔截器
[html] view plain copy
1.
2.3.
4.5.
6.PROPAGATION_REQUIRED
7.
8.
9.
10.11.
12.13.
14.
15.
16.
17.18.
19.
20.
21.
22.
23.24.
25.
26.27.
第四種方式:使用tx標(biāo)簽配置的攔截器
[html] view plain copy
1.
3.
5.
6.7.
8. 9.expression=“execution(* com.test.spring.dao.*.*(..))” /> 10. 11. 第五種方式:全注解 [java] view plain copy 1.public class test { 2.@Transactional 3.public class UserDaoImpl extends HibernateDaoSupport implements UserDao { 4.5.public List 7.} 8.} 9.} 編程式事務(wù) Spring的編程式事務(wù)即在代碼中使用編程的方式進(jìn)行事務(wù)處理,可以做到比聲明式事務(wù)更細(xì)粒度。有兩種方式一是使用TransactionManager,另外就是TransactionTemplate。1)TransactionManager使用方式 [java] view plain copy 1.public class UserDaoImpl extends HibernateDaoSupport implements UserDao { 2.private HibernateTransactionManager transactionManager;3.private DefaultTransactionDefinition def;4.5.public HibernateTransactionManager getTransactionManager(){ 6.return transactionManager;7.} 8.9.public void setTransactionManager(HibernateTransactionManager transactionManager){ 10.this.transactionManager = transactionManager;11.} 12.13.public void createTransactionDefinition(){ 14.def = new DefaultTransactionDefinition(); 15.def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);16.def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);17.} 18.19.public void saveOrUpdate(User user){ 20.TransactionStatus status = transactionManager.getTransaction(def);21.try { 22.this.getHibernateTemplate().saveOrUpdate(user);23.} catch(DataAccessException ex){ 24.transactionManager.rollback(status);25.throw ex; 26.} 27.transactionManager.commit(status);28.} 29.} 2)TransactionTemplate方式 [java] view plain copy 1.ResultDto ret = null; 2.ret =(ResultDto)this.transactionTemplate.execute(new TransactionCallback(){ 3.@Override 4.public Object doInTransaction(TransactionStatus status){ 5.ResultDto ret = null; 6.try { 7.drillTaskDao.deleteByKey(taskid); 8.} catch(Exception e){ 9.logger.error(“delDrillTask:” + e.getMessage(), e); 10.ret = ResultBuilder.buildResult(ResultBuilder.FAIL_CODE, null, ErrorCode.COM_DBDELETEERROR);11.return ret;12.} 13.finally { 14.status.setRollbackOnly();15.} 16.17.ret = cleartaskrelativedata(taskid, appid, true);18.return ret;19.} 20.}); 21.return ret; Spring教學(xué)大綱 1.Spring簡介:一站式框架 Spring能為我們帶來什么? a)使層與層之間只依賴于接口 b)Spring的bean工廠為我們創(chuàng)建對(duì)象,不需要程序員自己new對(duì)象了(IOC:inverse of control控制反轉(zhuǎn),DI:depandency injection 依賴注入)c)可以管理事務(wù) d)可以對(duì)其他框架進(jìn)行管理(struts2,hibernate)e)也可以使用spring自帶的springMVC框架 f)也可以使用spring的JDBC模板 2.Spring IOC(DI)常用的注入方式: 1.構(gòu)造器注入 2.setter注入(set方法注入)(常用)注意:setter方法注入,必須提供無參構(gòu)造方法 3.Spring Bean的范圍 常用的范圍: Singleton:單例模式,建議不要存在具有狀態(tài)的成員變量,該項(xiàng)為默認(rèn)項(xiàng) Prototype:只要使用該對(duì)象,那就創(chuàng)建一個(gè)新的 注意:spring在與struts2整合時(shí),需要將產(chǎn)生action的bean,配置為scope=”prototype” 4.Spring自動(dòng)裝配 a)byName 要求:bean id必須與包含此類成員的類的成員變量名相同 b)byType 根據(jù)類型查找,將查找到的對(duì)象注入到成員變量中 5.使用spring自帶的JDBC模板 6.事務(wù)管理 7.Spring管理hibernate 8.spring整合struts2 步驟: 1.在項(xiàng)目中要引入struts2-spring-plugin-x-x-x.jar文件,該文件的位置:struts2的lib目錄下 2.在struts.xml中配置: contextConfigLocation classpath*:applicationContext-beans.xml 注意:在spring中生成action對(duì)象時(shí),最好配置scope=”prototype” 9.Ssh整合開發(fā)第五篇:spring教學(xué)大綱