Bean 的实例化方式
程序员文章站
2022-05-23 18:30:06
...
Bean 的实例化方式
- 构造方法
- 静态工厂
- Bean 工厂
- FactoryBean
- SPI,org.springframework.beans.factory.serviceloader.ServiceLoaderFactoryBean
- AutowireCapableBeanFactory#createBean
- BeanDefinitionRegistry#registerBeanDefinition
...
xml 方式,演示实例化方式
spring 配置文件
<?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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构造方法 -->
<bean id="user1" class="constxiong.User">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="constructor"></constructor-arg>
</bean>
<!-- 静态工厂方法 -->
<bean id="user3" class="constxiong.User" factory-method="getUser"></bean>
<!-- bean 工厂方法 -->
<bean id="user2" factory-bean="userFactory" factory-method="getUser"></bean>
<bean id="userFactory" class="constxiong.UserFactory"></bean>
<!-- FactoryBean -->
<bean id="user4" class="constxiong.UserFactoryBean"></bean>
<!-- ServiceLoader -->
<bean id="userFactoryServiceLoader" class="org.springframework.beans.factory.serviceloader.ServiceLoaderFactoryBean">
<property name="serviceType" value="constxiong.UserFactoryInterface" />
</bean>
</beans>
constxiong.UserFactoryInterface 文件放在 META-INF/services/ 目录下
constxiong.UserFactoryImpl
测试类:
package constxiong;
import java.util.ServiceLoader;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试 Bean 的实例化
* @author ConstXiong
*/
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring-bean-instantiation.xml");
User user1 = context.getBean("user1", User.class);
System.out.println(user1);
User user2 = context.getBean("user2", User.class);
System.out.println(user2);
User user3 = context.getBean("user3", User.class);
System.out.println(user3);
User user4 = context.getBean("user4", User.class);
System.out.println(user4);
User user5 = (User) context.getBeanFactory().createBean(User.class, AutowireCapableBeanFactory.AUTOWIRE_NO, false);
System.out.println(user5);
// BeanDefinition
((DefaultListableBeanFactory)context.getBeanFactory()).registerBeanDefinition("user6", BeanDefinitionBuilder.rootBeanDefinition(User.class).addPropertyValue("name", "BeanDefinition").getBeanDefinition());
System.out.println(context.getBean("user6", User.class));
// spi 方式
ServiceLoader<UserFactoryInterface> serviceLoader = context.getBean("userFactoryServiceLoader", ServiceLoader.class);
System.out.println(serviceLoader.iterator().next().getUser());
// spi JDK 原生代码
ServiceLoader<UserFactoryInterface> loader = ServiceLoader.load(UserFactoryInterface.class, Thread.currentThread().getContextClassLoader());
System.out.println(loader.iterator().next().getUser());
}
}
完整代码:007-spring-bean-intantiation
【Java学习资源】整理推荐
- Bean 的作用域
- maven 集成 tomcat 以 jar 的方式打包 web 应用
- Spring 依赖注入与依赖查找来源的区别
- Spring 依赖注入的处理过程与 DependencyDescriptor 的说明
- Spring 各种 Aware 接口回调注入
- Spring Bean 生命周期内的 Exception 复现
- Spring 内建 Bean
- Spring Bean 的别名
- Spring Bean 未指定名称的命名规则
- Bean 何时被 GC
- Spring Bean 延迟加载
- ObjectFactory 与 BeanFactory 的区别
- Bean 销毁的方式与顺序
- Bean 初始化的方式与顺序
- Bean 的实例化方式
- Bean的注册方式
- 什么是 BeanDefinition?
- Spring IoC 容器启动时做了什么?
- BeanFactory 与 FactoryBean 的区别
- BeanFactory 与 ApplicationContext 的区别
- Spring IoC 依赖注入的实现方式
- Spring IoC 依赖注入(支持哪些数据类型?)
- Spring bean 依赖查找
- Spring-IoC
- Spring 的核心特性
【Java面试题与答案】整理推荐
上一篇: Spring源码实例化Bean的方式
下一篇: 实例化bean的方式