日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发

發(fā)布時間:2025/5/22 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Spring注解開發(fā)

Spring是輕代碼重配置的框架,配置比較繁重,會影響開發(fā)效率。這個時候可以通過注解開發(fā),注解代替xml配置文件可以簡化配置,提高開發(fā)效率。

Spring原始注解

注解分為原始注解和新注解,主要是從邏輯上分的,并沒有實際的影響。
原始注解出現(xiàn)的比較早,主要用來替代標(biāo)簽配置的。

注解說明
@Component使用在類上,用于實例化Bean,相當(dāng)于標(biāo)簽
@Controller使用在web層類上,用于實例化Bean。語義化的@Component
@Service使用在service層類上,用于實例化Bean。語義化的@Component
@Repository使用在dao層類上,用于實例化Bean。語義化的@Component
@Autowired使用在對象引用字段上,用于根據(jù)當(dāng)前字段類型依賴注入
@Qualifier使用在對象引用字段上,結(jié)合@Autowired一起使用,用于根據(jù)名稱進行依賴注入
@Resource使用在對象引用字段上,相當(dāng)于@Autowired+@Qualifier,按照名稱進行依賴注入
@Value使用在普通類型字段上,注入普通屬性
@Scope使用在類上,標(biāo)準(zhǔn)Bean的作用范圍
@PostConstruct使用在方法上,標(biāo)注該方法是Bean的初始化方法
@PreDestory使用在方法上,標(biāo)注該方法時Bean的銷毀方法

上述注解中比較常用的是除最后兩個之外的所有注解。

注意

使用注解進行開發(fā)時,不需要在applicationContext.xml配置各種Bean了,但是需要配置組件掃描。作用是指定哪個包及其子包下的Bean需要進行掃描,以便識別使用了注解配置的類、字段和方法。

<!--注解的組件掃描--> <context:component-scan base-package="cs.wy"/>

Spring注解開發(fā) - QuicStart

  • 在 ApplicationContext.xml中中引入context命名空間和約束文件,并添加組件掃描

  • 編寫UserDaoImpl類,并使用@Component(或者@Repository)進行標(biāo)注,告訴Spring容器實例化該類。

//該接口因為不會被配置進xml文檔,所以不需要添加注解public interface UserDao{public void save();}//@Component("userDao") 其中userDao相當(dāng)于Bean標(biāo)簽的id值@Repository("userDao") // 作用于dao層類上,用于實例化Bean。語義化的 @Component public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("save running... ...");}}
  • 使用@Compont 或 @Service 標(biāo)識UserServiceImpl需要Spring進行實例化
  • 使用@Autowired 或者 @Autowired+@Qulifier 或者 @Resource 進行userDao的注入
//@Component("userService")@Service("userService") // 使用在service層類上,用于實例化Bean。語義化的 @Componentpublic class UserServiceImpl implements UserService {/*@Autowired 使用在對象引用字段上,用于根據(jù)當(dāng)前字段類型依賴注入 * @Qualifier("userDao") 使用在對象引用字段上,結(jié)合@Autowired一起使用,用于根據(jù)名稱進行依賴注入* 其中,value相當(dāng)于Bean標(biāo)簽property子標(biāo)簽中ref的值* */ @Resource(name="userDao") // 使用在對象引用字段上,相當(dāng)于@Autowired+@Qualifier,按照名稱進行依賴注入private UserDao userDao;@Overridepublic void save() {userDao.save();}}

用于創(chuàng)建對象的注解:他們的作用都是一樣的,如在xml配置文件中,編寫一個< bean >標(biāo)簽實現(xiàn)的功能一樣的

  • Component:當(dāng)不知道該類屬于軟件分層的哪一層時,使用該注解,實例化Bean
    + 作用:用于把當(dāng)前類對象存入Spring容器中
    * 屬性:value:用于指定bean的id,不寫,默認(rèn)是當(dāng)前類名,首字母小寫
  • Controller 使用在web層類上
  • Service 使用在Service層上
  • Repository 使用在Dao層上
  • 上述三個注解作用和屬性與 Component 是一模一樣的,是Spring框架提供明確的三層使用注解,使三層架構(gòu)更加清晰

