spring bean实例化的三种方法

2023-10-31


昏黄色系的街道上,并没有太多的色彩,唯有这座支在废瓦堆旁的小摊,像仙人掌上的一朵红花,点亮了整片沙漠的活力。​


前言(代码结构)

在这里插入图片描述


一、构造方法实例化bean(实用)

1.代码:

BookDaoImpl类:

package com.hewen.dao.impl;

import com.hewen.dao.BookDao;

/**
 * @author heWen
 */
public class BookDaoImpl implements BookDao {

    /**无参构造器,创建对象时必须要用,在此处代码如果运行了,就代表创建对象时运行了此代码,对于构造器的理解看看example
     公共的和私有的都可以访问,    有无都可以  1.结论:实例化bean就是用构造方法来实例化对象**/
    public BookDaoImpl() {
        System.out.println("book dao 构造器 is running ....");
    }

    @Override
    public void save() {
        System.out.println("book dao save ...");
    }

}

BookDao接口:

package com.hewen.dao;

public interface BookDao {
    public void save();
}

AppForInstanceBook:

package com.hewen;

import com.hewen.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceBook {
    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");

        bookDao.save();

    }
}

xml配置:
在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

构造方法实例化bean使用了无参构造器,可以省略无参构造器的书写。实例化bean就是用构造方法来实例化对象。


二、使用静态工厂实例化bean(了解)

1.代码

OrderDaoFactory类:

package com.hewen.factory;

import com.hewen.dao.OrderDao;
import com.hewen.dao.impl.OrderDaoImpl;

/**静态工厂创建对象
 * @author heWen*/
public class OrderDaoFactory {
    /**一个方法,返回OrderDao对象的方法*/
    public static OrderDao getOrderDao(){
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}

AppForInstanceOrder类:

package com.hewen;

import com.hewen.dao.OrderDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
//        OrderDao orderDao = OrderDaoFactory.getOrderDao();
//        orderDao.save();


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");

        orderDao.save();

    }
}

xml配置:
在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

工厂模式可以实现解耦,用于生成实例对象,所有的方法必须是static。class必须是工厂类,factory-method后接工厂类中的创建对象的方法。


三、使用实例工厂实例化bean(了解)

1.代码:

UserDaoFactory类:

package com.hewen.factory;

import com.hewen.dao.UserDao;
import com.hewen.dao.impl.UserDaoImpl;

/**
 * @author heWen
 */ //实例工厂创建对象
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

AppForInstanceUser类:

package com.hewen;

import com.hewen.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceUser {
    public static void main(String[] args) {
//        //创建实例工厂对象
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        //通过实例工厂对象创建对象
          //因为是非静态的,用工厂对象.方法  用工厂的对象调方法
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (UserDao) ctx.getBean("userDao");

        userDao.save();

    }
}

xml配置:
在这里插入图片描述

在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

比较与上一个,在UserDaoFactory类中使用了实例化的方法,先要把工厂的实例化对象造出来,再使用工厂类中的方法。


四、使用FactoryBean实例化bean(三改)(常用)

1.代码:

UserDaoFactoryBean类:

package com.hewen.factory;

import com.hewen.dao.UserDao;
import com.hewen.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;
//FactoryBean创建对象
/**FactoryBean<>,泛型中你想让它造什么对象,就填什么*/
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    /**代替原始实例工厂中创建对象的方法(UserDaoFactory中的方法)*/
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    /**这个对象是什么类型的?就是UserDao类型,就直接放入UserDao的字节码即可*/
    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }

}

AppForInstanceUser类:

package com.hewen;

import com.hewen.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceUser {
    public static void main(String[] args) {
//        //创建实例工厂对象
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        //通过实例工厂对象创建对象
          //因为是非静态的,用工厂对象.方法  用工厂的对象调方法
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (UserDao) ctx.getBean("userDao");

        userDao.save();

    }
}

xml配置:
在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

在这里插入图片描述
在方法三中配置时出现了以上的问题,于是使用方法四实现FactoryBean<>接口。同时既然造出了对象,通过以下方法查看是否单例?
在这里插入图片描述
在这里插入图片描述
由结果可得是单例。在UserDaoFactoryBean类中重写isSingleton()方法可改为非单例。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring bean实例化的三种方法 的相关文章

