詳析Spring中依賴注入的三種方式
前言
平常的java開發(fā)中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調(diào)用類實例的方法,這種開發(fā)存在的問題是new的類實例不好統(tǒng)一管理,spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過spring容器幫我們new指定實例并且將實例注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉(zhuǎn)”,通俗的理解是:平常我們new一個實例,這個實例的控制權(quán)是我們程序員,而控制反轉(zhuǎn)是指new實例工作不由我們程序員來做而是交給spring容器來做。
在Spring中依賴注入有四種方式
1、set注入(通常也叫屬性注入)
2、構(gòu)造函數(shù)注入
3、接口注入(這個現(xiàn)在基本不用)
4、注解注入(@Autowire)
下面對set方法注入,構(gòu)造函數(shù)注入,以及注解注入的用法舉例說明。
1、set方法注入(屬性注入)
UserDao.java
public class UserDao{
public void inserUser(User user){
//具體邏輯省略
}
}
UserService.java
public Interface UserService{
void inserUser(User user);
}
UserServiceImpl.java
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void insertUser(User user){
userDao.insert(user);
}
}
Spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd "> <!--省略一些無關(guān)的配置書寫--> <bean id="userDao" class="UserDao"></bean> <bean id="userService" class="UserServiceImpl"> <property name="userDao" ref="userDao"> </bean> </beans>
以上就可以把userDao注入到UserServiceImpl中
2、構(gòu)造函數(shù)注入
User.java
public class User{
//為了簡便,就寫兩個屬性
private String name;
private Integer age;
//關(guān)于name,age的getter/setter方法省略
public User(String name,int age){
this.name = name;
this.age = age;
}
}
現(xiàn)在通過Spring配置文件來注入這User這個對象
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd "> <!--省略一些無關(guān)的配置書寫--> <bean id="user" class="User"> <!--構(gòu)造函數(shù)參數(shù)的下標(biāo)從0開始(避免出現(xiàn)多個構(gòu)造函數(shù)具有相同的參數(shù)個數(shù))--> <constructor-arg type="java.lang.String" index="0" value="zhangsan"/> <constructor-arg type="java.lang.Integer" index="1" value="20> </bean> </beans>
以上就可以將屬性值注入到User對象中。當(dāng)然如果想以set方法注入的例子話,其實也一樣。就是在UserServiceImpl需要構(gòu)造函數(shù),形參就是userDao了,就不需要setter方法了。
那么關(guān)于其Spring的配置文件的書寫應(yīng)該改成這樣
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd "> <!--省略一些無關(guān)的配置書寫--> <bean id="userDao" class="UserDao"></bean> <bean id="userService class="UserServiceImpl"> <!--構(gòu)造函數(shù)參數(shù)的下標(biāo)從0開始(避免出現(xiàn)多個構(gòu)造函數(shù)具有相同的參數(shù)個數(shù))--> <constructor-arg index="0" ref="userDao"> </bean> </beans>
這樣也能實現(xiàn)上面set方法注入達到的效果
3、注解注入
我沒試過在這些類上不加@Component,@Service,@Controller等直接@Autowire,是否能成功注入,不過養(yǎng)成一個比較好的編程習(xí)慣,建議在相應(yīng)的層次加上相應(yīng)的注解。如下例子中UserDao屬于Modul層,在Spring中可以用@Component注解
UserDao.java
@Component
public class UserDao{
public void inserUser(User user){
//具體邏輯省略
}
}
UserService.java
public Interface UserService{
void inserUser(User user);
}
UserServiceImpl.java
//引入相應(yīng)的Spring包
@Service
public class UserServiceImpl implements UserService{
@Autowire
private UserDao userDao;
public void insertUser(User user){
userDao.insert(user);
}
}
Spring對應(yīng)的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd "> <!--省略一些無關(guān)的配置書寫--> <!--*代表對所有的包進行掃描,在實際開發(fā)中可以根據(jù)涉及到注解組件的包進行掃描--> <context:component-scan base-package="*"> <!-- 開啟組件掃描 --> </context:component-scan> <context:annotation-config> <!--開啟注解處理器--> </context:annotation-config> <bean id="userDao" class="UserDao"></bean> <bean id="userService" class="UserServiceImpl"/> </beans>
不過在開發(fā)過程中既開啟了set方法注入,有開啟了注解注入的話,Spring會首選set注入的,所以不忘了提供相應(yīng)的set方法的,否則會出現(xiàn)失敗。
通過比較,注解注入要比其余注入要方便的多,代碼和配置文件也寫的少,在開發(fā)的過程中還是建議使用注解注入。
總結(jié)
以上就是關(guān)于Spring中依賴注入的幾種方式的全部介紹,希望能對大家的學(xué)習(xí)或者工作帶來一定的幫助,如果有疑問大家也可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
詳解Idea 2019.2 安裝lombok插件失效問題解決
這篇文章主要介紹了詳解Idea 2019.2 安裝lombok插件失效問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
IDEA下使用Spring Boot熱加載的實現(xiàn)
本文主要介紹了IDEA下使用Spring Boot熱加載的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
短網(wǎng)址的原理與生成方法(Java實現(xiàn))
這篇文章主要給大家介紹了關(guān)于短網(wǎng)址的原理與生成方法,利用的是Java實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
使用springboot aop記錄接口請求的參數(shù)及響應(yīng)
該文章介紹了如何使用SpringAOP的切面注解,如@Before和@AfterReturning,來記錄Controller層的方法輸入?yún)?shù)和響應(yīng)結(jié)果,還討論了@Around注解的靈活性,允許在方法執(zhí)行前后進行更多控制,需要的朋友可以參考下2024-05-05

