天天看點

【Spring架構精講3】一文搞懂Spring IoC注解(附實戰代碼詳解)

大家好,這裡是老K分享的全網最完整的Java系列教程。

近期的系列課程,我們都将分享Spring這個對于Java非常重要的架構。

上一期,我們就IoC控制反轉機制,動手自己實作一個類似Spring IoC容器。

【Spring架構精講2】一文搞懂IoC容器實作(附實戰代碼詳解)

其實,Spring除了通過XML文檔來配置Ioc容器,還可以通過注解來實作。

Spring的注解相當全面和實用。

是以,本期我們就來了解一下有關Spring IoC的注解有哪些。

【Spring架構精講3】一文搞懂Spring IoC注解(附實戰代碼詳解)

一、元件注解

1.1 概述

被元件注解标注的類,Spring會自動生成一個執行個體,換言之,經過元件注解标注的類,可以像xml配置中的bean一樣來使用。

這裡羅列一下元件注解:

注解 說明
@Repository 對持久層元件的聲明
@Service 對Service業務元件的聲明
@Controller 對MVC中控制層元件的聲明
@Component 對元件的通用聲明

1.2 實戰代碼

在IDEA中建立一個maven項目,然後在pom.xml檔案中注入依賴庫:

  • pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.6.RELEASE</version>
    </dependency>
</dependencies>           

pom已經是正常操作了,我們接下來寫一下xml配置:

  • applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.koder"/>
</beans>           
  • 雖然通過注解可以配置bean,但基礎的配置還是需要通過xml;
  • beans标簽裡的命名空間主要是添加了幾段關于'context' 的描述,文本來源來自Spring官網相關内容
  • 利用context标簽下component-scan變量的base-package屬性來定義掃描定義元件的範圍;

完成對xml的基礎配置,接下來我們編寫一個Dao類,示範元件注解的具體方法:

  • KoderDao.java
import org.springframework.stereotype.Repository;

@Repository("kd")
public class KoderDao {
    public KoderDao() {
        System.out.println("正在建立KoderDao" + this);
    }
}           
  • 本例中僅示範Repository元件的聲明示例,其它元件注解用法相同;
  • 通過對Repository注解傳入String變量,可以對BeanId命名;
  • 關于注解元件的beanId定義的說明:
  • 以@Repository("beanName")形式添加的注解,其BeanId名以傳入的beanName為準;
  • 以@Repository形式添加的注解,系統會通過類名的駝峰形式定義BeanId(如本例中,則是koderDao);
  • 以上,就能完成IoC容器中bean的定義;

我們生成一個Application檔案,運作看一下效果:

  • Application.java
import KoderDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        KoderDao kd = context.getBean("kd", KoderDao.class);
        System.out.println(kd);
    }
}           
  • 通過元件注解獲得的bean,其用法和xml配置的bean完全一樣。

上述代碼運作後的結果如下:

正在建立KoderDaoKoderDao@4cf4d528
KoderDao@4cf4d528           
  • 通過上述示例,可以看到,通過注解完成對bean的聲明,可以有效減少開發過程中在xml配置檔案與java檔案之間的切換,開發體驗更好。

二、依賴注入注解

2.1 概述

在xml配置的時候,我們也會遇到需要進行如下配置的情況:

<bean id="lily" class="Child">
    <property name="name" value="莉莉"/>
    <property name="apple" ref="sweetApple"/>
</bean>           
  • 名為lily的bean下有一個apple的屬性,其值是名為sweetApple的另一個bean實體。

對于上述這種要在一個bean中注入另一個bean的情況,用注解如何實作呢?

這裡就涉及依賴注入注解的概念了,常用的依賴注入注解參見下表:

注解 說明
@Autowired 按類名完成裝配注入
@Inject 同@Autowired,但标準略有不同【注釋1 關于@Autowired和@Inject的說明】
@Named 按名稱完成裝配注入
@Resource 優先按名稱,其次按類名完成裝配注入,是最靈活的注入注解

2.2 實戰代碼

我們沿用1.2中的項目,再在項目中建立KoderService檔案。

  • KoderService.java
import KoderDao;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class KoderService {

    public KoderService() {
        System.out.println("正在建立KoderService:" + this);
    }

    @Resource(name="kd")
    private KoderDao koderDao;

    public KoderDao getKoderDao() {
        return koderDao;
    }
}           
  • 本例以@Resource為例,以名稱定位bean進行裝配注入,其它3個依賴注入注解用法相似;
  • 此處的參數name中設定的名稱kd不是随意起的,需要是已存在的beanId,本例中引用的是KoderDao.java中定義的bean;

通過以上@Resouce注解,就能實作KoderDao向KoderService注入依賴的步驟。接下來我們調整一下Application.java,檢視一下效果吧

  • Application.java
import KoderService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        KoderService ks = context.getBean("koderService", KoderService.class);
        System.out.println("從Service中擷取到的Dao為:"+ks.getKoderDao());
    }
}           

運作上述代碼,獲得以下結果:

正在建立KoderDaoKoderDao@4cf4d528
正在建立KoderService:KoderService@44a3ec6b
從Service中擷取到的Dao為:KoderDao@4cf4d528           
  • 從結果可以看到,Service中的Dao就是配置時建立的Dao,都是KoderDao@4cf4d528。通過注解成功完成了依賴注入的操作。

三、中繼資料注解

在IoC注解中,還有一些注解,是用來完成對元件的屬性指派的,我們稱之為”中繼資料注解“。

詳查下表:

注解 說明 官方文檔
@Primary 當裝配注入發生bean沖突時,提高目前類型的優先級 @Primary文檔
@PostConstruct 等同于xml配置<bean>标簽中的init-method屬性 @PostConstruct文檔
@PreDestroy 等同于xml配置<bean>标簽中的destroy-method屬性 @PreDestroy文檔
@Scope 等同于xml配置<bean>标簽中的scope屬性 @Scope文檔
@Value 用于注入靜态資料 @Value文檔

以上部分内容較為基礎,可以參考之前xml配置章節的内容,或直接通過上表中提供的連結來到Spring官方文檔檢視了解。

總結

以上就是本期分享的全部内容。

内容比較多,建議你有時間的情況下,自行編寫一下,反複品評,方能加深了解,熟練掌握。

最後,如果你覺得這篇文章對你有幫助,可以選擇點贊、收藏一下。感謝。

【Spring架構精講3】一文搞懂Spring IoC注解(附實戰代碼詳解)

我是專注于開發領域的@老K玩代碼,會持續生産關于如何學習程式設計語言的優質内容。

如果你想學習Java程式設計,或者想精進你的Java程式設計能力,可以關注我。

如果你對開發、程式設計有任何疑問或者有想了解的内容,而我暫時沒有寫到的,也歡迎随時來找我聊聊。

【Spring架構精講3】一文搞懂Spring IoC注解(附實戰代碼詳解)

#頭條創作挑戰賽#