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