Spring創建Bean的三種方式

在Spring中,Bean是一個由Spring IoC容器創建、管理、調用的Java對象。Spring創建Bean有三種方式,它們分別是基於XML配置文件創建、基於註解創建和基於Java配置類創建。本文將從多個方面詳細闡述這三種方式。

一、創建Bean的三種方式

1.1 基於XML配置文件創建

基於XML配置文件創建Bean是最經典的方式。它的主要流程是:先通過標籤在XML配置文件中定義Bean的基本信息,如ID、Class、scope等,然後通過標籤對Bean的屬性進行初始化。例如以下示例:

   <bean id="student" class="com.example.Student">
      <property name="name" value="張三"/>
      <property name="age" value="18"/>
   </bean>

上述配置文件中定義了一個名為”student”的Bean,它的Class為”com.example.Student”,scope默認為singleton(單例),並且在初始化時會設置它的name和age屬性。

1.2 基於註解創建

基於註解創建Bean是Spring 2.5版本後引入的一種方式。通過在Java類上添加註解,告訴Spring IoC容器該類是一個Bean,同時指定Bean的ID、Class等信息。例如:

    @Component("student")
    public class Student {
        private String name;
        private int age;
        // getters and setters
    }

上述代碼中,@Component註解表示該類是一個Bean,並且指定了它的ID為”student”。Spring在掃描到該註解後,會自動註冊該Bean到IoC容器中。

1.3 基於Java配置類創建

基於Java配置類創建Bean是在Spring 3.0版本後引入的。它使用Java類代替XML配置文件,通過Java代碼的方式來創建和配置Bean。例如:

    @Configuration
    public class AppConfig {
        @Bean
        public Student student() {
            Student student = new Student();
            student.setName("張三");
            student.setAge(18);
            return student;
        }
    }

上述代碼中,@Configuration註解表示該類是一個Java配置類,@Bean註解表示要創建一個Bean,並且指定了該Bean的Class為Student。然後通過創建Student對象並設置屬性,最後返回該對象來完成Bean的創建。

二、Spring注入Bean的三種方式

2.1 Setter方法注入

Setter方法注入是指通過在Bean類中創建Setter方法,然後在XML配置文件或Java配置類中將依賴的Bean注入到改方法中進行設置。例如:

    public class Teacher {
        private Student student;
        public void setStudent(Student student) {
            this.student = student;
        }
        // other methods
    }

    <bean id="teacher" class="com.example.Teacher">
        <property name="student" ref="student"/>
    </bean>

上述代碼中,Teacher依賴於Student,通過標籤將Student注入到Teacher類的setStudent()方法中進行設置。

2.2 構造方法注入

構造方法注入是指通過在Bean類中創建構造方法,然後在XML配置文件或Java配置類中將依賴的Bean通過構造方法的參數進行設置。例如:

    public class Teacher {
        private Student student;
        public Teacher(Student student) {
            this.student = student;
        }
        // other methods
    }

    <bean id="teacher" class="com.example.Teacher">
        <constructor-arg ref="student"/>
    </bean>

上述代碼中,Teacher依賴於Student,通過標籤將Student注入到Teacher類的構造方法中進行設置。

2.3 字段注入

字段注入是指通過在Bean類中創建字段,並且在XML配置文件或Java配置類中將依賴的Bean直接注入到該字段上進行設置。例如:

    public class Teacher {
        @Autowired
        private Student student;
        // other methods
    }

    <bean id="teacher" class="com.example.Teacher"/>

上述代碼中,@Autowired註解表示要將依賴的Bean注入到該字段上,Spring IoC容器會自動將Student注入到Teacher類的student字段中進行設置。

三、Spring創建Bean的過程

Spring創建Bean的過程包括了Bean的實例化、Bean的屬性注入、Bean的初始化和Bean的銷毀過程。其中Bean的實例化是通過Java反射機制或工廠方法來創建Bean實例的;Bean的屬性注入是通過Setter方法或字段注入來設置Bean的屬性值的;Bean的初始化是通過實現InitializingBean接口或定義init-method方法來完成的;Bean的銷毀是通過實現DisposableBean接口或定義destroy-method方法來完成的。

