Spring Ioc Bean是什么?
在Spring中,那些组成你应用程序的主体及由Spring Ioc容器所管理的对象,都被称之为bean。
简单来讲,bean就是Spring容器的初始化、配置及管理的对象。
除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
org.springframework.beans.factory.BeanFactory是Spring Ioc容器的实际代表者,Ioc容器负责容纳此前所描述的bean,并对bean进行管理。
BeanFactory是什么?
BeanFactory是一个顶层接口,是最基本的Bean容器。Spring使用BeanFactory来生成,配置和管理Bean。
ApplicationContext是BeanFactory的子类,它比BeanFactory提供了更加丰富的功能。
平时常用的Bean容器还有3个,它们都是ApplicationContext的子类,如图所示。 ClassPathXmlApplicationContext主要用在在类路径加载xml文件的场景,FileSystemXmlApplicationContext主要用在在文件系统加载xml文件的场景,XMLWebApplicationContext主要用在在Web中加载xml文件的场景。
BeanFactory和ApplicationContext在Bean加载方面有什么不同呢?
BeanFactory是延迟加载。
BeanFactory初始化完成后,并不加载任何Bean,只有在第一次获取Bean时,BeanFactory才会加载该Bean。而ApplicationContext会在启动后主动加载好单例Bean,这样,从ApplicationContext中获取Bean时效率更高。
BeanDefinition是什么?
spring bean的建模对象。
Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition。
BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等,它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。
实例
时序图
创建一个BeanDefinition
public class BeanDefinition {
private Object bean;
public BeanDefinition(Object bean) {
this.bean = bean;
}
public Object getBean() {
return bean;
}
}
创建BeanFactory
public class BeanFactory {
// 容器
private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
public Object getBean(String name) {
return beanDefinitionMap.get(name).getBean();
}
// 加入容器管理
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
beanDefinitionMap.put(name, beanDefinition);
}
}
创建UserService
public class UserService {
public void queryUserInfo(){
System.out.println("查询用户信息");
}
}
创建测试类ApiTest
public class ApiTest {
@Test
public void test_BeanFactory(){
// 1.初始化 BeanFactory
BeanFactory beanFactory = new BeanFactory();
// 2.注入bean
BeanDefinition beanDefinition = new BeanDefinition(new UserService());
beanFactory.registerBeanDefinition("userService", beanDefinition);
// 3.获取bean
UserService userService = (UserService) beanFactory.getBean("userService");
userService.queryUserInfo();
}
}
结果
查询用户信息