随机推荐

  • denied mysql permission_mysqldump --tab (ErrCode:13-Permission denied)问题解决

    在 mysql 服务器上 可以通过 load data infile file name into table table name 命令将一个文本文件中的所有数据存到指定表中 最粗略形式的例子 load data infile test
  • OpenGL之Shader编程入门

    1 shader 编程基础 1 1 Vertex shader与Fragment shader Vertex shader即顶点着色器 用来改变顶点的属性 Fragment shader即片元着色器 用来改变片元的颜色 在Direct3D中
  • AcWing 1371. 货币系统

    给定 V 种货币 单位 元 每种货币使用的次数不限 不同种类的货币 面值可能是相同的 现在 要你用这 V 种货币凑出 N元钱 请问共有多少种不同的凑法 输入格式 第一行包含两个整数 V 和 N 接下来的若干行 将一共输出 V 个整数 每个整
  • 网易易盾滑块逆向分析 js 滑动轨迹生成_1

    网易易盾无感逆向 提示 仅学习参考 如有涉及侵权联系本人删除 目标网站已做脱敏处理 aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9zZW5zZQ 文章目录 网易易盾无感逆向 加密参数 一 cb参数 二 fp参数 三
  • 笔记/Linux命令

    ls 查看当前文件夹下的内容 pwd 查看当前所在文件夹 cd 目录名 切换文件夹 touch 文件名 如果文件不存在 新建文件 mkdir 目录名 创建目录 rm f 强制删除 忽略不存在的文件 无需提示 r 递归地删除目录下的内容 删除
  • C++ 实现一个消息队列

    文章目录 前言 一 如何实现 1 接口定义 1 推送消息 2 等待消息 3 轮询消息 2 用到的对象 1 队列 2 互斥变量 3 条件变量 3 基本流程 1 线程通信 二 完整代码 三 使用示例 1 线程通信 1 等待消息 2 轮询消息 总
  • 【Twitter 舆论分析】Twitter 爬虫绕过API限制

    0x00 前言 使用API可以很简单的获取到想要的数据 但是由于国内API的申请比较困难 所以如何绕过API直接爬虫是一个迫切需要解决的问题 Github上的点击收藏量高的不限制爬虫都已经被twitter封过了 这里分享的版本是最开始写爬虫
  • 不用加减乘除做加法

    不用加减乘除做加法 写一个函数 求两个整数之和 要求在函数体内不得使用 四则运算符号 示例 输入 a 1 b 1 输出 2 5 7 5 0101 7 0111 我们可以先计算5 7 12中的如果不进位时的数字 然后再把进位加入 1 不算进位
  • select、poll、epoll函数详解

    select和poll的区别 1 select 函数 1 1 概念 1 2 描述符集 1 3 描述符就绪条件 1 3 1 读就绪条件 1 3 2 写就绪条件 1 3 3 异常就绪条件 1 4 select的最大描述符数 2 poll函数 2
  • 震惊!!!一眼就能看懂的getBoundingClientRect用法!!!

    主要介绍getBoundingClientRect的基本属性 以及具体的使用场景和一些需要注意的问题 getBoundingClientRect Element getBoundingClientRect 含义 方法返回元素的大小及其相对于
  • 95-38-025-Buffer-Buffer

    1 ByteBuf总述 引入缓冲区是为了解决速度不匹配的问题 在网络通讯中 CPU处理数据的速度大大快于网络传输数据的速度 所以引入缓冲区 将网络传输的数据放入缓冲区 累积足够的数据再送给CPU处理 1 1 拓扑图 1 2 Buffer的分
  • redis是否支持事务?

    redis是支持事务的 通过multi开启事务 通过exec提交事务 通过discard取消事务 但是redis的事务是 不支持自动回滚的 在事务中 如果执行了多条命令 有一条执行失败了 其他的命令还是正常执行
  • 【梯度下降算法】{2} ——多元线性回归中的梯度下降法

    此处分析一下多元线性回归模型中的梯度下降法 线性回归模型的损失函数 即使是对于样本特征数只有1的线性回归中 中也包含两个值 0和 1 梯度下降法的实现过程 代价函数 梯度下降法 当使用梯度下降法求代价函数函数最小值的时候 有时要对目标函数进
  • eclipse工作空间配置--------新建菜单初始项

    当我们新建new时 找不到我们所需要的新建选项每次都在other里面搜索很是麻烦 我们可以配置菜单的初始项 让新建菜单栏展示我们常用的选项 去掉不用的 下面以Folder为例子 首先查看新建菜单栏初始项发现没有Folder other查看所
  • 自定义VLC播放器 C#实现(一)

    1 Vlc DotNet Forms实现 实现方式 1 通过Nuget工具下载Vlc DotNet Forms包 2 在窗体中载入VlcControl控件 3 设置vlcControl的VlcLibDirectory属性 此属性指向 lib
  • IDEA 使用commit之后一闪而过 没有错误也没有警告

    1 选择行分隔符为CRLF 为windows的utf 8 2 在设置 代码样式 行分隔符中也如上选择 点击应用 3 在设置 文件编码中 如图这三个地方也选择utf 8 点击应用 4 重启IDEA即可 参考链接 https blog csdn
  • upload-labs靶场-Pass-05关-思路以及过程

    开始前的小准备 upload labs靶场 是PHP环境运行的 所以我准备了一个PHP脚本和一张图片 图片好准备 PHP脚本如果不想写的话可以用我的这个获取当前时间的PHP脚本 图片默认不清楚放大看 Pass 05 代码 is upload
  • CVPR 2020

    性能优于PDA MDA和SWDA等网络 作者团队 北京航空航天大学 1 引言 近年来 在基于深度学习的目标检测中见证了巨大的进步 但是 由于domain shift问题 将现成的检测器应用于未知的域会导致性能显著下降 为了解决这个问题 本文
  • Web自动化测试08:Selenium—键盘操作

    更多功能测试以及全套学习路线图均在专栏 戳进去领取 Web自动化测试01 认识web自动化在什么项目中适用 Web自动化测试02 Web自动化测试工具选择大全 Web自动化测试03 Selenium安装配置 详细教程 Web自动化测试04
  • spring bean实例化的三种方法

    文章目录 前言 代码结构 一 构造方法实例化bean 实用 1 代码 2 运行结果 3 实例化说明 二 使用静态工厂实例化bean 了解 1 代码 2 运行结果 3 实例化说明 三 使用实例工厂实例化bean 了解 1 代码 2 运行结果