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 {@Testpublic void test_BeanFactory(){// 1.初始化 BeanFactoryBeanFactory beanFactory = new BeanFactory();// 2.注入beanBeanDefinition beanDefinition = new BeanDefinition(new UserService());beanFactory.registerBeanDefinition("userService", beanDefinition);// 3.获取beanUserService userService = (UserService) beanFactory.getBean("userService");userService.queryUserInfo();}}
结果
查询用户信息
