iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0

當初剛學Spring的時候,看著教學大談Spring的設計概念,一直都沒有什麼感覺,直到後來真正開始看大型專案時,才慢慢了解到Spring IOC 與 DI 的概念。 因為這部分其實不太好描述,我會參考其他人的描述加上自己的體悟去說明它。

IOC (Inversion of Control) 是什麼?

IOC,中文稱作控制反轉,是Spring設計上最為核心的一點。以往整個應用程式的生命週期是由開發者所開發的程式碼定義的,開發者會根據需求建立當下所需要的服務,比方說new一個Scanner去偵測使用者的輸入等等。

那控制反轉簡單來說,就是把建立物件這一件事,交給框架去處理,而不必自己管控整個物件從宣告、分配記憶體到銷毀物件都交給Spring框架去執行,這一方面可以提升效能,一方面也讓使用者可以更專注在開發的程式碼上面。

那DI 是什麼呢? DI 就是指IOC是被實現的途徑,其實跟Spring沒啥關係,比方說以下程式:

class Student{
   private int id;
   private String name;
   private int score;
}

假設你想要引入ExamService這個物件去協助計算整學期的平均,你可以怎麼做?

  1. Attribute Injection 就是直接引入,簡單暴力
class Student{
   private int id;
   private String name;
   private int score;
   
   @Autowired
   private ExamService exam;
}
  1. Constructor Injection 透過物件的建構式去注入你想使用的服務。
class Student{
   private int id;
   private String name;
   private int score;
   private ExamService exam;
   
   @Autowired
   public Student(int id,String name,ExamService exam) {
     this.id=id;
     this.name=name;
     this.exam=exam;
   }
}

就這樣?對,就這樣。

另外,你們會注意到 @Autowired這個註解吧,這個註解是代表了它被注入的對象是一個Spring Bean 物件,而不是一般物件,這代表的是ExamService已經是由框架幫你掌控的物件,Spring會幫你在專案啟動階段時,就處理好物件的初始化。

但可以被Spring 容器管理的物件,本身必須得是一個Spring Bean。這點很重要,請筆記。以上面的例子來說,你必須將Exam物件宣告為一個Spring Bean,才能夠起作用。同時Student也必須是一個SpringBean

Spring Bean 可以是一個屬性、可以是一個方法、也可以是一個物件,用途包山包海,在此不多做贅述。至於宣告物件成為Bean的方法呢…

說到這裡,你有玩過天歲之咲稻姬嗎?也許沒有,但沒關係,這不重要。

將物件宣告為Spring Bean的方法有很多種,也根據你的Java版本不同有差異。常見的部分有

@RestController、@Service、@Repository、@Component、@Configuration、@Bean等等。

你可以根據實際商業場景宣告符合需求的註解,他們各自有不同的用途,可以去了解看看。

今天的部分就到此為止了,下周見吧。


上一篇
[DAY 7] 速通!SpringBoot的三層式架構
下一篇
[DAY 9] JDBC to Hibernate to JPA
系列文
週日時在做什麼?有沒有空?可以來寫SpringBoot嗎?15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言