Spring源码(9)--FactoryBean简介

花瓣小跑  金牌会员 | 2024-9-3 07:52:26 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 510|帖子 510|积分 1530

FactoryBean简介

FactoryBean 是一个工厂对象,用于创建和管理其他 Bean 的实例。
FactoryBean 接口定义了一种创建 Bean 的方式,它允许开发职员在 Bean 的创建过程中举行更多的自定义利用。
通过实现 FactoryBean 接口,开发职员可以创建复杂的 Bean 实例,或者在 Bean 实例化之前举行一些额外的逻辑处理。
此接口在框架中大量使用,比方用于AOP的org.springframework.AOP.framework.ProxyFactoryBean
或 com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean。
设计模式:

工厂方法。
工厂方法是针对每一种产物提供一个工厂类。通过不同的工厂实例来创建不同的产物实例。
详情见: https://blog.csdn.net/sinat_32502451/article/details/133070351
FactoryBean

源码: org.springframework.beans.factory.FactoryBean
FactoryBean 接口具有以下方法:


  • getObject():返回此工厂管理的对象的实例。
  • getObjectType():返回此FactoryBean创建的对象范例。
  • isSingleton():工厂管理的对象是否为单例。
  1. public interface FactoryBean<T> {
  2.         /**
  3.          * 返回此工厂管理的对象的实例
  4.          */
  5.         @Nullable
  6.         T getObject() throws Exception;
  7.         /**
  8.          * 返回此FactoryBean创建的对象类型
  9.          */
  10.         @Nullable
  11.         Class<?> getObjectType();
  12.         /**
  13.          * 这个工厂管理的对象是单例吗?也就是说,getObject() 总是返回相同的对象(可以缓存的引用)吗?
  14.          */
  15.         default boolean isSingleton() {
  16.                 return true;
  17.         }
  18. }
复制代码
AbstractFactoryBean

AbstractFactoryBean 实现了 FactoryBean。
AbstractFactoryBean 是通过 FactoryBean 实现的简单模板超类,根据标记创建单例或原型对象。
  1.         /**
  2.          *   返回单例实例或创建新的原型实例。
  3.          */
  4.         @Override
  5.         public final T getObject() throws Exception {
  6.                 if (isSingleton()) {
  7.                         return (this.initialized ? this.singletonInstance : getEarlySingletonInstance());
  8.                 }
  9.                 else {
  10.                         return createInstance();
  11.                 }
  12.         }
  13.         /**
  14.          *  子类必须重写的模板方法,以构造此工厂返回的对象。
  15.          */
  16.         protected abstract T createInstance() throws Exception;
  17.        
  18.         @Override
  19.         @Nullable
  20.         public abstract Class<?> getObjectType();
  21.        
  22.         /**
  23.           *   用于销毁单例实例。
  24.           */
  25.         protected void destroyInstance(@Nullable T instance) throws Exception {
  26.         }
复制代码
ListFactoryBean

ListFactoryBean 继承了 AbstractFactoryBean。间接实现了 FactoryBean。
ListFactoryBean 是 List实例的简单工厂。允许通过XML bean定义中的“list”元素集中设置列表。
ListFactoryBean 重写了 createInstance(),用于返回 List 范例的数据。
  1.         /**
  2.          * 重写了 createInstance(),用于返回 List 类型的数据
  3.          *
  4.          */
  5.         protected List<Object> createInstance() {
  6.                 if (this.sourceList == null) {
  7.                         throw new IllegalArgumentException("'sourceList' is required");
  8.                 }
  9.                 List<Object> result = null;
  10.                 if (this.targetListClass != null) {
  11.                         result = BeanUtils.instantiateClass(this.targetListClass);
  12.                 }
  13.                 else {
  14.                         result = new ArrayList<>(this.sourceList.size());
  15.                 }
  16.                 Class<?> valueType = null;
  17.                 if (this.targetListClass != null) {
  18.                         valueType = ResolvableType.forClass(this.targetListClass).asCollection().resolveGeneric();
  19.                 }
  20.                 if (valueType != null) {
  21.                         TypeConverter converter = getBeanTypeConverter();
  22.                         for (Object elem : this.sourceList) {
  23.                                 result.add(converter.convertIfNecessary(elem, valueType));
  24.                         }
  25.                 }
  26.                 else {
  27.                         result.addAll(this.sourceList);
  28.                 }
  29.                 return result;
  30.         }
复制代码
ProxyFactoryBean

源码:org.springframework.aop.framework.ProxyFactoryBean
ProxyFactoryBean 由FactoryBean实现,在Spring BeanFactory中基于bean构建AOP代理。
  1.   /**
  2.     *   返回代理。当客户端从该工厂bean获取bean时调用。
  3.     *   创建此工厂返回的AOP代理的实例。该实例将被缓存为单例,并在每次调用 getObject() 时创建代理。
  4.     */
  5.         @Override
  6.         @Nullable
  7.         public Object getObject() throws BeansException {
  8.           //初始化切面的责任链
  9.                 initializeAdvisorChain();
  10.                 if (isSingleton()) {
  11.                   //获取单例对象
  12.                         return getSingletonInstance();
  13.                 }
  14.                 else {
  15.                         if (this.targetName == null) {
  16.                                 logger.warn("Using non-singleton proxies with singleton targets is often undesirable. " +
  17.                                                 "Enable prototype proxies by setting the 'targetName' property.");
  18.                         }
  19.                         //获取原型对象
  20.                         return newPrototypeInstance();
  21.                 }
  22.         }
复制代码
MybatisSqlSessionFactoryBean

这个类,是mybatis常用配置的类。
源码:com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean
可以看到,在实例化bean对象(此处为SqlSessionFactory )时, 会读取配置的值,才构建sqlSessionFactory。
  1.     @Override
  2.     public SqlSessionFactory getObject() throws Exception {
  3.         if (this.sqlSessionFactory == null) {
  4.             //在返回实例化对象之前的逻辑
  5.             afterPropertiesSet();
  6.         }
  7.         return this.sqlSessionFactory;
  8.     }
  9.    
  10.     @Override
  11.     public void afterPropertiesSet() throws Exception {
  12.         notNull(dataSource, "SFunction 'dataSource' is required");
  13.         notNull(sqlSessionFactoryBuilder, "SFunction 'sqlSessionFactoryBuilder' is required");
  14.         state((configuration == null && configLocation == null) || !(configuration != null && configLocation != null),
  15.             "SFunction 'configuration' and 'configLocation' can not specified with together");
  16.         
  17.         // 这里会读取配置的值,构建sqlSessionFactory
  18.         this.sqlSessionFactory = buildSqlSessionFactory();
  19.     }
复制代码
参考资料:

https://blog.csdn.net/belongtocode/article/details/134631544

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

花瓣小跑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表