Spring是一個輕量級的Java 開發框架。他使用基本的JavaBean來完成之前只可能由EJB【Enterprise JavaBean】完成的事情。html
簡單來講,Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。java
若是說Spring是一個工具箱,那SpringMVC就是其中的一個扳手。Spring MVC是Spring提供的一個強大而靈活的web框架。藉助於多樣的註解,Spring MVC提供了幾乎是POJO【Plain Ordinary Java Object,普通JavaBeans】的開發模式,使得控制器的開發和測試更加簡單。web
SpringMVC利用反射機制原理出現的註解就是爲了解決配置大量的配置文件問題spring
【反射機制:在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制】json
這樣就完成了 一次http請求 到 響應。服務器
官方給出的定義是:Spring IoC容器能夠自動裝配(autowire)相互協做bean之間的關聯關係。session
所以,若是可能的話,能夠自動讓Spring經過檢查BeanFactory中的內容,來替咱們指定bean的協做者(其餘被依賴的bean)。因爲autowire能夠針對單個bean進行設置,所以可讓有些bean使用autowire,有些bean不採用。app
autowire的方便之處在減小或者消除屬性或構造器參數的設置,這樣能夠給咱們的配置文件減減肥,咱們少寫幾個 <ref ="...">。框架
能夠先熟悉下什麼是Spring的Bean,參考第五項。工具
如下內容主要來自於:Spring(二)Bean入門
--------------------------------開始------------------------------------------
Bean一般被定義在配置文件當中,Bean實例化由Spring的Ioc容器進行管理,Bean的實例能夠經過Beanfactory進行訪問,實際上大部分J2EE應用,Bean是經過ApplicationContext來訪問的,ApplicationContext是BeanFactory的子接口,功能要比BeanFactory強大許多
BeanFactory經常使用方法:
一般使用XmlBeanFactory類來實現
若是屬性不是String類型,屬性值會經過PropertyEditors轉換爲其餘類型
-ref元素進行標識
Ref元素一般有兩個屬性:
bean:指定不在同一個XML文件中的bean的id
<bean id="test" class="com.pb.test"> <property name="user"> <ref bean="其餘的bean的id"/> </property> </bean>
local:指定在同一個XML文件中的bean的id
<bean id="test" class="com.pb.test"> <property name="user"> <ref bean="相同的XML文件中的bean的id"/> </property> </bean>
value和ref的區別:
使用ref元素,可讓Spring在部署時驗證依賴的Bean是否真實存在
使用value元素,進行指定僅在建立Bean實例時作驗證,會致使錯誤的延時出現,並且還會帶來額外的類型轉制開銷
List:
<bean id="test" class="com.pb.test"> <property name="lists"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> </bean>
Map:
<bean id="test" class="com.pb.test"> <property name="map"> <map> <entry key="key1"> <value>value1</value> </entry> <entry key="key2"> <value>key2</value> </entry> </map> </property> </bean>
props:
<bean id="test" class="com.pb.test"> <property name="props"> <props> <prop key="key1">value1</prop> <prop key="key2">value2</prop> </props> </property> </bean>
set:
< property name ="interest" > < set > < value > 唱歌 </ value > < value > 跳舞 </ value > < value > 書法 </ value > </ set > </ property >
經過autowire屬性來設置
-------------------------------結束--------------------------------------------
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId");
說明:這種方式適用於採用Spring框架的獨立應用程序,須要程序經過配置文件手工初始化Spring的狀況。
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); ac1.getBean("beanId"); ac2.getBean("beanId");
說明:這種方式適合於採用Spring框架的B/S系統,經過ServletContext對象獲取ApplicationContext對象,而後在經過它獲取須要的類實例。上面兩個工具方式的區別是,前者在獲取失敗時拋出異常,後者返回null。
說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,能夠方便的獲取ApplicationContext。
Spring初始化時,會經過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。
說明:相似上面方法,調用getWebApplicationContext()獲取WebApplicationContext
說明:實現該接口的setApplicationContext(ApplicationContext context)方法,並保存ApplicationContext 對象。Spring初始化時,會經過該方法將ApplicationContext對象注入。
如下是實現ApplicationContextAware接口方式的代碼,前面兩種方法相似:
public class SpringContextUtil implements ApplicationContextAware { // Spring應用上下文環境 private static ApplicationContext applicationContext; /** * 實現ApplicationContextAware接口的回調方法,設置上下文環境 * * @param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtil.applicationContext = applicationContext; } /** * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 獲取對象 * * @param name * @return Object * @throws BeansException */ public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
雖然,spring提供的後三種方法能夠實如今普通的類中繼承或實現相應的類或接口來獲取spring 的ApplicationContext對象,可是在使用是必定要注意實現了這些類或接口的普通Java類必定要在Spring 的配置文件applicationContext.xml文件中進行配置。不然獲取的ApplicationContext對象將爲null。
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); wac.getBean(beanID);
最後提供一種不依賴於servlet,不須要注入的方式。
可是須要注意一點,在服務器啓動時,Spring容器初始化時,不能經過如下方法獲取Spring 容器,細節能夠查看spring源碼org.springframework.web.context.ContextLoader。