- 常规方式实例化Bean
- 1.通过构造器(配置元信息:XML、Java 注解和 Java API )
- 2.通过静态工厂方法(配置元信息:XML 和 Java API )
- 3.通过 Bean 工厂方法(配置元信息:XML和 Java API )
- 4.通过 FactoryBean(配置元信息:XML、Java 注解和 Java API )
- 特殊方式实例化Bean
- 1.通过 ServiceLoaderFactoryBean(配置元信息:XML、Java 注解和 Java API )
- 2.通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)
- 3.通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
public static void main(String[] args) {
// 配置 XML 配置文件
// 启动 Spring 应用上下文
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/meta-INF/bean-instantiation-context.xml");
User user = beanFactory.getBean("user-by-static-method", User.class);
User userByInstanceMethod = beanFactory.getBean("user-by-instance-method", User.class);
User userByFactoryBean = beanFactory.getBean("user-by-factory-bean", User.class);
System.out.println(user);
System.out.println(userByInstanceMethod);
System.out.println(userByFactoryBean);
System.out.println(user == userByInstanceMethod);
System.out.println(user == userByFactoryBean);
}
1.通过构造器(配置元信息:XML、Java 注解和 Java API )
- 通常XML配置的Bean通过调用构造器实例化
- 通过@Component等注解
- 通过@Bean配置,直接实例化
- XML:
- Java API:静态工厂方法
- XML:
- Java API:@Bean 通过常规的API工厂方式实例化
- XML:
UserFactoryBean实现了FactoryBean接口
-
背景
SPI,全称Service Provider Interfaces,服务提供接口。是Java提供的一套供第三方实现或扩展使用的技术体系。主要通过解耦服务具体实现以及服务使用,使得程序的可扩展性大大增强,甚至可插拔。
基于服务的注册与发现机制,服务提供者向系统注册服务,服务使用者通过查找发现服务,可以达到服务的提供与使用的分离,甚至完成对服务的管理。
JDK中,基于SPI的思想,提供了默认具体的实现,ServiceLoader。利用JDK自带的ServiceLoader,可以轻松实现面向服务的注册与发现,完成服务提供与使用的解耦。
完成分离后的服务,使得服务提供方的修改或替换,不会给服务使用方带来代码上的修改,基于面向接口的服务约定,提供方和使用方各自直接面向接口编程,而不用关注对方的具体实现。同时,服务使用方使用到服务时,也才会真正意义上去发现服务,以完成服务的初始化,形成了服务的动态加载。 -
java.util.ServiceLoader
public final class ServiceLoader
implements Iterable{ private static final String PREFIX = "meta-INF/services/"; ...在实现类的jar包的meta-INF下新建一个文件夹services,并在services下新建一个文件,以接口的全限定名为文件名,内容为 实现类的全限定名。
ServiceLoader
serviceLoader = load(UserFactory.class, Thread.currentThread().getContextClassLoader()); Iterator iterator = serviceLoader.iterator(); while (iterator.hasNext()) { // 得到UserFactory的实现类 UserFactory userFactory = iterator.next(); // 创建user System.out.println(userFactory.createUser()); }
XML:
ServiceLoader2.通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)serviceLoader = applicationContext.getBean("userFactoryServiceLoader", ServiceLoader.class); Iterator iterator = serviceLoader.iterator(); while (iterator.hasNext()) { UserFactory userFactory = iterator.next(); System.out.println(userFactory.createUser()); }
public static void main(String[] args) {
// 配置 XML 配置文件
// 启动 Spring 应用上下文
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/meta-INF/special-bean-instantiation-context.xml");
// 通过 ApplicationContext 获取 AutowireCapableBeanFactory
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
// 创建 UserFactory 对象,通过 AutowireCapableBeanFactory
UserFactory userFactory = beanFactory.createBean(DefaultUserFactory.class);
System.out.println(userFactory.createUser());
}
3.通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
注册BeanDefinition时会实例化



