Spring 中BeanFactory和FactoryBean有什么不同之处呢?

宁睿  金牌会员 | 2022-8-22 22:19:55 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 950|帖子 950|积分 2860

转自:
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工厂,绝大部分的实现类,都是继承于它
DefaultListableBeanFactorySpring默认的工厂类
XmlBeanFactory前期使用XML配置用的比较多的时候用的Bean工厂
AbstractXmlApplicationContext抽象应用容器上下文对象
ClassPathXmlApplicationContextXML解析上下文对象,用户创建Bean对象我们早期写Spring的时候用的就是它
BeanFactory的使用方法

运用ClassPathXmlApplicationContext读取spring的配置文件获取一个实例对应上下文对象
  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
  2. BeanFactory factory = (BeanFactory) context;
复制代码
FactoryBean

FactoryBean是SpringIOC容器中创建Bean的一种形式
采用FactoryBean的方式创建Spring Bean,可以减少xml的配置
FactoryBean中常见的方法

方法名备注说明
T getObject()返回实例
Class getObjectType();返回该装饰对象的Bean的类型
default boolean isSingleton()Bean是否为单例
FactoryBean中常用的类
类名备注说明
ProxyFactoryBeanAop代理Bean
GsonFactoryBeanGson
例:
FactoryBean创建SpringBean的示例分享
  1. Spring XML方式  application.xml文件
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.     <bean id="demo" >
  7.         <property name="age" value="88"/>
  8.         <property name="name" value="Java265"/>
  9.     </bean>
  10.     <bean id="demoFromFactory" >
  11.         <property name="str" value="99,init from factory"/>
  12.     </bean>
  13. </beans>
  14. personFactoryBean.java
  15. package com.java265;
  16. import com.java265.Person;
  17. import org.springframework.beans.factory.FactoryBean;
  18. import java.util.Objects;
  19. public class PersonFactoryBean implements FactoryBean<Person> {
  20.     /**
  21.      * 初始化Str
  22.      */
  23.     private String str;
  24.     @Override
  25.     public Person getObject() throws Exception {
  26.         //这里我需要获取对应参数
  27.         Objects.requireNonNull(str);
  28.         String[] split = str.split(",");
  29.         Person p=new Person();
  30.         p.setAge(Integer.parseInt(split[0]));
  31.         p.setName(split[1]);
  32.         //这里可能需要还要有其他复杂事情需要处理
  33.         return p;
  34.     }
  35.     @Override
  36.     public Class<?> getObjectType() {
  37.         return Person.class;
  38.     }
  39.     public String getInitStr() {
  40.         return str;
  41.     }
  42.     public void setInitStr(String str) {
  43.         this.str = str;
  44.     }
  45. }
  46. main方法
  47. package com.java265.factory;
  48. import com.java265.Person;
  49. import org.springframework.beans.factory.BeanFactory;
  50. import org.springframework.beans.factory.FactoryBean;
  51. import org.springframework.context.ApplicationContext;
  52. import org.springframework.context.support.ClassPathXmlApplicationContext;
  53. /**
  54. * BeanFactory 例子
  55. */
  56. public class SpringBeanFactoryMain {
  57.     public static void main(String[] args) {
  58.         //这个是BeanFactory
  59.         BeanFactory beanFactory = new ClassPathXmlApplicationContext("application.xml");
  60.         //获取对应的对象化
  61.         Object demo = beanFactory.getBean("demo");
  62.         System.out.println(demo instanceof Person);
  63.         System.out.println(demo);
  64.          //获取从工厂Bean中获取对象
  65.         Person demoFromFactory = beanFactory.getBean("demoFromFactory", Person.class);
  66.         System.out.println(demoFromFactory);
  67.         //获取对应的personFactory
  68.         Object bean = beanFactory.getBean("&demoFromFactory");
  69.         //将Spring使用xml生成的bean同FactoryBean生成的Bean进行比较
  70.         System.out.println(bean instanceof PersonFactoryBean);
  71.        PersonFactoryBean factoryBean=(PersonFactoryBean) bean;
  72.         System.out.println("初始化参数为:"+factoryBean.getInitStr());
  73.     }
  74. }
  75. ------运行以上代码,将输出以下信息-----
  76. true
  77. Person{name='Java265', age=88}
  78. Person{name='init from factory', age=99}
  79. true
  80. 初始化参数为:99,init from factory
复制代码
  1. BeanFactory同FactoryBean的区别:
  2.    BeanFactory:负责生产和管理Bean的一个工厂接口,提供Spring Ioc容器标准
  3.    FactoryBean: 一种Bean创建的一种方式,对Bean的一种扩展
  4.         可以直接使用代码的方式创建一个SpringBean
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表