摘要:裝配提供了三種裝配機制在中進行顯示配置在中進行顯示配置隱式的發現機制和自動裝配機制。表示該類是一個組件,將自動創建該組件實例,表示注入組件實例,和功能類似,和功能類似,但和是規范中提供的注解。
基本原理
spring的基礎是IOC和DI,其實IOC和DI是對同一件事從不同的方面進行描述的,兩者在spring中是同一件事務。
IOC:控制反轉,在這里就是指創建bean的主動權發生了轉移,原來是由類主動創建bean,現在類不再創建bean,而是由框架去創建類,所以類的創建權限發生了轉移。
DI:依賴注入,在這里是指每個類所需的外部實例,都是先向框架發出需求請求,然后由框架去將創建好的bean注入到類中,所以類是依賴于框架的。
AOP:面向切面,就是將一些公共功能分離出來的一種技術。
IOC/DI/AOP在spring中實現的技術基礎是java動態代理和反射技術。
spring模塊框架圖如下所示:
圖片描述
spring2.0版本
spring2.5版本
spring3.0 3.1 3.2
spring4.0 4.1 4.2 4.3
spring 5.0 最新版本
其中spring3.x 需要jdk5+ / spring4.x需要jdk6+
spring3.x相比于spring2.5.x的區別可分為以下幾個方面:模塊管理更加細致,分出的包更多;增加了一些新特性,對原來的一些功能進行了增強;針對java5的核心API升級。
spring裝配spring提供了三種裝配機制:在xml中進行顯示配置;在java中進行顯示配置;隱式的bean發現機制和自動裝配機制。(注解是java提供的一種機制,允許你對類進行標記,然后在運行時動態操作標記的類,注解機制包括三部分,注解聲明,被注解的類,操作注解的代碼(通過反射獲取類上的注解))
工作中三種方式的梳理:
1.在xml中進行bean的聲明和配置;
2.使用javaconfig在java類中進行配置,此處需要使用的@Configuration/@ComponentScan/@Import/@ImportResource注解,其中@Configuration注解表明該類是spring配置類,@ComponentScan表示啟動組件掃描,@Import表示導入其他的配置類,@ImortResource表示導入其他的配置文件。
3.混合使用xml和javaconfig,就是使用@Component/@Bean/@Name/@Autowired/@Inject注解配置bean類,同時使用xml配置公共屬性,并啟動組件掃描。@Component表示該類是一個組件,spring將自動創建該組件實例,@Autowired表示注入組件實例,@Name和@Component功能類似,@Inject和@Autowired功能類似,但@Name和@Inject是Java規范中提供的注解。
java依賴注入和spring注解的不同點和相同點可以參考:
http://www.cnblogs.com/liangx...
http://bhdweb.iteye.com/blog/...
http://blog.csdn.net/DL88250/...
當spring引入第三方庫中的組件時,此時就不能使用@Component和@Autowired注解了,若使用JavaConfig引入第三方框架時,@Bean注解將會使用到,它一般用在一個方法上,表示方法返回的實例將作為spring中的實例使用,這樣就可以在其他類中,像使用spring其他實例那樣直接@Autowired即可。
@Autowired和@Resoure的異同點:http://bhdweb.iteye.com/blog/...
spring中的profile在程序開發中,往往有幾個好幾環境比如:開發環境、測試環境、生產環境,每個環境的數據庫配置等信息都不相同,如果每次都通過修改程序和配置文件來切換開發環境,非常容易出現錯誤,spring的profile就是為了解決不同環境之間切換問題的。
profile在spring3.1中就出現了,不過spring3.1中@Profile只能應用在類上,而在spring3.2中@Profile已經可以在方法上使用。使用如下所示:
@Configuration public class DataSourceConfig{ @Bean @Profile("dev") public DataSource embeddedDataSource(){}
@Bean @Profile("prod") public DataSource jndiDataSource(){}
}
上面的類中定義了兩個profile,但是只有當規定的profile被激活時,相應的bean才會生成。spring在確定激活profile時,需要依賴兩個獨立的屬性,spring.profiles.active和spring.profiles.default。spring的處理機制是,先查找active確定激活的profile,若沒有設置active屬性,再去查找default。有多種方式設置兩個屬性:
作為DispatcherServerlet的初始化屬性; 作為web應用的上下文參數; 作為JNDI條目 作為環境變量(需要用到ServletContextListener,重寫contextInitialized方法) 作為jvm的系統屬性 在測試類上,使用@ActiveProfiles注解設置。
激活示例和xml配置示例可以參考:http://www.cnblogs.com/yw0219... http://www.jfox.info/springpr...
Spring中Bean的特殊用法條件化的bean
條件化bean指,只有當滿足一定條件時才會創建bean,但是在spring4之前,很難實現這一點,但是spring4引入了一個新的@Conditional注解,它可以用到帶有@Bean的注解方法上,如果給定的條件計算結果為true,就會創建bean,否則的話,這個bean會被忽略。spring4重構了@Profile,@Profile使用@Conditional注解實現,代碼如下所示:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) @Documented @Conditional(ProfileCondition.class) public @interface Profile{ String[] value(); } class ProfileCondition implements Condition{ public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){ if(context.getEnvironment()!=null){ MultiValueMapattrs=metadata.getAllAnnotationAttributes(Profile.class.getName()); if(attrs!=null){ for(Object value:attrs.get("value")){ if(context.getEnvironment().acceptsProfiles((String[])value)){ return true; } } return false; } } return true; } }自動裝配的歧義性處理
當發生歧義性時,spring提供了多種可供選擇的方案來解決該問題。
1.標示首選的bean:當spring遇到歧義性時,spring將會使用首選的bean,而不是其他可選的bean.示例如下所示:
@Component @Primary public class IceCream implements Dessert{...}
2.限定自動裝配的bean:spring提供了@Qualifier限定符用于縮小可選的bean。@Qualifier可以和@Autowired與@Inject協同使用。如下所示:
@Autowired @Qualifier("iceCream") public class setDessert( Dessert dessert){...}
@Qualifier注解所設置的參數就是想要注入的bean的ID,所有使用@Component注解聲明的類都會創建為bean,并且bean的ID為首字目小寫的類。
也可以創建自定義的限定符如下所示:
@Component @Qualifier("cold") public class IceCream implements Dessert{...}
此時IceCreate的bean ID的為:cold.
3.自定義限定符注解
java不允許在同一個條目上重復出現相同類型的多個注解,但是java8注解允許出現重復的注解,只要這個注解本身的定義的時候帶有@Repeatable注解就可以,不過@Qualifier注解并沒有在定義時添加@Repeatable。@Qualifier可以允許我們定義自己的限定符注解,舉例如下所示:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) @Qualifier public @interface Cold{ }
下面我們就可以使用@Cold注解代替@Qualifierz("cold")
bean的作用域spring定義了多種作用域,可以基于這些作用域創建bean.
單例:在整個應用中,只創建bean的一個實例。 原型:每次注入或者通過spring應用上下文獲取的時候,都會創建一個新的bean的實例。 會話:在web應用中為每個會話創建一個bean實例。 請求:在web應用中,為每個請求創建一個bean實例。
單例是默認的作用域,如果想修改bean的作用域可是使用@Scope注解,示例如下所示:
@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class Cold{.... }
@Scope還有一個proxyMode屬性,該屬性是解決了將一個會話或請求作用域的bean注入到單例bean中。舉例如下所示:
@Component @Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES) public class ShoppingCart implements Cart{.... }
@Component public class StoreService{ @Autowired Cart cart;
}
因為StoreService是單例模式,而ShoppingCart是會話作用域,在spring創建StoreService時,ShoppingCart并不存在,因此通過設置proxyMode屬性,spring不會將實際的ShoppingCart注入StoreService中,spring會注入一個代理,只有當StoreService調用cart時,代理會對其進行懶解析并將調用委托給真正的ShoppingCart
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70547.html
摘要:指南無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率使用團隊推薦的最新項目版本和技術。使用進行消息傳遞了解如何將用作消息代理。安全架構的主題指南,這些位如何組合以及它們如何與交互。使用的主題指南以及如何為應用程序創建容器鏡像。 Spring 指南 無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率 — 使用Spring團隊推薦的最新Spring項目版本和技術。 入門指南 這些...
摘要:參考指南使你可以輕松地創建可運行的獨立的生產級的基于的應用程序,我們對平臺和第三方庫有自己的看法,這樣你就可以以最低限度工作開始了,大多數應用程序都需要很少的配置。文檔本節簡要概述了參考文檔,它充當文檔其余部分的映射。 Spring Boot 參考指南 Spring Boot使你可以輕松地創建可運行的獨立的、生產級的基于Spring的應用程序,我們對Spring平臺和第三方庫有自己的看...
摘要:關于文檔參考指南可用如下方式最新的副本可以在中找到。嘗試操作文檔,它們為最常見的問題提供解決方案。學習基礎,構建在許多其他項目上,網站提供豐富的參考文檔,如果你要從開始,嘗試其中一個指南。我們對進行監視,以解決帶有標記的問題。 1. 關于文檔 Spring Boot 參考指南可用如下方式: HTML PDF EPUB 最新的副本可以在 docs.spring.io/spring-b...
摘要:系列文章更新計劃列表主要對一些中常用的框架進行簡單的介紹及快速上手,外加相關資料的收集更新列表會不定期的加入新的內容以進行擴充,如果你對此感興趣可以站內聯系我。 導讀: 從第一次接觸Spring Boot 至今已經有半年多了,在這期間也瀏覽了許多和Spring Boot 相關的書籍及文章,公司里面的許多項目也一直在使用Spring Boot。關于Spring Boot的一些看法:Spr...
摘要:本指南將引導您完成使用訪問關系數據的過程。要在應用程序級別表示此數據,請創建一個類。存儲和檢索數據提供了一個名為的模板類,可以輕松使用關系數據庫和。自動加載并使其可用。使用的參數,以避免注入攻擊通過指示來綁定變量。 本指南將引導您完成使用Spring訪問關系數據的過程。 你要構建什么 您將使用Spring構建一個JdbcTemplate應用程序來訪問存儲在關系數據庫中的數據。 你需要什...
閱讀 2581·2021-11-22 12:01
閱讀 1105·2021-11-15 11:37
閱讀 3685·2021-09-22 14:59
閱讀 1746·2021-09-04 16:45
閱讀 1382·2021-09-03 10:30
閱讀 1013·2021-08-11 11:18
閱讀 2459·2019-08-30 10:53
閱讀 2013·2019-08-29 15:13