當初剛學Spring的時候,看著教學大談Spring的設計概念,一直都沒有什麼感覺,直到後來真正開始看大型專案時,才慢慢了解到Spring IOC 與 DI 的概念。 因為這部分其實不太好描述,我會參考其他人的描述加上自己的體悟去說明它。
IOC,中文稱作控制反轉,是Spring設計上最為核心的一點。以往整個應用程式的生命週期是由開發者所開發的程式碼定義的,開發者會根據需求建立當下所需要的服務,比方說new一個Scanner去偵測使用者的輸入等等。
那控制反轉簡單來說,就是把建立物件這一件事,交給框架去處理,而不必自己管控整個物件從宣告、分配記憶體到銷毀物件都交給Spring框架去執行,這一方面可以提升效能,一方面也讓使用者可以更專注在開發的程式碼上面。
那DI 是什麼呢? DI 就是指IOC是被實現的途徑,其實跟Spring沒啥關係,比方說以下程式:
class Student{
private int id;
private String name;
private int score;
}
假設你想要引入ExamService這個物件去協助計算整學期的平均,你可以怎麼做?
class Student{
private int id;
private String name;
private int score;
@Autowired
private ExamService exam;
}
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等等。
你可以根據實際商業場景宣告符合需求的註解,他們各自有不同的用途,可以去了解看看。
今天的部分就到此為止了,下周見吧。