以下是完整的創建Bean的過程代碼示例:

public class Student implements InitializingBean, DisposableBean {
    private String name;
    private int age;

    public Student() {
        System.out.println("Bean實例化");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("Setter方法注入");
    }

    public void setAge(int age) {
        this.age = age;
        System.out.println("Setter方法注入");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("Bean初始化");
    }

    public void destroy() throws Exception {
        System.out.println("Bean銷毀");
    }

    // other methods
}

<bean id="student" class="com.example.Student" init-method="afterPropertiesSet" destroy-method="destroy">
    <property name="name" value="張三"/>
    <property name="age" value="18"/>
</bean>

上述代碼中,Bean的實例化和屬性注入放在了構造方法和Setter方法中實現,同時實現了InitializingBean接口和DisposableBean接口的方法來完成Bean的初始化和銷毀過程,並且通過init-method和destroy-method屬性指定了初始化和銷毀的方法。

四、Spring管理Bean的兩種方式

Spring管理Bean的方式有兩種,分別是單例模式和原型模式。單例模式是指在整個應用程序中只存在一個Bean實例;原型模式是指每次通過IoC容器獲取Bean實例時都會創建一個新的實例。

4.1 單例模式

單例模式是Spring默認的Bean管理方式,它保證在整個應用程序中只存在一個Bean實例。在XML配置文件或Java配置類中將Bean的scope屬性設置為singleton或省略scope屬性即可使用單例模式。例如:

<bean id="student" class="com.example.Student" scope="singleton">
    <property name="name" value="張三"/>
    <property name="age" value="18"/>
</bean>

上述代碼中,Bean的scope屬性設置為singleton,表示使用單例模式來管理Bean。

4.2 原型模式

原型模式是指每次通過IoC容器獲取Bean實例時都會創建一個新的實例。在XML配置文件或Java配置類中將Bean的scope屬性設置為prototype即可使用原型模式。例如:

<bean id="student" class="com.example.Student" scope="prototype">
    <property name="name" value="張三"/>
    <property name="age" value="18"/>
</bean>

上述代碼中,Bean的scope屬性設置為prototype,表示使用原型模式來管理Bean。

五、Spring創建Bean的方法

在Spring中,除了通過標籤、@Component註解和Java配置類來創建Bean外,還可以通過FactoryBean和BeanDefinitionRegistry接口來創建Bean。

5.1 FactoryBean創建Bean

FactoryBean是一個特殊的Bean,它可以通過用戶自定義的邏輯來創建其他Bean實例。FactoryBean接口定義了getObject()方法,該方法返回一個Object類型的Bean實例。例如:

public class MyFactoryBean implements FactoryBean<Student> {
    @Override
    public Student getObject() throws Exception {
        Student student = new Student();
        student.setName("張三");
        student.setAge(18);
        return student;
    }

    @Override
    public Class<? extends Student> getObjectType() {
        return Student.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

<bean id="myFactoryBean" class="com.example.MyFactoryBean"/>
<bean id="student" factory-bean="myFactoryBean" factory-method="getObject"/>

上述代碼中,MyFactoryBean實現了FactoryBean接口,並且通過getObject()方法來創建一個Student實例。然後在XML配置文件中,將myFactoryBean定義為Bean,並且在student Bean中使用factory-bean和factory-method屬性來指定由myFactoryBean來創建Student實例。

5.2 BeanDefinitionRegistry接口創建Bean

BeanDefinitionRegistry接口是Spring IoC容器中的一個擴展接口,它可以通過編碼方式來創建Bean定義,並註冊到IoC容器中。例如:

public class MyBeanDefinitionRegistry implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        RootBeanDefinition beanDefinition = new RootBeanDefinition(Student.class);
        beanDefinition.getPropertyValues().add("name", "張三");
        beanDefinition.getPropertyValues().add("age", 18);
        registry.registerBeanDefinition("student", beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // do nothing
    }
}

<bean class="com.example.MyBeanDefinitionRegistry"/>

上述代碼中,MyBeanDefinitionRegistry實現了BeanDefinitionRegistryPostProcessor接口,並在postProcessBeanDefinitionRegistry()方法中,通過RootBeanDefinition來創建Student實例,並且通過registerBeanDefinition()方法將該實例的Bean定義註冊到IoC容器中。

六、Spring創建對象的三種方式

在Spring中,除了創建Bean外,還可以使用三種方式來創建對象,它們是new關鍵字、Spring上下文和Spring工廠方法。

6.1 new關鍵字創建對象

使用new關鍵字創建對象是最傳統的方式,它通過Java類的構造方法來創建對象。例如:

