Spring中Bean的实例化(xml)

获取Bean的实例化有三种方法,本质都是为了教给spring管理

一、直接配置Bean

创建好一个接口以及实现类后在xml配置

接下来在测试类

java 复制代码
// 初始化对象,导入的是IOC容器的配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("springContext.xml");
// 使用IOC容器对象直接提取bean,并强转使用私有方法
StudentService studentService = (StudentService) ctx.getBean("dao");
studentService.save();

二、静态(static)工厂获取实例

静态工厂:一种设计模式,一个工具类来对外提供对象,一般是单例设计模式,多次获取的都是同一个对象,其实说简单点就是带static的获取对象的方法。

先创建一个 工厂类对象

java 复制代码
public class StaticBookFactory {  
    public static BookDao getBookDao(){  
        return new BookDaoImpl();  
    }  
}

在config中

xml 复制代码
        <bean id="userDao" class="com.dongmianmao.factory.StaticBookFactory" factory-method="getBookDao"></bean>

和第一点不同的是 这里指定的不是实现类,而是工厂类

factory-method - 则是指定工厂类中对外提供对象的方法

测试类

java 复制代码
public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
    BookDao bookDao = (BookDao)applicationContext.getBean("userDao");
    bookDao.add();
}

三、实例(Instance)工厂获取

实例工厂:和静态工厂的区别就是,没有static修饰,因为没有static所以使用方式发生变化了

先创建一个实例工厂

java 复制代码
public class InstanceBookFactory {
    public BookDao getDao(){
        return new BookDaoImpl();
    }
}

此时在xml中

xml 复制代码
<bean id="instanceBookFactory" class="com.dongmianmao.factory.InstanceBookFactory"/>  
<bean id="userDao" factory-bean="instanceBookFactory" factory-method="getDao"/>

是这样理解的,我按正常逻辑拿到里面这个 getDao() 这个方法的内容,那我必须得创建 InstanceBookFactory对象,再调用 getDao 方法,这样也是按照这个流程

  1. 先将实例工厂交给IOC容器管理
  2. 指定一个Bean,里面选择 factory-bean 来指定实例工厂的id,再使用factory-method来指定实例工厂里的方法,就完成了实例工厂的调用获取对象

四、实例工厂升级版(针对实例工厂做的优化)

书写了上面的xml配置后就会发现,就只需要一个对象,还需要写两个Bean才能配置好,所以,Spring准备好了一个解决方案,来供我们解决:
只需要实现Spring提供的一个接口Spring就知道需要的不是这个对象,而是里面的方法
接口名:FactoryBean

我们现在不需要最开始的实例工厂了,而是使用实现了Spring接口的类来当做实例工厂类

先创建一个类,来实现Spring提供的接口,并在第一个方法,getObject()中,去返回原本实例工厂中需要返回的对象

java 复制代码
public class MyBeanFactory implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        return new BookDaoImpl();
    }

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

在xml中,直接去指定实现了Spring接口的类即可

xml 复制代码
<bean id="userDao" class="com.dongmianmao.factory.MyBeanFactory"/>

测试类

java 复制代码
public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
    BookDao bookDao = (BookDao)applicationContext.getBean("userDao");
    bookDao.add();
}
相关推荐
技术小泽7 分钟前
操作系统-虚拟内存篇
java·linux·性能优化·系统架构
小豪GO!34 分钟前
Java多线程初阶
java·开发语言
程序猿阿越34 分钟前
Kafka源码(四)发送消息-服务端
java·后端·源码阅读
杨杨杨大侠36 分钟前
第10篇:测试与实战 - 构建完整的示例应用
java·spring·apache log4j
码农秋37 分钟前
Java Optional 最佳实践:从入门到精通的完整指南
java·开发语言·optional
杨杨杨大侠41 分钟前
第9篇:监控与运维 - 集成Actuator健康检查
java·spring·apache log4j
AAA修煤气灶刘哥1 小时前
从 “一块巨石” 到 “搭积木”:后端 必懂的微服务全家桶(Feign+OkHttp 实战版)
java·后端·架构
技术小泽1 小时前
JVM之CMS、G1|ZGC详解以及选型对比
java·jvm·后端·算法·性能优化
AAA修煤气灶刘哥1 小时前
微服务 “迷路” 自救指南:Nacos 凭啥把 Eureka 拍在沙滩上?(附注册中心原理 + 实战)
java·后端·spring cloud
一叶飘零_sweeeet1 小时前
从 0 到 1 构建零丢失 RabbitMQ 数据同步堡垒:第三方接口数据零丢失的终极方案
java·分布式·rabbitmq