文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-10-05 13:43

关注

在这里插入图片描述

👑 博主简介
   🥇 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>

注意:

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

在这里插入图片描述

注意:

3、scope属性

<bean id="bookDao" class="com.bby.dao.bookDaoImpl" scope="prototype"/>

分别获取单例模式和多例模式下的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.()

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

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();    }}

在这里插入图片描述

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

🚩 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;}

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