Spring是基于IoC和AOP设计的,IoC容器是Spring框架的核心,它负责管理各种Bean以及它们之间的依赖关系,帮助我们实现松耦合的设计。
一、DefaultListableBeanFactory简介
DefaultListableBeanFactory是Spring框架中最常用的IoC容器实现。它是通过继承AbstractAutowireCapableBeanFactory类实现的。DefaultListableBeanFactory就是封装了BeanFactory对Bean的定义,Bean的创建和维护。在DefaultListableBeanFactory中,核心在于三个容器:BeanDefinition容器,单例Bean容器和Bean实例化后的属性注入。
在Spring中,它采用BeanDefinition来描述Bean的定义信息,包括Bean的作用域、依赖关系、构造方法、工厂方法、初始化方法、销毁方法等,这些信息会被DefaultListableBeanFactory所管理。下面是一个简单的示例,展示了如何通过BeanDefinition来定义一个Bean:
<bean id="user" class="com.example.User"> <property name="name" value="Tom" /> <property name="age" value="25" /> </bean>
在上述示例中,<bean>元素就是BeanDefinition。
二、DefaultListableBeanFactory的核心功能
1、BeanDefinition的加载和注册
DefaultListableBeanFactory通过BeanDefinitionReader来读取配置文件中的BeanDefinition信息,然后将其注册到容器中。Spring为我们提供了众多的BeanDefinitionReader实现类,如XmlBeanDefinitionReader、YamlBeanDefinitionReader等。
示例:
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); reader.loadBeanDefinitions("applicationContext.xml");
2、Bean的创建和管理
DefaultListableBeanFactory中核心的功能就是对Bean的创建和管理,它根据Bean的定义信息,构建Bean的实例,并对其进行生命周期的管理,保证Bean的依赖关系和生命周期正确。
示例:
User user = (User) beanFactory.getBean("user");
3、Autowiring自动装配
DefaultListableBeanFactory支持多种Autowiring自动装配方式,包括byName和byType方式。当我们使用byName方式时,它会自动将所有名称和属性名称相同的Bean进行匹配,并完成属性的注入;而如果我们使用byType方式,则会自动将同类型的Bean进行匹配,并完成属性的注入。
示例:
<bean id="user" class="com.example.User"> <property name="car" autowire="byType" /> </bean>
4、Bean的作用域
DefaultListableBeanFactory支持多种作用域,包括singleton、prototype、request、session和globalSession等。其中singleton默认为单例模式,prototype为原型模式,其余的为Web应用中使用最多的作用域。
示例:
<bean id="user" class="com.example.User" scope="prototype"> <property name="name" value="Tom" /> <property name="age" value="25" /> </bean>
三、DefaultListableBeanFactory常用API
1、getBean(String name)
根据Bean的名称获取Bean实例。
User user = (User) beanFactory.getBean("user");
2、getBean(Class<T> requiredType)
根据Bean的类型获取Bean实例。
User user = beanFactory.getBean(User.class);
3、registerSingleton(String name, Object singletonObject)
注册单例Bean到容器中。
User user = new User(); beanFactory.registerSingleton("user", user);
4、containsSingleton(String name)
判断是否包含指定名称的单例Bean。
boolean contains = beanFactory.containsSingleton("user");
5、addBeanPostProcessor(BeanPostProcessor beanPostProcessor)
添加BeanPostProcessor后置处理器。
MyBeanPostProcessor beanPostProcessor = new MyBeanPostProcessor(); beanFactory.addBeanPostProcessor(beanPostProcessor);
四、总结
DefaultListableBeanFactory是Spring框架的核心IoC容器,它支持BeanDefinition的加载和注册、Bean的创建和管理、Autowiring自动装配、Bean的作用域等一系列功能,并且提供了丰富的API。在Spring中,我们可以通过它来进行IoC实现,设计出更加灵活和可扩展的应用程序。