Spring實現(xiàn)對象注入的三種方法詳解
1.屬性注入
屬性注?是使? @Autowired 實現(xiàn)的,將 Service 類注?到 Controller 類中。
package com.java.demo.dao; import org.springframework.stereotype.Repository; @Repository public class UserRepository { public int add() { System.out.println("Do UserRepository add method."); return 1; } }
package com.java.demo.service; import com.java.demo.dao.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Service; @Service public class UserService { // 1. 屬性注入 @Autowired // DI(依賴注入) private UserRepository userRepository; public int add() { System.out.println("Do UserService add method."); // 傳統(tǒng)寫法 // UserRepository userRepository = new UserRepository(); // return userRepository.add(); // Spring V1.0 // ApplicationContext context = // new ClassPathXmlApplicationContext("spring-config.xml"); // UserRepository userRepository = context.getBean("userRepository",UserRepository.class); // // return userRepository.add(); // Spring V2.0 return userRepository.add(); } }
依賴注入 VS 依賴查找
-依賴查找依賴 Bean
-@Autowired 依賴注入流程:首先先根據(jù)getType(從容器中)獲取對象,如果只獲取一個,那么直接將此對象注入到當(dāng)前屬性上;如果獲取到多個對象,才會使用getName(根據(jù)名稱)進(jìn)行匹配。
問題:同類型的Bean存儲到容器多個,獲取時報錯的問題
解決方案:
1.將屬性的名字和Bean的名字對應(yīng)上。
2.使用@AutoWired+@Qualifier來篩選bean對象;
屬性注入優(yōu)缺點
優(yōu)點:使用簡單。
缺點:
a)無法注入一個不可變的變量(final修飾的變量)
b)只適用于IoC容器。
c)更容易違背單一設(shè)計原則,因為使用起來比較簡單。
2.Setter注入
package com.java.demo.service; import com.java.demo.dao.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService3 { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } public void sayHi() { System.out.println("Do UserService3 sayHi."); userRepository.add(); } }
Setter注入優(yōu)缺點
優(yōu)點:
通常Setter只set一個屬性,所以Setter注入更符合單一設(shè)計原則
缺點:
a)無法注入一個final修飾的變量;
b)Setter注入的對象可以被修改。Setter本生就是一個方法,既然是一個方法就有可能被多次調(diào)用和修改。
3.構(gòu)造方法注入(Spring 4.x之后推薦注入方式)
package com.java.demo.service; import com.java.demo.dao.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService4 { private UserRepository userRepository; @Autowired public UserService4(UserRepository userRepository) { this.userRepository = userRepository; } public void sayHi() { System.out.println("Do UserService4 sayHi."); userRepository.add(); } }
如果當(dāng)前類中存在一個構(gòu)造方法時,@Autowired可以省略。
構(gòu)造方法注入優(yōu)缺點
優(yōu)點:
a)可以注入一個final修飾的變量。
b)注入的對象不會修改,因為構(gòu)造方法只會加載一次。
c)構(gòu)造方法注入可以保證注入對象完全初始化。
d)構(gòu)造方法注入通用性更好。
缺點:
a)寫法比屬性注入復(fù)雜。
b)使用構(gòu)造方法注入,無法解決循環(huán)依賴的問題。
到此這篇關(guān)于Spring實現(xiàn)對象注入的三種方法詳解的文章就介紹到這了,更多相關(guān)Spring對象注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java高性能實體類轉(zhuǎn)換工具M(jìn)apStruct的使用教程詳解
MapStruct 是一個代碼生成器,它基于約定優(yōu)于配置的方法,極大地簡化了 Java bean 類型之間的映射實現(xiàn),本文主要介紹了MapStruct的具體使用以及如何進(jìn)行實體類轉(zhuǎn)換,感興趣的可以了解下2024-03-03spring?cloud之eureka高可用集群和服務(wù)分區(qū)解析
這篇文章主要介紹了spring?cloud之eureka高可用集群和服務(wù)分區(qū)解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03使用java實現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何使用java實現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01