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

Spring 依賴注入詳解:構造器與 Setter 注入實戰

     編輯:Java 相關知識

IoC 兩大注入方式

Spring 依賴注入(DI)核心由 BeanFactory 管理組件及依賴關係。注入方式主要有二:

  • 構造器注入:透過建構子傳入依賴,確保物件創建時即擁有完整依賴,適合強制依賴。
  • Setter 注入:透過 setter 方法注入,靈活支援可選依賴與重新配置。

實戰案例:學生-課程服務

領域模型與介面

public interface StudentService {
    Student getStudent(String id);
    void createStudent(Student stu);
    Set getCompletedCourses(Student stu);
}

public interface CourseService {
    Course getCourse(String id);
    void createCourse(Course course);
    Set getAllCourses();
    void enrollStudentInCourse(Course course, Student stu) throws CourseException;
}

實現類與依賴關係

public class StudentServiceImpl implements StudentService {
    private StudentDao stuDao;
    // 構造器注入
    public StudentServiceImpl(StudentDao sDao) { this.stuDao = sDao; }
    // Setter 注入
    public void setStudentDao(StudentDao sDao) { this.stuDao = sDao; }
    // ... 方法委托 stuDao
}

public class CourseServiceImpl implements CourseService {
    private CourseDao courseDao;
    private StudentService studentService;
    private int maxStudents;

    // 構造器注入核心依賴
    public CourseServiceImpl(CourseDao courDao) { this.courseDao = courDao; }
    // Setter 注入輔助依賴
    public void setStudentService(StudentService stuService) { this.studentService = stuService; }
    public void setMaxStudents(int maxStudents) { this.maxStudents = maxStudents; }
    // ... 業務邏輯
}

XML 裝配完整示範

基礎 Bean 定義

<beans>
    <bean id="studentDao" class="com.springinaction.service.training.StudentDaoImpl"/>
    <bean id="courseDao" class="com.springinaction.service.training.CourseDaoImpl"/>
</beans>

單例與原型

預設 singleton="true",容器僅維護單一實例。若需每次獲取新實例,設 singleton="false"(謹慎使用,避免資源耗盡)。

Setter 注入屬性與引用

<bean id="courseService" class="com.springinaction.service.training.CourseServiceImpl">
    <property name="maxStudents"><value>30</value></property>
    <property name="studentService">
        <ref bean="studentService"/>
    </property>
</bean>

<bean id="studentService" class="com.springinaction.service.training.StudentServiceImpl">
    <constructor-arg ref="studentDao"/>
</bean>

內部 Bean、集合注入、構造器注入進階

  • 內部 Bean:<property><bean class="..."/></property>,但無法重用。
  • 集合:<list>、<set>、<map>、<props> 支援值與 Bean 引用混合。
  • 構造器參數索引/類型消歧義:使用 index 或 type 屬性精確匹配多參建構子。

容器選擇指南

  • XMLBeanFactory:簡單,從 InputStream 載入。
  • ClassPathXmlApplicationContext:從類路徑載入,常用於獨立應用。
  • FileSystemXmlApplicationContext:從文件系統載入。
  • XmlWebApplicationContext:Web 環境專用。

總結

Spring DI 以 BeanFactory 為核心,支援構造器與 Setter 靈活組合,配合豐富的 XML 裝配語法,實現組件鬆耦合、易測試、易配置的企業級應用基石。

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