Spring应用手册--FactoryBean接口
程序员文章站
2022-03-20 23:28:33
戴着假发的程序员出品 抖音ID:戴着假发的程序员欢迎关注FactoryBean接口 spring应用手册(第五部分) FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。BeanFactory是Spring容器中的一个基本类也是很重要的一个类,在BeanFactory中可以创建和管理Spring容器中的Bea...
戴着假发的程序员出品 抖音ID:戴着假发的程序员欢迎关注
FactoryBean接口
spring应用手册(第五部分)
FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。BeanFactory是Spring容器中的一个基本类也是很重要的一个类,在BeanFactory中可以创建和管理Spring容器中的Bean,它对于Bean的创建有一个统一的流程。
我们来看看源码:
/*
* Copyright 2002-2018 the original author or authors.
*/
public interface FactoryBean<T> {
/**
* 返回当前bean工厂创建的bean的实例
*/
@Nullable
T getObject() throws Exception;
/**
* 返回当前工程创建的bean的类型
*/
@Nullable
Class<?> getObjectType();
/**
* 判断当前类是否是单利模式
*/
default boolean isSingleton() {
return true;
}
}
在spring框架的底层这个创建bean的方式使用的比较多。
我们现在自己写一个案例看看它的使用方式:
我们准备一个Bean:
/**
* @author 戴着假发的程序员
* @company http://www.boxuewa.com
* @description
*/
public class Coder{
//构造方法
public Coder(){
System.out.println("实例化Coder对象");
}
}
自定一个CoderFactory实现接口FactoryBean,定义泛型为Coder。默认方法isSingleton就不实现了。
/**
* @author 戴着假发的程序员
* @company http://www.boxuewa.com
* @description
*/
public class CoderFactory implements FactoryBean<Coder> {
@Override
public Coder getObject() throws Exception {
//手动创建Coder并且返回
System.out.println("CoderFactory创建对象");
return new Coder();
}
@Override
public Class<Coder> getObjectType() {
return Coder.class;
}
}
在配置文件中进行配置,详细说明请看代码中的注释:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 使用BeanFactory方式注册Bean-->
<!-- 这里注意,我们配置的class不是Coder而是我们的CoderFactory -->
<bean id="coder" class="com.st.dk.demo10.factory.CoderFactory"/>
</beans>
这里一定要注意,我们的class配置的是CoderFactory,spring在加载这个类的时候,会自动检查这个类是不是FactoryBean,如果是则通过调用其getObject方法得到实例对象。
测试:
@Test
public void testFactoryBean(){
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext-demo10.xml");
System.out.println(ac.getBean(Coder.class));
}
这里要注意,如果我们是使用FactoryBean的方式创建对象的,那么默认情况下spring只会创建对应的Factory对象,而不会主动调用其getObject对象进行目标对象的实例化,只有当我们从容器中获取目标对象时,spring才会调用其getObject方法创建目标对象并且返回。
本文地址:https://blog.csdn.net/q2780004063/article/details/110262836