• ServiceLoader 利用JDK里面的反向控制
  • ServiceLoaderFactoryBean
  • AutowireCapableBeanFactory#createBean
  • BeanDefinitionRegistry#registerBeanDefinition

RumenzFactory接口和默认实现类DefaultRumenzFactory


RumenzFactory.java

package com.rumenz;public interface RumenzFactory {//jdk1.8 默认实现default   RumenzA rumenzFactory(){RumenzA rumenzA = new RumenzA();rumenzA.setId("123");rumenzA.setName("入门小站");return rumenzA;}default  RumenzA rumenzFactory(String id){return new RumenzA(id);}
}

DefaultRumenzFactory.java

package com.rumenz;public class DefaultRumenzFactory implements RumenzFactory{}

ServiceLoader 利用JDK里面的反向控制

ServiceLoader.java


public final class ServiceLoader<S>implements Iterable<S>
{private static final String PREFIX = "META-INF/services/";//....
}

需要在classpath下创建META-INF/services/目录,在此目录下创建一个文件名为工厂接口的文件(注意不需要后缀),此文件里面放上此接口的全类路径

└── resources├── META-INF│   └── services│       └── com.rumenz.RumenzFactory├── application.properties└── beans.xml注意:com.rumenz.RumenzFactory 是个文件
里面的内容为工厂接口:
com.rumenz.DefaultRumenzFactory

调用DemoApplication.java

package com.rumenz;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.Iterator;
import java.util.ServiceLoader;public class DemoApplication {public static  void main(String[] args) {ClassPathXmlApplicationContext  ca=new ClassPathXmlApplicationContext("beans.xml");ServiceLoader<RumenzFactory> serviceLoader= ServiceLoader.load(RumenzFactory.class,Thread.currentThread().getContextClassLoader());Iterator<RumenzFactory> iterator = serviceLoader.iterator();while(iterator.hasNext()){RumenzFactory next = iterator.next();System.out.println(next.rumenzFactory());}}
}

输出

RumenzA 无参构造方法
RumenzA{id='123', name='入门小站'}

ServiceLoaderFactoryBean

生成一个ServiceLoader的Bean

beans.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="instance-by-serviceLoaderFactoryBean" class="org.springframework.beans.factory.serviceloader.ServiceLoaderFactoryBean"><property name="serviceType" value="com.rumenz.RumenzFactory"></property>
</bean>
</beans>

调用DemoApplication.java

package com.rumenz;public class DemoApplication {public static  void main(String[] args) {ClassPathXmlApplicationContext  ca=new ClassPathXmlApplicationContext("beans.xml");ServiceLoader bean = ca.getBean("instance-by-serviceLoaderFactoryBean", ServiceLoader.class);Iterator iterator = bean.iterator();while (iterator.hasNext()){RumenzFactory next = (RumenzFactory) iterator.next();System.out.println(next.rumenzFactory());}}}

输出

RumenzA 无参构造方法
RumenzA{id='123', name='入门小站'}

AutowireCapableBeanFactory#createBean

调用DemoApplication.java

package com.rumenz;public class DemoApplication {public static  void main(String[] args) {ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");AutowireCapableBeanFactory abf = ac.getAutowireCapableBeanFactory();DefaultRumenzFactory bean = abf.createBean(DefaultRumenzFactory.class);System.out.println(bean.rumenzFactory());}
}

输出

RumenzA 无参构造方法
RumenzA{id='123', name='入门小站'}

BeanDefinitionRegistry#registerBeanDefinition

调用DemoApplication.java

package com.rumenz;public class DemoApplication {public static  void main(String[] args) {AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(DemoApplication.class);registerBean(ac,"rumenza");ac.refresh();RumenzA rumenza = (RumenzA) ac.getBean("rumenza");System.out.println(rumenza);ac.close();}public static void registerBean(BeanDefinitionRegistry reg,String beanName){BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(RumenzA.class);reg.registerBeanDefinition(beanName,beanDefinitionBuilder.getBeanDefinition());}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0EABxVZs-1593446721149)(https://rumenz.com/static/cimg/20200628/1593359495.png ‘‘图片title’’)]

源码:https://github.com/mifunc/Spring-Bean-special-instantiate

原文: https://rumenz.com/rumenbiji/Spring-Bean-special-instantiate.html

Spring Bean实例化的几种特殊方式相关推荐

  1. Spring Bean初始化的几种常规方式

    通过构造方法实例化 通过静态工厂实例化 通过实例工厂实例化 通过FactoryBean实例化 RumenzA实体类 package com.rumenz; public class RumenzA { ...

  2. spring框架xml的几种配置方式

    spring框架xml的几种配置方式 ioc配置一般由一下两大类 1 手动装配 利用xml手动配置,分为:setter方法装配 ,构造器装配 2 自动装配 利用注解自动装配 准备工作:userdao ...

  3. Bean实例化的三种方式

    一.实例化的三种方式 1.使用无参构造方法实例化(最常用) xml配置 <bean id="userDao" class="dao.impl.UserDaoImpl ...

  4. spring Bean装配的几种方式简单介绍

    Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 ...

  5. Spring依赖注入的三种实现方式

    依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念. 当某个JAVA实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例 ...

  6. Spring Bean实例化过程,怎么解决循环依赖

    1.Spring是什么? Spring有很庞大的家族,Spring一般指的其实就是SpringFramework! Ioc和aop 包含在SpringFramework中! SpringFramewo ...

  7. Spring配置文件-Bean实例化的三种方式

    1.无参构造方法实例化(详见我的博客) 2.工厂静态方法实例化 创建StaticFactory类 public class StaticFactory {public static UserDao g ...

  8. Spring中bean实例化的三种方式:默认构造、静态工厂、实例工厂

    1. 默认构造方式:必须提供默认构造 <bean id="bean id" class="工厂全限定类名"></bean> 以Studn ...

  9. spring—Bean实例化三种方式

    1) 使用无参构造方法实例化 它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败 <?xml version="1.0" encoding ...

最新文章

  1. Python3 与 C# 面向对象之~封装
  2. linux查看服务依赖关系,服务管理(1)
  3. Android --- Glide加载图片时候调用asBitmap()方法的时候总是报错,点不出来?
  4. javaSE各阶段练习题---面向对象-类与对象、封装、构造方法(1
  5. assertpythonraise_使用assertRaise测试异常消息
  6. java中的多线程来看一看基础了
  7. 前景菜谱制作的seo技巧
  8. 【操作系统】—内存的基本知识
  9. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
  10. Problem A: 时间类的拷贝和整体读写
  11. NBU3.2及以上版本收集DataCollect和NBSU等日志的统一方法
  12. 渗透测试工程师面试题大全(164道)
  13. 微信开放平台错误码大全
  14. PS学习笔记-----提示暂存盘满了怎么办???
  15. Strtok分割字符串
  16. 简述分布式锁的3种实现方式
  17. HelloWorld之jetty运行
  18. tensorflow.keras入门1
  19. django+前端+数据库 week1
  20. IMMC2019(秋季赛)首批晋级国际赛队伍公布

热门文章

  1. Mysql 使用sql语句快速复制表和数据
  2. 蓝桥杯 ALGO-91 算法训练 Anagrams问题
  3. 蓝桥杯 BASIC-7 基础练习 特殊的数字
  4. LeetCode 118. Pascal’s Triangle
  5. 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
  6. [JZOJ5553][20190625]谜
  7. axios的二次封装与async,await的配合使用?
  8. 从“跳一跳”来看微信小程序的未来
  9. react学习系列1 修改create-react-app配置支持stylus 1
  10. 北京公交“十三五”将通过大数据实现线路优化