    Student student = new Student();
    student.setName("張三");
    student.setAge(18);

上述代碼中,使用new關鍵字創建一個Student對象。

6.2 Spring上下文創建對象

使用Spring上下文創建對象是指在Spring IoC容器中獲取Bean實例,然後通過getType()方法獲取它的Class類型,並通過反射機制來創建該類的實例。例如:

    AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Student student = context.getBean("student", Student.class);

上述代碼中,通過ClassPathXmlApplicationContext()方法來創建一個Spring上下文,並通過getBean()方法來獲取名為”Student”的Bean實例,並通過Student.class類型來創建該類的實例。

6.3 Spring工廠方法創建對象

使用Spring工廠方法創建對象是指在Spring IoC容器中通過工廠方法來創建對象。例如:

public class MyFactory {
    public Student createStudent() {
        Student student = new Student();
        student.setName("張三");
        student.setAge(18);
        return student;
    }
}

<bean id="myFactory" class="com.example.MyFactory"/>
<bean id="student" factory-bean="myFactory" factory-method="createStudent"/>

上述代碼中,MyFactory類定義了一個createStudent()方法,該方法通過new關鍵字來創建Student實例,並設置它的屬性。然後再XML配置文件中,將myFactory定義為Bean,並通過factory-bean和factory-method屬性來指定由myFactory來創建Student實例。

七、Bean在Spring中

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/201108.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-06 11:30
下一篇 2024-12-06 11:30

相關推薦

  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Spring Boot 集成 Jacoco

    本文將從以下幾個方面介紹如何在 Spring Boot 中集成 Jacoco:1、Jacoco 概述;2、Spring Boot 集成 Jacoco 的配置;3、生成 Jacoco…

    編程 2025-04-29
  • Spring Boot中發GET請求參數的處理

    本文將詳細介紹如何在Spring Boot中處理GET請求參數,並給出完整的代碼示例。 一、Spring Boot的GET請求參數基礎 在Spring Boot中,處理GET請求參…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟件。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網絡應用中流…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導着程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • 如何在Spring Cloud中整合騰訊雲TSF

    本篇文章將介紹如何在Spring Cloud中整合騰訊雲TSF,並提供完整的代碼示例。 一、TSF簡介 TSF (Tencent Serverless Framework)是騰訊雲…

    編程 2025-04-29
  • 如何使用Spring Boot ElasticJob進行配置覆蓋

    本文將詳細介紹如何使用Spring Boot ElasticJob進行配置覆蓋。 一、目錄結構 我們需要準備兩個目錄,分別是“elastic-job-lite-spring-boo…

    編程 2025-04-28
  • Spring Boot中使用DTO、Controller、Service、Mapper進行開發

    本文將介紹如何在Spring Boot中使用DTO、Controller、Service、Mapper等技術進行開發。 一、DTO DTO(Data Transfer Object…

    編程 2025-04-28
  • Python三種基本輸入元素

    本文將從多個方面對於Python三種基本輸入元素進行詳細的闡述並給出代碼示例。 一、Python三種基本輸入元素解答 Python三種基本輸入元素包括命令行參數、標準輸入和文件輸入…

    編程 2025-04-28

發表回復

登錄後才能評論