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