Spring是什麼
spring是一個開源的java框架,集成了各種主流的技術包括web mvc,orm,ejb,rmi,javamail等
他就象一個粘合濟,在實際項目中,將前後臺程序粘合在一起,構建出一個完整的系統。
spring中的各個組件也可獨立使用,你可以在你的項目中選擇性的使用spring提供的某一部分功能
Spring的核心是ioc和aop
什麼是IOC
Inversion of Control,控制反轉或反轉控制,其和另外一個概念DI-Dependency Injection依賴注入
等價。
到底如何來理解IOC?
IOC確切的說,他是一種思想、概念,跟OOP是一種編程思想一樣,他是在大量的項目實踐中總結出來了
的一種精妙地程序設計思想。在原先的程序設計中,我們通常是通過new XXX(),其中,XXX就是某個類
的名稱,在沒有ioc思想引入時,我們程序中大量充斥着new XXX()這樣的代碼。這些代碼都需要我們程
序員手工編寫。而引入了ioc思想之後,對象的管理全部交給Spring這個容器來管理,當我們程序需要
對應類的對象時,我們直接從Spring容器裏面獲取,換句話說,就是Spring容器把產生好的對象交給了
我們的程序,這種方式就叫做注入(就跟醫生拿着可怕的針管將液體注入到我們的屁股上一樣,爲什麼
要注入,還不是你的屁股需要嘛!因爲你需要,所以我給你,這就是DI)
而IOC的深層含義就是,將原先對象產生的主動權交給了Spring容器,由Spring容器來爲我們完成對象的
new的過程,並將對象在我們需要時交給我們。
Spring正是IOC思想的一個完美產物和實踐者!
什麼是aop
Aspect Oriented Programming,面向方面編程,它也是一種編程思想,它是對OOP編程思想的一種昇華
OOP強調的是對象,而aop強調的是面(不是餃子)
那麼,什麼是面?
如果拿我們的教室做比方,那麼教室的前門和後窗就是一個面,一個截面,通過這樣的截面,將我們這塊
空間分成了室內、窗外和門外三部分。
如果拿我們吃的漢堡做比方,那麼漢堡的夾心的前後就是一個面,一個截面,通過這樣的截面,將我們的
普通麪包分成了麪包上層、夾心、麪包下層。
如果。。。
還是拿我們的程序代碼來說,
如果我們的dao用jdbc實現,那麼在dao的每一個方法裏都充斥着這樣的代碼,
打開連接
執行sql語句
關閉連接
那麼,這時,我們就可以在執行sql前後做出一個截面,通過這樣的截面,將我們的程序代碼分開,將打開
連接和關閉連接交給AOP去做,我們程序員只關注執行不同sql語句部分,避免了在dao的每個方法中都要編
寫重複的打開連接和關閉連接代碼。
如果我們的dao用hibernate實現,那麼在dao的每一個方法裏都充斥着這樣的代碼
打開session
執行session動作
關閉session
同理,我們就可以在執行session動作前後做出一個截面,通過這樣的截面,將我們的程序代碼分開,將打開
session和關閉session交給AOP去做,我們程序員只關注執行session動作,避免了代碼的重複豈不更好
這就是AOP,好好理解吧,那可是個漫長的思想體驗過程!祝你好運!
-----------------------------------------------------------------------------------------------------------------------------------------------
spring的另外一個入門概念
一、 Spring誕生
Spring是一個開源框架,目前在開源社區的
人氣很旺,被認爲是最有前途的開源框架之一。她是由Rod Johnson創建的,她的誕生是爲了簡化企業級系統的開發。說道Spring就不得不說
EJB,因爲Spring在某種意義上是EJB的替代品,她是一種輕量級的容器。用過EJB的人都知道EJB很複雜,爲了一個簡單的功能你不得不編寫多個
Java文件和部署文件,他是一種重量級的容器。也許你不瞭解EJB,你可能對“輕(重)量級”和“容器”比較陌生,那麼這裏我簡單介紹一下。
1、什麼是容器
“容
器”,這個概念困擾我好久。從學習Tomcat開始就一直對此感到困惑。感性的來講,容器就是可以用來裝東西的物品。那麼在編程領域就是指用來裝對象
(OO的思想,如果你連OO都不瞭解,建議你去學習OO先)的對象。然而這個對象比較特別,它不僅要容納其他對象,還要維護各個對象之間的關係。這麼講可
能還是太抽象,來看一個簡單的例子:
代碼片斷1:
- public class Container
- {
- public void init()
- {
- Speaker s = new Speaker();
- Greeting g = new Greeting(s);
- }
- }
可
以看到這裏的Container類(容器)在初始化的時候會生成一個Speaker對象和一個Greeting對象,並且維持了它們的關係,當系統要用這
些對象的時候,直接問容器要就可以了。這就是容器最基本的功能,維護系統中的實例(對象)。如果到這裏你還是感到模糊的話,別擔心,我後面還會有相關的解
釋。
2、輕量級與重量級
所謂“重量級”是相對於“輕量級”來講的,也可以說“輕量級”是相對於重量級來講的。在Spring出現
之前,企業級開發一般都採用EJB,因爲它提供的事務管理,聲明式事務支持,持久化,分佈計算等等都“簡化”了企業級應用的開發。我這裏的“簡化”打了雙
引號,因爲這是相對的。重量級容器是一種入侵式的,也就是說你要用EJB提供的功能就必須在你的代碼中體現出來你使用的是EJB,比如繼承一個接口,聲明
一個成員變量。這樣就把你的代碼綁定在EJB技術上了,而且EJB需要JBOSS這樣的容器支持,所以稱之爲“重量級”。
相對而言“輕量級”就是
非入侵式的,用Spring開發的系統中的類不需要依賴Spring中的類,不需要容器支持(當然Spring本身是一個容器),而且Spring的大小
和運行開支都很微量。一般來說,如果系統不需要分佈計算或者聲明式事務支持那麼Spring是一個更好的選擇。
二、 幾個核心概念
在我看來Spring的核心就是兩個概念,反向控制(IoC),面向切面編程(AOP)。還有一個相關的概念是POJO,我也會略帶介紹。
1、POJO
我
所看到過的POJO全稱有兩個,Plain Ordinary Java Object,Plain Old Java Object,兩個差不多,意思
都是普通的Java類,所以也不用去管誰對誰錯。POJO可以看做是簡單的JavaBean(具有一系列Getter,Setter方法的類)。嚴格區分
這裏面的概念沒有太大意義,瞭解一下就行。
2、 IoC
IoC的全稱是Inversion of Control,中文翻譯反向控
制或者逆向控制。這裏的反向是相對EJB來講的。EJB使用JNDI來查找需要的對象,是主動的,而Spring是把依賴的對象注入給相應的類(這裏涉及
到另外一個概念“依賴注入”,稍後解釋),是被動的,所以稱之爲“反向”。先看一段代碼,這裏的區別就很容易理解了。
代碼片段2:
- public void greet()
- {
- Speaker s = new Speaker();
- s.sayHello();
- }
代碼片段3:
- public void greet()
- {
- Speaker s = (Speaker)context.lookup("ejb/Speaker" );
- s.sayHello();
- }
代碼片段4:
- public class Greeting
- {
- public Speaker s;
- public Greeting(Speaker s)
- {
- this .s = s;
- }
- public void greet()
- {
- s.sayHello();
- }
- }
-----------------------------------------------------------------------------------------------------------------------------------------------
剖析Spring容器的作用及實現方式
,Spring在其中是一個非常重要的框架
,Spring在其中是一個非常重要的框架 我 們 在使用ssh整合項目的時候,Spring在其中是一個非常重要的框架,它在其中可以說是一個最核心的框架,提到spring我們不得不提它的IOC容器 的功能了!它是一個大工廠,可以在其中產生和管理很多的bean,下面,請隨阿堂一起來好好看看spring的容器功能方面的介紹,這對於我們在解決 ssh框架整合中的問題,進行測試時是非常有用的!
bsp;我們在使用ssh整合項目的時候
1.spring容器
Spring
有兩個核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子
接口,它們代表了Spring容器,Spring容器是產生Bean的工廠,用於管理容器中的Bean。Bean是Spring管理的基本單位,在
spring的J2EE應用中,所有的組件都是Bean。Bean包括數據源、Hibernate的SessionFactory、事務管理器等。
,它在其中可以說是一個最核心的框架,提到
應
用中的所有組件,都處於spring的管理下,都被spring以Bean的方式管理,spring負責創建Bean實例,並管理其生命週期。
Spring裏的Bean是非常廣義的概念,任何Java對象和Java組件都被當成Bean處理,甚至這些組件,並不是標準的JAVABEAN。
Bean在spring容器中運行,無須感受Spring容器的存在,一樣可以接受spring的信賴注入,包括Bean屬性的注入、合作者的注入、信賴關係的注入等。
spring容器負責創建Bean實例,所以需要知道每個Bean的實現類,JAVA程序的實現面向接口編程,無須關心Bean實例的實現。但Spring容器必須能精確知道每個Bean的實現類,因此Spring配置文件必須精確配置Bean的實現類。
,Spring在其中是一個非常重要的框架
Spring容器最基本的接口就是BeanFactory.BeanFactory負責配置、創建、管理Bean,它有一個子接口ApplicationContext,因此也稱爲Spring上下文。Spring容器負責管理Bean與Bean之間的信賴關係。
spring我們不得不提它的IOC容器的
BeanFactory接口包含如下基本的方法:
,它在其中可以說是一個最核心的框架,提到
public boolean containsBean(Stringname),判斷Spring容器是否包含id爲name的Bean定義
public Object getBean(String name)返回容器id爲name的bean
public Object getBean(String name,ClassrequiredType)返回容器中id爲name,並且類型爲requiredType的Bean,它在其中可以說是一個最核心的框架,提到
public Class getType(String name)返回容器中id爲name的Bean的類型
調用者只需使用getBean方法即可獲得指定Bean的引用,無須關心Bean的實例化過程,即Bean實例的創建過程完全透明。
BeanFactory有很多實現類,通常使用spring我們不得不提它的IOC容器的 org.springframework.beans.factory.xml.XmlBeanFactory 類。但對於大部分J2EE應用而言,推薦使用ApplicationContext.ApplicationContext是BeanFactory的子接口,其常用實現類是
org.springframework.context.support.FileSystemXmlApplicationContext和
,Spring在其中是一個非常重要的框架
org.springframework.context.support.ClassXmlAplicationContext.
創 建 BeanFactory實例時,必須提供Spring容器管理的Bean的詳細配置信息。Springr的配置信息通常採用XML配置文件來設置,因此, 創建BeanFactory實例時,應該提供XML配置文件作爲參數。XML配置文件通常使用Resource對象傳入
&n
Resource接口用於訪問配置文件資源
,它在其中可以說是一個最核心的框架,提到
大部分j2ee應用,可在啓動web應用時自動加載ApplicationContext實例,接受Spring管理的Bean無須知道ApplicationContext的存在,一樣可以利用ApplicationContext的管理。
,它在其中可以說是一個最核心的框架,提到 對於獨立的應用程序,也可以通過如下方法來實例化BeanFactory
,Spring在其中是一個非常重要的框架
//搜索當前文件路徑下的beans.xml文件創建Resource對象
InputStreamResource isr=new FileSystemResource(is);
//以Resource對象作爲參數,創建BeanFactory的實例 &n
XmlBeanFactory factory=new XmlBeanFactory(isr);
spring我們不得不提它的IOC容器的 或者採用如下方法
&n
//搜索CLASSPATH路徑,以CLASSPATH路徑下的beans.xml文件創建Resource對象
ClassPathResource res=new ClassPathResource("beans.xml");bsp;我們在使用ssh整合項目的時候
//以Resource 對象作爲參數,創建BeanFactory實例
XmlBeanFactory factory=new XmlBeanFactory(res);
,它在其中可以說是一個最核心的框架,提到
如果應用裏有多個屬性配置文件,則應該採用BeanFactory的子接口ApplicationContext來創建BeanFactory的實例,ApplicationContext通常採用如下兩個實現類。
,它在其中可以說是一個最核心的框架,提到
FileSystemXmlApplicationContext,以指定路徑的XML配置文件創建ApplicationContext
ClassPathXmlApplicationContext,以CLASSPATH路徑下的XML配置文件創建ApplicationContext
,Spring在其中是一個非常重要的框架
bsp;我們在使用ssh整合項目的時候 如果需要同時加載多個XML配置文件,可以採用如下方式
//搜索CLASSPATH路徑,以CLASSPATH路徑下的applicationContext.xml 和service.xml文件創建ApplicationContext &n
ClassPathXmlApplicationContext appContext=newClassPathXmlApplicationContext(
new String[]{"applicationContext.xml","service.xml"});
spring我們不得不提它的IOC容器的
//事實上,ApplicationContext是BeanFactory的子接口,支持強制類型轉換
BeanFactory factory=(BeanFactory) appContext;
,Spring在其中是一個非常重要的框架
當然,也可以支持從指定的路徑來搜索特定文件加載:
spring我們不得不提它的IOC容器的
//以指定路徑下的applicationContext.xml和service.xml文件創建Applicationcontext &n
FileSystemXmlAplicationContext appContext=new
FileSystemXmlApolicationContext(
new String[]{"applicationContext.xml","service.xml"},Spring在其中是一個非常重要的框架
)
//事實上,ApplicationContext是BeanFactory的子接口,支持強制類型轉換
BeanFactory factory=(BeanFactory) appContext;
spring我們不得不提它的IOC容器的
,Spring在其中是一個非常重要的框架
2.使用ApplicationContext
很
多時候,並不是直接使用BeanFactory實例作爲Spring容器,而是使用ApplicationContext實例。因此,有時候也稱
Spring容器爲Spring上下文。ApplicationContext是BeanFactory接口的子接口,它增強了BeanFactory的
功能。
ApplicationContext允許以聲明方式操作容器,無須手動創建它。可利用如ContextLoader的支持類,在web應用啓動自動創建ApplicationContext。當然,也可以採用編程方式創建ApplicationContext
,Spring在其中是一個非常重要的框架
ApplicationContext繼承MessageSource接口,因此提供國際化支持資源訪問,比如URL和文件,Spring在其中是一個非常重要的框架
事件傳遞
載入多個配置文件
ApplicationContext包括 BeanFactory的全部功能,因此建議優先使用ApplicationContext,除了對於某些內存非常關鍵的作用,才考慮使用BeanFactoryspring我們不得不提它的IOC容器的