当前位置: 首页 > news >正文

Spring中Bean的四种实例化方法

Bean的四种实例化方法

Bean是Spring核心的概念,另外一个核心的概念是AOP。官网上,Bean的解释是:

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
翻译:
在Spring中,构建应用程序主干并且由Spring IoC容器管理的对象被称为beans,bean是一个由Spring容器实例化,组装和管理的对象。

本文是在学习B站up主动力学习Spring课程后总结得出的,主要关注Spring中Bean的实例化部分,主要介绍的就是它的四种实例化方法。

1.通过构造方法实例化

默认情况下,会调用Bean的无参数构造方法。
首先定义一个带构造方法的类。

public class User {
    public User() {
        System.out.println("User类的无参数构造方法执行。");
    }
}

然后在Spring的XML配置文件中定义好该类型的bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
       
    <bean id="userBean" class="com.powernode.spring6.bean.User"/>
</beans>

最后就能加载XML配置文件初始化Bean了,注意,该bean对象的实例化是在加载XML配置文件时就实例化完成了。后续只是获取该实例化好的对象。

public class SpringInstantiationTest {

    @Test
    public void testConstructor(){
    	//该Bean对象在这里就实例化完成
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        //这里只是获取该Bean
        User user = applicationContext.getBean("userBean", User.class);
        System.out.println(user);
    }
}

运行结果:
在这里插入图片描述

2.通过简单工厂模式实例化

第一步:定义一个不带构造方法的Bean:

public class Vip {
}

第二步:定义简单工厂方法中的工厂类

public class VipFactory {
	//注意简单工厂方法定义的是静态方法,方便直接被调用。
    public static Vip get(){
        return new Vip();
    }
}

第三步:在Spring配置文件中创建该Bean方法,使用factory-method属性指定方法

<bean id="vipBean" class="com.powernode.spring6.bean.VipFactory" factory-method="get"/>

最后就可以通过加载Spring的XML配置文件获取该bean对象。

@Test
public void testSimpleFactory(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    Vip vip = applicationContext.getBean("vipBean", Vip.class);
    System.out.println(vip);
}

3.通过factory-bean实例化

这种方式本质上是通过工厂方法模式来实例化。
第一步:定义一个Bean

public class Order {
}

第二步:定义具体工厂类,工厂类中定义实例方法。

public class OrderFactory {
    public Order get(){
        return new Order();
    }
}

第三步:要使用工厂类来获取目标bean,因为工厂类是具体类,所以要使用其中的方法就要先有该类的实例对象,这里就先将该工厂类定义成一个Bean,再通过调用其中的方法获取目标Order这个Bean出来。下面是Spring的XML配置文件。

<bean id="orderFactory" class="com.powernode.spring6.bean.OrderFactory"/>
<bean id="orderBean" factory-bean="orderFactory" factory-method="get"/>

最后测试:

@Test
public void testSelfFactoryBean(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    Order orderBean = applicationContext.getBean("orderBean", Order.class);
    System.out.println(orderBean);
}

4.通过FactoryBean接口实例化

以上的第三种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。
在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。
factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。
第一步:定义一个Bean

public class Person {
}

第二步:编写一个工厂方法类实现FactoryBean接口,表面该工厂是一个Bean工厂。并主要重写其中的getObject()方法,并且如果要在创建对象之前有什么逻辑需求,也就可以在这个getObject()方法返回前进行添加。

public class PersonFactoryBean implements FactoryBean<Person> {

    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        // true表示单例
        // false表示原型
        return true;
    }
}

第三步:这时,就只要在Spring XML配置文件中配置一个FactoryBean就好了。Spring会自动识别出它实现了FactoryBean接口,并调用其中的getObject方法。

<bean id="personBean" class="com.powernode.spring6.bean.PersonFactoryBean"/>

以上,就是Bean的四种实例化方式,感谢“动力节点”的教学。

相关文章:

  • 对称加密算法——IDEA加密算法
  • C# ConcurrentBag 使用详解
  • Spring Boot实战:拦截器
  • 高效执行自动化用例:分布式执行工具pytest-xdist实战!
  • oracle序列每天重置
  • Java 设计模式总结
  • 用 WOW.js 和 animate.css 实现动画效果
  • tomcat 使用域名访问失败
  • 项目一 - 任务1:了解Java编程语言
  • AUTO TECH China 2025 广州国际汽车技术展览会:引领汽车科技新潮流
  • 【WPS+VBA】表格中重复表头与页码的批量删除
  • mybatis存储过程返回list
  • DeepSeek系统架构的逐层分类拆解分析,从底层基础设施到用户端分发全链路
  • 芝加哥学派(Chicago School):金融与经济学的创新力量(中英双语)
  • 【LangChain实践开发】如何对大模型I/O封装?
  • 2026考研趋势深度解析:政策变化+高效工具指南
  • 利用SkinMagic美化MFC应用界面
  • Python网络运维自动化:从零开始学习NetDevOps
  • 深入理解正则表达式的预查
  • 数据融合的经典模型:早期融合、中期融合与后期融合的对比
  • 万达电影:股东杭州臻希拟减持不超1.3927%公司股份
  • 我国外汇储备规模连续17个月稳定在3.2万亿美元以上
  • 债券市场“科技板”来了:哪些机构能尝鲜,重点支持哪些领域
  • 李云泽:大型保险集团资本补充已经提上日程
  • 李云泽:将加快出台与房地产发展新模式相适配的系列融资制度
  • 博裕基金拟收购“全球店王”北京SKP最多45%股权