下文笔者将讲述Spring Framework中BeanFactory和FactoryBean的区别点,如下所示:
BeanFactory简介
BeanFactory是所有Spring容器的根接口
此接口为所有的Spring容器定义了一套标准(IOC容器定义了一套标准)
常见的方法如下所示:
方法名 | 备注说明 |
getBean(String name) | Spring容器中获取对应Bean对象的方法,如存在,则返回该对象 |
containsBean(String name) | Spring容器中是否存在该对象 |
isSingleton(String name) | 通过beanName是否为单例对象 |
isPrototype(String name) | 判断bean对象是否为多例对象 |
isTypeMatch(String name, ResolvableType typeToMatch) | 判断name值获取出来的bean与typeToMath是否匹配 |
getType(String name) | 获取Bean的Class类型 |
getAliases(String name) | 获取name所对应的所有的别名 |
BeanFactory常见的实现类(包括抽象类)
类名 | 备注说明 |
AbstractBeanFactory | 抽象Bean工厂,绝大部分的实现类,都是继承于它 |
DefaultlistableBeanFactory | Spring默认的工厂类 |
XmlBeanFactory | 前期使用XML配置用的比较多的时候用的Bean工厂 |
AbstractXmlApplicationContext | 抽象应用容器上下文对象 |
ClassPathXmlApplicationContext | XML解析上下文对象,用户创建Bean对象我们早期写Spring的时候用的就是它 |
BeanFactory的使用方法
运用ClassPathXmlApplicationContext读取spring的配置文件获取一个实例对应上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
BeanFactory factory = (BeanFactory) context;
FactoryBean
FactoryBean是SpringIOC容器中创建Bean的一种形式
采用FactoryBean的方式创建Spring Bean,可以减少xml的配置
FactoryBean中常见的方法
方法名 | 备注说明 |
T getObject() | 返回实例 |
Class<?> getObjectType(); | 返回该装饰对象的Bean的类型 |
default boolean isSingleton() | Bean是否为单例 |
FactoryBean中常用的类
类名 | 备注说明 |
ProxyFactoryBean | Aop代理Bean |
GsonFactoryBean | Gson |
例:
FactoryBean创建SpringBean的示例分享
Spring XML方式 application.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="demo" class="com.java265.Person">
<property name="age" value="88"/>
<property name="name" value="Java265"/>
</bean>
<bean id="demoFromFactory" class="com.java265.PersonFactoryBean">
<property name="str" value="99,init from factory"/>
</bean>
</beans>
personFactoryBean.java
package com.java265;
import com.java265.Person;
import org.springframework.beans.factory.FactoryBean;
import java.util.Objects;
public class PersonFactoryBean implements FactoryBean<Person> {
/**
* 初始化Str
*/
private String str;
@Override
public Person getObject() throws Exception {
//这里我需要获取对应参数
Objects.requireNonNull(str);
String[] split = str.split(",");
Person p=new Person();
p.setAge(Integer.parseInt(split[0]));
p.setName(split[1]);
//这里可能需要还要有其他复杂事情需要处理
return p;
}
@Override
public Class<?> getObjectType() {
return Person.class;
}
public String getInitStr() {
return str;
}
public void setInitStr(String str) {
this.str = str;
}
}
main方法
package com.java265.factory;
import com.java265.Person;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* BeanFactory 例子
*/
public class SpringBeanFactoryMain {
public static void main(String[] args) {
//这个是BeanFactory
BeanFactory beanFactory = new ClassPathXmlApplicationContext("application.xml");
//获取对应的对象化
Object demo = beanFactory.getBean("demo");
System.out.println(demo instanceof Person);
System.out.println(demo);
//获取从工厂Bean中获取对象
Person demoFromFactory = beanFactory.getBean("demoFromFactory", Person.class);
System.out.println(demoFromFactory);
//获取对应的personFactory
Object bean = beanFactory.getBean("&demoFromFactory");
//将Spring使用xml生成的bean同FactoryBean生成的Bean进行比较
System.out.println(bean instanceof PersonFactoryBean);
PersonFactoryBean factoryBean=(PersonFactoryBean) bean;
System.out.println("初始化参数为:"+factoryBean.getInitStr());
}
}
------运行以上代码,将输出以下信息-----
true
Person{name='Java265', age=88}
Person{name='init from factory', age=99}
true
初始化参数为:99,init from factory
BeanFactory同FactoryBean的区别:
BeanFactory:负责生产和管理Bean的一个工厂接口,提供Spring Ioc容器标准
FactoryBean: 一种Bean创建的一种方式,对Bean的一种扩展
可以直接使用代码的方式创建一个SpringBean