用于注入對象的注解:作用和xml配置文件中的bean標(biāo)簽中寫一個property標(biāo)簽作用一樣的

  • Autowired :
    * 作用:自動按照類型注入,按照被標(biāo)注的成員變量的數(shù)據(jù)類型在Spring容器中進行匹配,如果找到一樣的,就把對應(yīng)的對象賦值給被標(biāo)注的成員變量。但如果在Spring容器中存在符合要求的多個bean,這個時候會無法識別使用哪個bean。
    * 出現(xiàn)位置:可以是變量上,也可以是方法上
    * 細(xì)節(jié):使用注解注入時,set方法可以不寫
  • Qualifier:
    * 作用:在按照類中注入的基礎(chǔ)上,在按照名稱注入,他給類成員注入是不能單獨使用,需和@Autowired一起使用,但是在給方法參數(shù)注入時可以
    * 屬性:value:用于指定注入bean的id值
  • Resource(name=“Bean的名稱”)
    * 作用:name為id的值。直接按照Bean的id注入,可以獨立使用
    * 屬性:name:用于指定bean的id值
    • 以上上個注入都只能注入其他Bean類型的數(shù)據(jù),而基本類型和String類型無法使用上述注解實現(xiàn),另外,集合類型的注入只能通過xml配置來實現(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)注的成員方法,將成為對象的初始化方法
  • @PreDestroy 被標(biāo)注的成員方法,將成為對象的銷毀方法

Spring常用新注解

使用原始注解不能替代Spring配置文件中全部內(nèi)容,新注解可以替代如下配置:
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文件中的標(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會將被標(biāo)注方法的返回值存儲在Spring容器中。效果等同于<bean id=“dataSource” class=“com.mchange.v2.c3p0.ComboPooledDataSource”">
@PropertySource標(biāo)注在特殊指定的類上或者其@import類上,將指定的properties文件加載進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,并添加對應(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=135246

3)創(chuàng)建Spring核心配置類拆分出去的數(shù)據(jù)源配置類DataSourceConfiguration.java,并添加相應(yīng)注解

//將Properties文件加載進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)前類是一個配置類
  • 細(xì)節(jié):
    • 當(dāng)配置類作為AnnotationConfigApplicationContext對象創(chuàng)建參數(shù)時,該注解可以不寫
    • @Configuration這個注解什么時候必須寫,什么時候可以省略
    • 如果在AnnotationConfigApplicationContext(xxx.class)中指定了該配置文件的字節(jié)碼對象,就可以省略不寫
    • 沒有指定,就要在主配置文件中要寫,掃描子配置類,那么子配置類也必須要寫
    • 也可以通過@Import(JdbcConfig.class)來指定子配置類,如果使用也可以省略@Configuration

ComponentScan

  • 作用:用于通過注解指定Spring在創(chuàng)建容器的時候要掃描的包
  • 屬性:value:它和basePackages的作用一樣的效果等同于<context:component-scan base-package=“包名”/> |

Bean

  • 作用:用于把當(dāng)前方法的返回值作為bean對象存入Spring的容器中
  • 屬性:name用于指定bean的id值,當(dāng)不寫時,默認(rèn)當(dāng)前方法的名稱
  • 細(xì)節(jié):當(dāng)使用注解配置的時候,如果方法有參數(shù),Spring框架會去容器查找有沒有可用的bean對象,查詢方式和Autowired注解的作用一樣的
    • 先按照類型去找,沒有就報錯
    • 如果有且只有一個,就自動注入
    • 如果有多個,會按照形參名稱去匹配,匹配成功則自動注入
    • 匹配不是還是會報錯
    • 可用使用Qualifier去指定要注入的bean的id

Import

  • 作用:導(dǎo)入其他的配置類
  • 屬性:value:指定其他配置類的字節(jié)碼,使用這個注解,有Import的注解類就是父類,導(dǎo)入的都是子類

PropertySource

  • 作用:用于指定properties文件的位置
  • 屬性:value:指定文件的路徑和名稱。
    * 關(guān)鍵字:classpath,表示類路徑下
    * 在Spring中如果要讀取配置文件,一般都要加classpath:關(guān)鍵字
    * classpath:就是在classpath下面去找
    * classpath*:就在classpath 下面所有的文件去找,包含子目錄下

總結(jié)

以上是生活随笔為你收集整理的【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。