javascript
【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发
Spring注解開發(fā)
Spring是輕代碼重配置的框架,配置比較繁重,會(huì)影響開發(fā)效率。這個(gè)時(shí)候可以通過注解開發(fā),注解代替xml配置文件可以簡(jiǎn)化配置,提高開發(fā)效率。
Spring原始注解
注解分為原始注解和新注解,主要是從邏輯上分的,并沒有實(shí)際的影響。
原始注解出現(xiàn)的比較早,主要用來替代標(biāo)簽配置的。
| @Component | 使用在類上,用于實(shí)例化Bean,相當(dāng)于標(biāo)簽 |
| @Controller | 使用在web層類上,用于實(shí)例化Bean。語義化的@Component |
| @Service | 使用在service層類上,用于實(shí)例化Bean。語義化的@Component |
| @Repository | 使用在dao層類上,用于實(shí)例化Bean。語義化的@Component |
| @Autowired | 使用在對(duì)象引用字段上,用于根據(jù)當(dāng)前字段類型依賴注入 |
| @Qualifier | 使用在對(duì)象引用字段上,結(jié)合@Autowired一起使用,用于根據(jù)名稱進(jìn)行依賴注入 |
| @Resource | 使用在對(duì)象引用字段上,相當(dāng)于@Autowired+@Qualifier,按照名稱進(jìn)行依賴注入 |
| @Value | 使用在普通類型字段上,注入普通屬性 |
| @Scope | 使用在類上,標(biāo)準(zhǔn)Bean的作用范圍 |
| @PostConstruct | 使用在方法上,標(biāo)注該方法是Bean的初始化方法 |
| @PreDestory | 使用在方法上,標(biāo)注該方法時(shí)Bean的銷毀方法 |
上述注解中比較常用的是除最后兩個(gè)之外的所有注解。
注意:
使用注解進(jìn)行開發(fā)時(shí),不需要在applicationContext.xml配置各種Bean了,但是需要配置組件掃描。作用是指定哪個(gè)包及其子包下的Bean需要進(jìn)行掃描,以便識(shí)別使用了注解配置的類、字段和方法。
<!--注解的組件掃描--> <context:component-scan base-package="cs.wy"/>Spring注解開發(fā) - QuicStart
-
在 ApplicationContext.xml中中引入context命名空間和約束文件,并添加組件掃描
-
編寫UserDaoImpl類,并使用@Component(或者@Repository)進(jìn)行標(biāo)注,告訴Spring容器實(shí)例化該類。
- 使用@Compont 或 @Service 標(biāo)識(shí)UserServiceImpl需要Spring進(jìn)行實(shí)例化
- 使用@Autowired 或者 @Autowired+@Qulifier 或者 @Resource 進(jìn)行userDao的注入
用于創(chuàng)建對(duì)象的注解:他們的作用都是一樣的,如在xml配置文件中,編寫一個(gè)< bean >標(biāo)簽實(shí)現(xiàn)的功能一樣的
- Component:當(dāng)不知道該類屬于軟件分層的哪一層時(shí),使用該注解,實(shí)例化Bean
+ 作用:用于把當(dāng)前類對(duì)象存入Spring容器中
* 屬性:value:用于指定bean的id,不寫,默認(rèn)是當(dāng)前類名,首字母小寫 - Controller 使用在web層類上
- Service 使用在Service層上
- Repository 使用在Dao層上
- 上述三個(gè)注解作用和屬性與 Component 是一模一樣的,是Spring框架提供明確的三層使用注解,使三層架構(gòu)更加清晰
用于注入對(duì)象的注解:作用和xml配置文件中的bean標(biāo)簽中寫一個(gè)property標(biāo)簽作用一樣的
- Autowired :
* 作用:自動(dòng)按照類型注入,按照被標(biāo)注的成員變量的數(shù)據(jù)類型在Spring容器中進(jìn)行匹配,如果找到一樣的,就把對(duì)應(yīng)的對(duì)象賦值給被標(biāo)注的成員變量。但如果在Spring容器中存在符合要求的多個(gè)bean,這個(gè)時(shí)候會(huì)無法識(shí)別使用哪個(gè)bean。
* 出現(xiàn)位置:可以是變量上,也可以是方法上
* 細(xì)節(jié):使用注解注入時(shí),set方法可以不寫 - Qualifier:
* 作用:在按照類中注入的基礎(chǔ)上,在按照名稱注入,他給類成員注入是不能單獨(dú)使用,需和@Autowired一起使用,但是在給方法參數(shù)注入時(shí)可以
* 屬性:value:用于指定注入bean的id值 - Resource(name=“Bean的名稱”)
* 作用:name為id的值。直接按照Bean的id注入,可以獨(dú)立使用
* 屬性:name:用于指定bean的id值- 以上上個(gè)注入都只能注入其他Bean類型的數(shù)據(jù),而基本類型和String類型無法使用上述注解實(shí)現(xiàn),另外,集合類型的注入只能通過xml配置來實(shí)現(xiàn)
- Value(“value”):
* 作用:用于注入基本類型和String類型的數(shù)據(jù)
* 屬性:value:用于指定數(shù)據(jù)的值,他可以使用Spring中的SpEL(也就是Spring的el表達(dá)式)
* SpEL的寫法:${表達(dá)式}
* KaTeX parse error: Expected 'EOF', got '#' at position 20: …來取外部文件的值 * #?{}是用來取Bean的屬性值,…{jdbc.driver}") 在Spring配置文件中導(dǎo)入Properties文件后,可以通過key(jdbc.driver)獲得value值
用于改變作用范圍的注解:作用和bean標(biāo)簽中使用scope屬性功能一樣
- Scope:
* 作用:指定bean的作用范圍
* 屬性:value:指定范圍的取值,value的常用取值有prototype和singleton
和生命周期相關(guān)注解
- @PostConstruct 被標(biāo)注的成員方法,將成為對(duì)象的初始化方法
- @PreDestroy 被標(biāo)注的成員方法,將成為對(duì)象的銷毀方法
Spring常用新注解
使用原始注解不能替代Spring配置文件中全部?jī)?nèi)容,新注解可以替代如下配置:
1)非自定義的Bean的配置:例如DataSource
2)加載Properties文件的配置:<context:property-placeholder path=“classpath:xxx”/>
3)Spring注解組件掃描器配置:<context:component-scan base-package=""/>
4)引入其他xml配置文件:
針對(duì)以上4中情況,Spring提供新注解如下:Spring新注解的替代思想:使用一個(gè)類(核心配置類)替代xml核心配置文件,在類上使用注解代替原來xml文件中的標(biāo)簽。
| @Configuration | 標(biāo)注在特殊的指定類上,被標(biāo)注的類就是Spring核心配置類 |
| @ComponentScan(“包名”) | 標(biāo)注在特殊的指定類上,指定組件掃描范圍,效果等同于<context:component-scan base-package=“包名”/> |
| @Bean(“value”) | 標(biāo)注在特殊指定類中的方法上,用于”標(biāo)注“非自定的Bean,標(biāo)注方式 有些特殊:Spring會(huì)將被標(biāo)注方法的返回值存儲(chǔ)在Spring容器中。效果等同于<bean id=“dataSource” class=“com.mchange.v2.c3p0.ComboPooledDataSource”"> |
| @PropertySource | 標(biāo)注在特殊指定的類上或者其@import類上,將指定的properties文件加載進(jìn)Spring容器。寫法為@PropertySource(“classpath:xxx.properties”)。效果等同于<context:property-placeholder path=“calsspath:xxx”/> |
| @import | 標(biāo)注在特殊指定的類上,作用:將拆分出去的配置類引入到核心配置類內(nèi),寫法為:@import({xxx.class, yyy.class})。 效果上等同于 |
全注解代碼如下:
1)創(chuàng)建Spring核心配置類SpringConfiguration.java,并添加對(duì)應(yīng)注解
//被該注釋標(biāo)注后表示該類為Spring核心配置類@Configuration//指定組件掃描范圍,相當(dāng)于<context:component-scan base-package="包名"/>@ComponentScan("cs.wy")//引入拆分出去的配置類,相當(dāng)于<import resource="xxx.xml"/>@Import(DataSourceConfiguration.class)public class SpringConfiguration{}2)新建jdbc.properties文件,將數(shù)據(jù)源連接基本參數(shù)配置其中:
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mavenuser=rootpassword=1352463)創(chuàng)建Spring核心配置類拆分出去的數(shù)據(jù)源配置類DataSourceConfiguration.java,并添加相應(yīng)注解
//將Properties文件加載進(jìn)Spring容器,//相當(dāng)于<context:property-placeholder path="calsspath:xxx"/>@PropertySource("classpath:jdbc.properties")public class DataSourceConfiguration{@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${user}")private String username;@Value("${password}")private String password;@Bean("dataSource")public DataSource getDataSource() throws Exception {//創(chuàng)建數(shù)據(jù)源ComboPooledDataSource dataSource = new ComboPooledDataSource();//為數(shù)據(jù)源設(shè)置連接基本參數(shù)dataSource.setDriverClass(driver);dataSource.setJdbcUrl(url);dataSource.setUser(username);dataSource.setPassword(password);//返回創(chuàng)建好的數(shù)據(jù)源return dataSource;}}常用新注解詳解
Configuration
- 作用:指定當(dāng)前類是一個(gè)配置類
- 細(xì)節(jié):
- 當(dāng)配置類作為AnnotationConfigApplicationContext對(duì)象創(chuàng)建參數(shù)時(shí),該注解可以不寫
- @Configuration這個(gè)注解什么時(shí)候必須寫,什么時(shí)候可以省略
- 如果在AnnotationConfigApplicationContext(xxx.class)中指定了該配置文件的字節(jié)碼對(duì)象,就可以省略不寫
- 沒有指定,就要在主配置文件中要寫,掃描子配置類,那么子配置類也必須要寫
- 也可以通過@Import(JdbcConfig.class)來指定子配置類,如果使用也可以省略@Configuration
ComponentScan
- 作用:用于通過注解指定Spring在創(chuàng)建容器的時(shí)候要掃描的包
- 屬性:value:它和basePackages的作用一樣的效果等同于<context:component-scan base-package=“包名”/> |
Bean
- 作用:用于把當(dāng)前方法的返回值作為bean對(duì)象存入Spring的容器中
- 屬性:name用于指定bean的id值,當(dāng)不寫時(shí),默認(rèn)當(dāng)前方法的名稱
- 細(xì)節(jié):當(dāng)使用注解配置的時(shí)候,如果方法有參數(shù),Spring框架會(huì)去容器查找有沒有可用的bean對(duì)象,查詢方式和Autowired注解的作用一樣的
- 先按照類型去找,沒有就報(bào)錯(cuò)
- 如果有且只有一個(gè),就自動(dòng)注入
- 如果有多個(gè),會(huì)按照形參名稱去匹配,匹配成功則自動(dòng)注入
- 匹配不是還是會(huì)報(bào)錯(cuò)
- 可用使用Qualifier去指定要注入的bean的id
Import
- 作用:導(dǎo)入其他的配置類
- 屬性:value:指定其他配置類的字節(jié)碼,使用這個(gè)注解,有Import的注解類就是父類,導(dǎo)入的都是子類
PropertySource
- 作用:用于指定properties文件的位置
- 屬性:value:指定文件的路徑和名稱。
* 關(guān)鍵字:classpath,表示類路徑下
* 在Spring中如果要讀取配置文件,一般都要加classpath:關(guān)鍵字
* classpath:就是在classpath下面去找
* classpath*:就在classpath 下面所有的文件去找,包含子目錄下
總結(jié)
以上是生活随笔為你收集整理的【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SSM框架系列】Spring IoC(
- 下一篇: 【工具类】JDBCUtils,数据库连接