首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 依賴注入三大方式深度解析

     編輯:Java 相關知識

什麼是依賴注入 (DI)?

傳統開發中,類內部 new 依賴對象,耦合度高且難管理。Spring IOC 容器接管對象創建與生命週期,將依賴「注入」到需要的類中,實現控制反轉 (IoC)。

四種注入方式

  1. Setter 注入 (屬性注入)
  2. 構造器注入
  3. 接口注入 (已淘汰)
  4. 註解注入 (@Autowired) - 現代主流

1. Setter 注入

Service 類

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    
    // 必須提供 setter
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    
    public void insertUser(User user) {
        userDao.insert(user);
    }
}

XML 配置

<bean id="userDao" class="UserDao" />
<bean id="userService" class="UserServiceImpl">
    <property name="userDao" ref="userDao" />
</bean>

2. 構造器注入

實體類

public class User {
    private String name;
    private Integer age;
    
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // getter/setter 省略
}

XML 配置

<bean id="user" class="User">
    <constructor-arg index="0" value="zhangsan" />
    <constructor-arg index="1" value="20" />
</bean>

引用類型依賴同理:

<bean id="userService" class="UserServiceImpl">
    <constructor-arg index="0" ref="userDao" />
</bean>

3. 註解注入 (推薦)

組件掃描配置

<context:component-scan base-package="com.example" />
<context:annotation-config />

代碼實現

@Component  // 或 @Repository
public class UserDao { ... }

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;  // 無需 setter
    
    public void insertUser(User user) {
        userDao.insert(user);
    }
}

優先級與最佳實踐

  • 同啟用 Setter 和 @Autowired 時,Spring 優先使用 Setter 注入
  • 建議統一使用構造器注入 + @Autowired (Spring 4.3+ 單構造器可省略 @Autowired)
  • 強制依賴用構造器,可選依賴用 @Autowired(required=false) 或 @Nullable
  • 避免循環依賴:重構設計或使用 @Lazy

總結

註解注入代碼最簡潔,構造器注入保證不可變性與強依賴,Setter 注入適合可選依賴。現代 Spring 專案推薦構造器注入為主,註解輔助的混合模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved