Spring 中BeanFactory和FactoryBean有什么不同之处呢?
转自:
http://www.java265.com/JavaFramework/Spring/202109/964.html
下文笔者将讲述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