autowired java_Java 基础之Autowired 是否是自动注入
Java 基礎之Autowired 是否是自動注入
相信很多人對Autowired 注解理解不深入,或者是認為此注解就是spring的自動注入。相信看完本篇文章,你會有更加不一樣的理解。
首先我們先看下什么是手動注入?在我們的spring應用程序中,定義多個類,其中某些類依賴某些類,xml中要描述類與類之間的依賴關系,這種由程序員定義,并且描述好依賴關系的用法,我們稱之為手動注入。我們看個例子:
上面我們定義了兩個類,X 依賴于 Y 類,并且我們在xml 中定義了他們的依賴關系,當我們啟動spring 應用程序時候,會發現有如下打印
hello set method ...
Process finished with exit code 0
DI(依賴注入)一共有兩種主要的方式,分別是基于構造方法的依賴注入和基于setter方法的依賴注入,不管是手動裝配還是自動裝配都是基于這兩種方式來的。@Autowired這種注入方式是上述setter方式的變體,基于反射技術,實現屬性注入。
此處,需要注意的是,如果去掉X中的Y屬性,打印是相同的。
spring官網有說明自動裝配有四種模型分表是no、bytype、byname、constructor。由于Autowired注解首先根據類型注入,所以容易讓程序員認為Autowired注解也是自動注入。其實他們不是一回事。
先給出結論,此處借用大神的一段話:依賴注入是一個過程,主要通過setter和構造方法以及一些變體的方式完成把對象依賴、或者填充上的這個過程叫做依賴注入,不管手動裝配還是自動裝配都有這個過程;而自動裝配模型是一種完成自動裝配依賴的手段體現,每一種模型都使用了不同的技術去查找和填充bean;而從spring官網上面可以看到spring只提出了4中自動裝配模型(嚴格意義上是三種、因為第一種是no,表示不使用自動裝配、使用),這四個模型分別用一個整形來表示,存在spring的beanDefinition當中,任何一個類默認是no這個裝配模型,也就是一個被注解的類默認的裝配模型是no也就是手動裝配;其中no用0來表示;bytype用2來表示;如果某個類X,假設X的bean對應的beanDefinition當中的autowireMode=2則表示這個類X的自動裝配模型為bytype;如果autowireMode=1則表示為byname裝配模型。
上面代碼基礎上增加一個類如下:
可以看到打印如下
...
2
hello set method ...
Process finished with exit code 0
如果將xml去掉,每個類上面加Component注解,如下
打印結果如上所示,可以證明Autowired的bean definition中自動注入模型為0,不屬于自動注入。
總結
以上是生活随笔為你收集整理的autowired java_Java 基础之Autowired 是否是自动注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本文件 java_简单的用java实现
- 下一篇: 汉字转16进制java_java实现汉字