spring中對象注入的三種實現方式
本文主要介紹了對象注入的實現,分享給大家,具體如下:
一,實現方式的使用
對象注入也可被稱為對象裝配,是把Bean對象獲取出來放到某個類中。
對象注入的實現方式有3種,分別為屬性注入,Setter注入和構造方法注入。
為了更好地理解對象注入的實現方式,搞個實例來具體說明:
1.0,前期準備
1,準備Service類
@Service public class StudentService { public void sayHi(){ System.out.println("do student service sayHi()"); } }
示例問題:將 Service 類注入到 Controller 類中,對象注入實現:
1.1,屬性注入
1,方式對應實現的Controller 類代碼:
@Controller public class StudentController { //注入方式:屬性注入 @Autowired private StudentService studentService; public void sayHi(){ System.out.println("do student controller sayHi()"); studentService.sayHi(); } }
2,啟動類實現代碼:
public class App { public static void main(String[] args) { //1,獲取Spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //2,得到Bean對象 StudentController studentController = applicationContext.getBean("studentController",StudentController.class); //3,使用Bean對象 studentController.sayHi(); } }
3,啟動類執(zhí)行結果:
1.2,Setter注入
1,方式對應實現的Controller 類代碼:
@Controller public class StudentController { private StudentService studentService; @Autowired public void setStudentService(StudentService studentService) { this.studentService = studentService; } public void sayHi(){ System.out.println("do student controller sayHi()"); studentService.sayHi(); } }
2,啟動類實現代碼:
public class App { public static void main(String[] args) { //1,獲取Spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //2,得到Bean對象 StudentController studentController = applicationContext.getBean("studentController",StudentController.class); //3,使用Bean對象 studentController.sayHi(); } }
3,啟動類執(zhí)行結果:
1.3,構造方法注入
1,方式對應實現的Controller 類代碼:
@Controller public class StudentController { private StudentService studentService; @Autowired public StudentController(StudentService studentService) { this.studentService = studentService; } public void sayHi(){ System.out.println("do student controller sayHi()"); studentService.sayHi(); } }
2,啟動類實現代碼:
public class App { public static void main(String[] args) { //1,獲取Spring上下文 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //2,得到Bean對象 StudentController studentController = applicationContext.getBean("studentController",StudentController.class); //3,使用Bean對象 studentController.sayHi(); } }
3,啟動類執(zhí)行結果:
二,方式的優(yōu)缺點分析
2.1,屬性注入
1,方式實現代碼:
2,方式優(yōu)點:
實現簡單,易于理解和維護
3,方式缺點:
- 不能注入不可變對象【final 修飾的變量】
- 通用性差,只適用于IoC容器,在非IoC框架中無效
- 更容易違背單一設計原則
2.2,Setter注入
1,方式實現代碼:
2,方式優(yōu)點:
符合單一設計原則【每個方法只傳遞一個對象】
3,方式缺點:
- 不能注入不可變對象【final 修飾的變量】
- 使用Setter注入的對象可能被修改
2.3,構造方法注入
1,方式實現代碼:
注意:如果只有一個構造方法,那么 @Autowired
注解可以省略。
2,方式優(yōu)點:
- 可以注入不可變對象【final 修飾的變量】
- 注入對象不會被改變【構造方法只執(zhí)行一次】
- 注入對象會完全被初始化
- 通用性更好,可在IoC容器中使用,也可在非IoC中使用
3,方式缺點:
- 不符合單一設計原則【每個方法可傳遞多個對象】
三,對象注入中的問題
3.1,@Autowired 和 @Resource
在進行類注入時,除了可以使用@Autowired
注解之外,我們還可以使用@Resource
注解進行注入。
@Autowired
和 @Resource
都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:
來源不同:
@Autowired
是 Spring 框架提供的注解,通過類型進行依賴注入。@Resource
是 JavaEE 定義的注解,通過名稱進行依賴注入。
注入方式不同:
@Autowired
默認按照類型匹配的方式進行注入,如果存在多個相同類型的實例,可以結合@Qualifier
注解來指定具體實例。@Resource
默認按照名稱匹配的方式進行注入,它支持使用name
或type
屬性來指定名稱或類型進行匹配。
支持的類型不同:
@Autowired
支持通過構造方法注入、屬性注入、Setter 注入的方式實現依賴注入。@Resource
支持通過屬性注入、Setter 注入的方式實現依賴注入,不支持構造方法注入。
應用范圍不同:
@Autowired
主要用于 Spring 框架中的組件(如 Spring Bean)的依賴注入。@Resource
是 JavaEE 規(guī)范中的注解,它可以用于依賴注入和資源的獲取,對于不依賴于 Spring 框架的應用也可以使用。
3.2,同類型多個 @Bean 報錯
當出現多個 Bean 返回同?對象類型時,程序會報錯。解決同一個類型,多個bean的解決方案有以下兩個:
1,使用 @Resource(name="")
2,搭配 @Autowired
使用 @Qualifierr(value = "")
核心總結
1,三種對象注入的實現方式以及優(yōu)缺點?
屬性注入,Setter注入和構造方法注入是在依賴注入中常用的三種方式,它們各有優(yōu)缺點:
1,屬性注入方式:其實現簡單,易于理解和維護,但是其不能注入不可變對象,只適用于IoC容器,并且違反單一設計原則的概率大。
2,Setter注入方式:其符合單一設計原則,但是其不能注入不可變對象,并且使用Setter注入的對象可能被修改。
3,構造方法注入方式:其可以注入不可變對象,注入的對象不能被改變,保證注入對象完全被初始化,并且具有通用性,但是其不符合單一設計原則。
注意:在上述的三種對象注入的實現方式中,構造方法注入是Spring推薦的注入方式。
思考:為什么構造方法可以注入不可變變量,而屬性注入和Setter注入卻不行呢?
解答:在 Java 中,被final
修飾的對象,要么直接進行賦值,要么就在構造方法中進行賦值,兩種情況必須滿足一個,否則方式報錯。
2,@Autowired 和 @Resource 注入注解的區(qū)別?
@Autowired
和 @Resource
都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:
1,來源不同:@Autowired
是 Spring 框架提供的注解,而@Resource
是 JavaEE 定義的注解。
2,注入方式不同:@Autowired
默認按照類型匹配的方式進行注入,而@Resource
默認按照名稱匹配的方式進行注入。
3,支持的類型不同:@Resource
支持通過屬性注入、Setter 注入的方式實現依賴注入,不支持構造方法注入,而@Autowired
支持。
4,應用范圍不同:@Autowired
主要用于 Spring 框架中的組件的依賴注入,而@Resource
對于不依賴于 Spring 框架的應用也可使用。
3,同類型多個 @Bean 報錯的解決方案有哪些?
解決同一個類型 @Bean 報錯的解決方案有以下兩個:
使用 @Resource(name="")
使用 @Qualifierr(value = "")
【搭配@Autowired使用】 結語
到此這篇關于spring中對象注入的三種實現方式的文章就介紹到這了,更多相關spring 對象注入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談Java中BIO、NIO和AIO的區(qū)別和應用場景
這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04