Spring Bean实例化的几种特殊方式
- 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实例化的几种特殊方式相关推荐
- Spring Bean初始化的几种常规方式
通过构造方法实例化 通过静态工厂实例化 通过实例工厂实例化 通过FactoryBean实例化 RumenzA实体类 package com.rumenz; public class RumenzA { ...
- spring框架xml的几种配置方式
spring框架xml的几种配置方式 ioc配置一般由一下两大类 1 手动装配 利用xml手动配置,分为:setter方法装配 ,构造器装配 2 自动装配 利用注解自动装配 准备工作:userdao ...
- Bean实例化的三种方式
一.实例化的三种方式 1.使用无参构造方法实例化(最常用) xml配置 <bean id="userDao" class="dao.impl.UserDaoImpl ...
- spring Bean装配的几种方式简单介绍
Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 ...
- Spring依赖注入的三种实现方式
依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念. 当某个JAVA实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例 ...
- Spring Bean实例化过程,怎么解决循环依赖
1.Spring是什么? Spring有很庞大的家族,Spring一般指的其实就是SpringFramework! Ioc和aop 包含在SpringFramework中! SpringFramewo ...
- Spring配置文件-Bean实例化的三种方式
1.无参构造方法实例化(详见我的博客) 2.工厂静态方法实例化 创建StaticFactory类 public class StaticFactory {public static UserDao g ...
- Spring中bean实例化的三种方式:默认构造、静态工厂、实例工厂
1. 默认构造方式:必须提供默认构造 <bean id="bean id" class="工厂全限定类名"></bean> 以Studn ...
- spring—Bean实例化三种方式
1) 使用无参构造方法实例化 它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败 <?xml version="1.0" encoding ...
最新文章
- Python3 与 C# 面向对象之~封装
- linux查看服务依赖关系,服务管理(1)
- Android --- Glide加载图片时候调用asBitmap()方法的时候总是报错,点不出来?
- javaSE各阶段练习题---面向对象-类与对象、封装、构造方法(1
- assertpythonraise_使用assertRaise测试异常消息
- java中的多线程来看一看基础了
- 前景菜谱制作的seo技巧
- 【操作系统】—内存的基本知识
- 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
- Problem A: 时间类的拷贝和整体读写
- NBU3.2及以上版本收集DataCollect和NBSU等日志的统一方法
- 渗透测试工程师面试题大全(164道)
- 微信开放平台错误码大全
- PS学习笔记-----提示暂存盘满了怎么办???
- Strtok分割字符串
- 简述分布式锁的3种实现方式
- HelloWorld之jetty运行
- tensorflow.keras入门1
- django+前端+数据库 week1
- IMMC2019(秋季赛)首批晋级国际赛队伍公布
热门文章
- Mysql 使用sql语句快速复制表和数据
- 蓝桥杯 ALGO-91 算法训练 Anagrams问题
- 蓝桥杯 BASIC-7 基础练习 特殊的数字
- LeetCode 118. Pascal’s Triangle
- 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
- [JZOJ5553][20190625]谜
- axios的二次封装与async,await的配合使用?
- 从“跳一跳”来看微信小程序的未来
- react学习系列1 修改create-react-app配置支持stylus 1
- 北京公交“十三五”将通过大数据实现线路优化