转自:
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
来源:https://www.cnblogs.com/java265/p/16445046.html
本站部分图文来源于网络,如有侵权请联系删除。