返回顶部
首页 > 资讯 > 后端开发 > JAVA >Spring | IOC技术之Bean的配置与实例化
  • 868
分享到

Spring | IOC技术之Bean的配置与实例化

springjava 2023-10-05 13:10:16 868人浏览 泡泡鱼
摘要

👑 博主简介:    🥇 Java领域新星创作者    🥇 阿里云开发者社区专家博主、星级博主、技术博主 🤝 交流社区:BoBoo

在这里插入图片描述

👑 博主简介
   🥇 Java领域新星创作者
   🥇 阿里云开发者社区专家博主、星级博主、技术博主
🤝 交流社区BoBooY(优质编程学习笔记社区)

文章目录

Bean的基础配置

1、id 与 class属性

<bean id="" class=""/><bean id="bookDao" class="com.bby.dao.bookDaoImpl"/><bean id="bookDao" class="com.bby.dao.bookDaoImpl">bean>
  • id: bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
  • class: bean的类型,即配置的bean的全路径类名

注意:

  • class属性不能写接口如BookDao的类全名(因为接口是没办法创建对象的

  • id必须唯一,如果因为命名习惯产生分歧解决办法是设置name属性,也就是给Bean取别名

2、name属性

定义bean的别名,可定义多个,使用**逗号(,) 分号(😉 空格()**分隔

<bean id="bookDao" name="dao bookDaoImpl" class="com.bby.dao.bookDaoImpl"/><bean id="bookDao" name="dao,bookDaoImpl" class="com.bby.dao.bookDaoImpl"/><bean id="bookDao" name="dao;bookDaoImpl" class="com.bby.dao.bookDaoImpl"/>
  1. 这里我设置了两个别名daobookDaoImpl

在这里插入图片描述

  1. 获取这个Bean并调用它的方法
public class App {    public static void main(String[] args) {        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");        BookDao dao = (BookDao)applicationContext.getBean("dao");        BookDao bookDaoImpl = (BookDao)applicationContext.getBean("bookDaoImpl");        dao.save();        bookDaoImpl.save();    }}
  1. 查看控制台结果

可以看到通过这个两个别名都可以获取到这个Bean

在这里插入图片描述

注意:

  • bean依赖注入的 ref 属性指定bean,必须在容器中存在,ref的属性值,也可也是另一个bean的name属性值,不过还是建议使用其id来进行注入

  • 如果id不存在,在获取时会获取不到,然后就会报错:NoSuchBeanDefinitionException

3、scope属性

  • singleton:单例(默认)
  • prototype:非单例
<bean id="bookDao" class="com.bby.dao.bookDaoImpl" scope="prototype"/>

分别获取单例模式和多例模式下的bean

  • 单例模式如下(singleton):

在这里插入图片描述

  • 非单例模式如下(prototype):

在这里插入图片描述


思考:

  • 为什么bean默认为单例?
    • bean为单例的意思是在springioc容器中只会有该类的一个对象
    • bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
  • bean在容器中是单例的,会不会产生线程安全问题?
    • 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,
    • 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
    • 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,
    • 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
  • 哪些bean对象适合交给容器进行管理?
    • 表现层对象
    • 业务层对象
    • 数据层对象
    • 工具对象
  • 哪些bean对象不适合交给容器进行管理?
    • 封装实例的域对象,因为会引发线程安全问题,所以不适合。

Bean的实例化

bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。

1、构造方法实例化

这里先说结论:Spring底层通过反射访问的类的无参构造方法来实例化Bean

验证:

  1. bookDaoImpl添加一个无参构造方法,并打印一句话,方便观察结果。
public class BookDaoImpl implements BookDao {    public BookDaoImpl() {        System.out.println("book dao constructor is running ....");    }    public void save() {        System.out.println("book dao save ...");    }}

查看控制台结果:

在这里插入图片描述

从这里可以看出:Spring容器在创建对象的时候也走的是构造函数

  1. 将构造函数改成private测试
public class BookDaoImpl implements BookDao {    private BookDaoImpl() {        System.out.println("book dao constructor is running ....");    }    public void save() {        System.out.println("book dao save ...");    }}

查看控制台结果:

在这里插入图片描述

从这里可以看出:Spring内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见Spring底层用的是反射

  1. 使用带参构造方法测试
public class BookDaoImpl implements BookDao {    private BookDaoImpl(int a) {        System.out.println("book dao constructor is running ....");    }    public void save() {        System.out.println("book dao save ...");    }}

查看控制台结果:

在这里插入图片描述

程序会报错,说明Spring底层使用的是类的无参构造方法。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.bby.dao.BookDaoImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.bby.dao.BookDaoImpl.()

译:()指定是类的构造方法,即该类的无参构造方法

  • Caused by: 引发
  • BeanInstantiationException:翻译bean实例化异常
  • No default constructor found:没有一个默认的构造函数被发现

2、静态工厂实例化

  1. 准备一个OrderDao和OrderDaoImpl类

    public interface OrderDao {    public void save();}
    public class OrderDaoImpl implements OrderDao {    public void save() {        System.out.println("order dao save ...");    }}
  2. 创建一个工厂类OrderDaoFactory并提供一个静态方法

    //工厂类public class OrderDaoFactory {    public static OrderDao getOrderDao(){        return new OrderDaoImpl();    }}
  3. 在spring的配置文件applicationContext.xml中添加以下内容

    <bean id="orderDao" class="com.bby.factory.OrderDaoFactory" factory-method="getOrderDao"/>
    • class:工厂类的类全名
    • factory-mehod:具体工厂类中创建对象的方法名
  4. 获取Bean测试

    public class App {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");        orderDao.save();    }}

在这里插入图片描述

3、实例工厂实例化

  1. 创建一个工厂类OrderDaoFactory2并提供一个普通方法,注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法

    //实例工厂public class OrderDaoFactory2 {    public OrderDao getOrderDao(){        return new OrderDaoImpl();    }}
  2. 在spring的配置文件中添加以下内容

    <bean id="orderDaoFactory2" class="com.bby.factory.OrderDaoFactory2"/><bean id="orderDao" factory-method="getOrderDao" factory-bean="orderDaoFactory2"/>
    • factory-bean:工厂的实例对象

    • factory-method:工厂对象中的具体创建对象的方法名

  3. 获取Bean进行测试

    public class App {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao2");        orderDao.save();    }}

在这里插入图片描述

实例化工厂运行的顺序是:

  • 创建实例化工厂对象,对应的是第一行配置

  • 调用对象中的方法来创建bean

🚩 FactoryBean的使用

实例工厂实例化的方式配置的过程还是比较复杂,所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发

  1. 创建一个OrderDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法

    public class OrderDaoFactoryBean implements FactoryBean<OrderDao> {    //代替原始实例工厂中创建对象的方法    public OrderDao getObject() throws Exception {        return new OrderDaoImpl();    }    //返回所创建类的Class对象    public Class<?> getObjectType() {        return OrderDao.class;    }}
  2. 在Spring的配置文件中进行配置

    <bean id="orderDao" class="com.bby.factory.OrderDaoFactoryBean"/>
  3. 获取Bean进行测试

在这里插入图片描述


查看源码会发现,FactoryBean接口其实会有三个方法,分别是:

T getObject() throws Exception;Class<?> getObjectType();default boolean isSingleton() {return true;}
  • getObject():被重写后,在方法中进行对象的创建并返回
  • getObjectType():被重写后,主要返回的是被创建类的Class对象
  • isSingleton:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默认true

尾言:创作不易,如果本文的内容对您有帮助,还望客官可以支持一下博主,👍(点赞)+✏️(评论)+⭐️(收藏)是我创作的巨大动力!

来源地址:https://blog.csdn.net/qq_58233406/article/details/128124913

--结束END--

本文标题: Spring | IOC技术之Bean的配置与实例化

本文链接: https://lsjlt.com/news/423733.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring | IOC技术之Bean的配置与实例化
    👑 博主简介:    🥇 Java领域新星创作者    🥇 阿里云开发者社区专家博主、星级博主、技术博主 🤝 交流社区:BoBoo...
    99+
    2023-10-05
    spring java
  • Spring Bean的配置与实例化怎么实现
    这篇文章主要介绍“Spring Bean的配置与实例化怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean的配置与实例化怎么实现”文章能帮助大家解决问题。...
    99+
    2023-07-02
  • 详解Spring Bean的配置方式与实例化
    目录一、 Spring Bean 配置方式配置文件开发注解开发二、Spring Bean实例化环境准备构造方法实例化Bean静态工厂实例化Bean实例工厂实例化BeanFactory...
    99+
    2024-04-02
  • Spring Bean中Bean的实例化分析
    这篇文章主要介绍了Spring Bean中Bean的实例化分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Bean中Bean的实例化分析文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-29
  • Java之Spring注解配置bean实例代码解析
    前面几篇均是使用xml配置bean,如果有上百个bean,这是不可想象的。故而,请使用注解配置bean !!!【1】注解类别@Component : 基本注解, 标识了一个受 Spring(点击这里可以下载《Spring应用开发完全手册》)...
    99+
    2023-05-31
    java spring bean
  • Java Spring-IOC容器与Bean管理之基于注解的方式案例详解
    Spring-IOC容器-Bean管理-基于注解方式 什么是注解? (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…) (2)使用注解,注解作用在类...
    99+
    2024-04-02
  • Spring源码解析Bean的实例化
    目录前言准备工作实例化bean1、AbstractBeanFactory 的 doGetBean方法2、AbstractAutowireCapableBeanFactory 的 cr...
    99+
    2024-04-02
  • Spring配置使用之Bean生命周期的示例分析
    这篇文章主要介绍了Spring配置使用之Bean生命周期的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基本概念Spring 中的 Bean 的生命周期,指的是 Be...
    99+
    2023-05-31
    spring bean
  • spring IOC容器的Bean管理XML自动装配怎么实现
    这篇文章主要讲解了“spring IOC容器的Bean管理XML自动装配怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring IOC容器的Bean管理XML...
    99+
    2023-06-30
  • 【Spring(四)】万字详解bean的实例化
    文章目录 前言1.bean实例化1.1 bean的基础配置1.2 bean的实例化-构造方法1.3 bean的实例化-静态工厂1.4 bean的实例化-实例工厂与FactoryBean 总结 前言   在上篇文章,我们已...
    99+
    2023-08-20
    spring java 后端
  • Spring实例化bean的方式有哪些
    这篇文章主要介绍了Spring实例化bean的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring实例化bean的方式有哪些文章都会有所收获,下面我们一起来看看吧。一、bean实例化&m...
    99+
    2023-07-02
  • Spring IOC容器Bean管理的完全注解开发放弃配置文件
    目录IOC容器基于Bean管理的完全注解开发放弃配置文件创建配置类测试一下IOC容器基于Bean管理的完全注解开发放弃配置文件 通过注解的方式,我们不需要在xml配置文件里进行各种注...
    99+
    2024-04-02
  • Spring Bean的实例化之属性注入源码剖析过程
    前言 这一章节我们来讨论创建Bean过程中的属性注入,在Spring的IOC容器启动过程中,会把定义的Bean封装成BeanDefinition注册到一个ConcurrentHash...
    99+
    2024-04-02
  • 在spring中实例化bean无效的问题
    目录spring中实例化bean无效Action中代码如下applicationContext.xml中配置如下spring实例化bean顺序问题,导致注入失败问题如下原因解决spr...
    99+
    2024-04-02
  • Spring实例化bean的四种方式详解
    目录一、bean实例化——构造方法(常用)二、bean实例化——静态工厂(了解)三、bean实例化——实例工厂...
    99+
    2024-04-02
  • Spring中实例化bean的方式有哪些
    这篇文章主要为大家展示了“Spring中实例化bean的方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring中实例化bean的方式有哪些”这篇文章吧。前言在介绍Bean的实例化的...
    99+
    2023-05-30
  • spring中bean实例化的三种方式 -- Spring入门(二)
    文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了...
    99+
    2023-08-19
    spring java 后端
  • Spring IOC容器基于XML外部属性文件的Bean管理怎么配置
    本篇内容主要讲解“Spring IOC容器基于XML外部属性文件的Bean管理怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring IOC容器基于XML外部属性...
    99+
    2023-06-30
  • Spring中Bean的三种实例化方式详解
    目录一、环境准备二、构造方法实例化三、分析Spring的错误信息四、静态工厂实例化4.1 工厂方式创建bean4.2 静态工厂实例化五、实例工厂与FactoryBean5.1 环境准...
    99+
    2024-04-02
  • 详解Spring中bean实例化的三种方式
    今天我想来说说如何通过xml配置来实例化bean,其实也很简单。 使用xml配置来实例化bean共分为三种方式,分别是普通构造方法创建、静态工厂创建、实例工厂创建,OK,那么接下来我们来分别看看这几种方式。普通构造方法创建这种创建方式使我们...
    99+
    2023-05-31
    实例化 spring bean
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作