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/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

发表回复

登录后才能评论