在Spring框架中,Bean是重要的资源,每个Bean在容器中都应该有一个对应的BeanDefinition对象,它是Spring中定义和封装Bean配置元数据的中心描述符。BeanDefinition对象是Spring中IoC容器创建、装配和管理Bean的核心类,掌握BeanDefinition及其相关的属性和方法,有助于深入理解Spring框架的设计思想和核心功能。
一、获取BeanDefinition对象
在Spring框架中,获取BeanDefinition对象常见的方式有三种:
1、使用BeanFactory接口或ApplicationContext接口中的getBeanDefinition方法获取指定Bean的BeanDefinition对象;
BeanDefinition bd = factory.getBeanDefinition("beanName"); //通过Bean名称获取BeanDefinition BeanDefinition bd = factory.getBeanDefinition(BeanClass.class); //通过Bean类型获取BeanDefinition
2、使用ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等XmlApplicationContext实现类创建Spring容器,通过BeanDefinitionReader或BeanDefinitionParser解析读取xml中的配置信息,然后生成BeanDefinition对象;
@Bean public BeanDefinitionReader beanDefinitionReader() throws Exception { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory()); reader.loadBeanDefinitions(new ClassPathResource("beans.xml")); return reader; }
3、通过BeanDefinitionBuilder创建和修改BeanDefinition对象。
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class); builder.addPropertyValue("propertyName", "propertyValue"); builder.setScope(BeanDefinition.SCOPE_SINGLETON); BeanDefinition bd = builder.getBeanDefinition();
二、Bean的作用域
在Spring框架中,Bean通过Scope属性来定义Bean的作用域,Spring框架提供了以下五种作用域:
1、singleton:单例模式,容器中只存在一个Bean实例,默认作用域;
2、prototype:原型模式,每次请求Bean时,都会创建一个新的Bean实例;
3、request:针对Web应用,每个Http请求都会创建一个新的Bean实例;
4、session:针对Web应用,每个Http Session会创建一个新的Bean实例;
5、globalSession:针对Web应用,全局Http Session会创建一个新的Bean实例。
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class); builder.setScope(BeanDefinition.SCOPE_PROTOTYPE); BeanDefinition bd = builder.getBeanDefinition();
三、Bean的声明周期
在Spring框架中,Bean生命周期可以被分为以下七个阶段:
1、实例化Bean:Spring容器根据BeanDefinition的配置信息创建一个Bean实例;
2、设置对象属性:Spring容器根据BeanDefinition的配置信息将属性或引用注入到Bean中;
3、调用BeanPostProcessor的postProcessBeforeInitialization()方法:BeanPostProcessor是Spring框架提供的接口,用于对Bean进行初始化前后的处理工作;
4、调用InitializingBean接口的afterPropertiesSet()方法或者在xml文件中配置init-method方法:该方法在Bean的所有属性被设置之后调用,完成其他的初始化工作;
5、调用BeanPostProcessor的postProcessAfterInitialization()方法:如果这个Bean是SmartInitializingSingleton或者SmartLifecycle接口的实现类并且被注册了,直接进入第七步;
6、Bean可以使用了:Bean正在工作当中;
7、调用SmartLifecycle的start()方法或SmartInitializingSingleton的afterSingletonsInstantiated()方法:如果Bean实现了SmartLifecycle接口,那么在Spring启动时,自动调用start()方法使Bean处于运行状态;如果Bean实现了SmartInitializingSingleton接口,那么在所有Bean都初始化完成后,调用afterSingletonsInstantiated()方法。
@Component public class ExampleBean implements InitializingBean, DisposableBean, SmartInitializingSingleton, SmartLifecycle { //... @Override public void afterSingletonsInstantiated() { log.info("Executing afterSingletonsInstantiated()"); } @Override public void start() { log.info("Executing start()"); } //... }
四、Bean的依赖关系
Spring框架中,Bean之间的依赖关系通常通过BeanDefinition对象中的DependsOn属性、@Autowired注解和@Resource注解来完善。
1、DependsOn属性:用于强制提前初始化特定Bean依赖的Bean;
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class); builder.getBeanDefinition().setDependsOn(new String[]{"dependentBean"});
2、@Autowired注解:将其他Bean作为属性注入到当前Bean中,以创建依赖关系;
@Component public class ExampleBean { @Autowired private OtherBean otherBean; //... }
3、@Resource注解:类似@Autowired注解,用于将其他Bean作为属性注入到当前Bean中,可以指定Bean的名称或者类型。
@Component public class ExampleBean { @Resource(name = "otherBean") private OtherBean otherBean; //... }
五、Bean的元数据
Spring框架中,Bean元数据是指Bean的详细描述信息,包括Bean的类名、作用域、构造参数、属性、依赖等。Spring提供了多种方式来定义Bean元数据。
1、xml方式:通过定义xml文档,在xml元素中声明Bean元数据;
2、JavaConfig方式:使用JavaConfig方式定义Bean元数据,通过@Configuration注解标记JavaConfig类,使用@Bean注解定义Bean;
@Configuration public class AppConfig { @Bean public ExampleBean exampleBean(){ ExampleBean exampleBean = new ExampleBean(); exampleBean.setPropertyName("propertyValue"); return exampleBean; } }
六、Bean的后置处理器
在Spring框架中,Bean的后置处理器是指在Bean生命周期中,在Bean属性注入、Bean初始化前后等阶段对Bean进行定制化操作的处理器。Spring框架提供了如下的Bean后置处理器接口:
1、BeanPostProcessor:所有Bean后置处理器都需要实现该接口;
2、InstantiationAwareBeanPostProcessor:继承BeanPostProcessor接口,用来在Bean实例化前后对Bean进行特殊处理,例如Bean自动装载、AOP功能实现;
3、BeanFactoryPostProcessor:在BeanFactory容器实例化完成之后,BeanFactoryPostProcessor接口会先于其他Bean被实例化,用于对BeanFactory容器进行post-processing操作。
public class ExampleBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { //执行Bean初始化前的操作 return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { //执行Bean初始化后的操作 return bean; } }
七、总结
本文详细介绍了Spring框架中BeanDefinition的相关概念,包括获取BeanDefinition对象、Bean的作用域、Bean的声明周期、Bean的依赖关系、Bean的元数据和Bean的后置处理器等。Spring框架通过BeanDefinition对象的封装和管理,实现对Bean的自动装配、托管、管理等核心功能,使得Spring框架应用更加简单、更加灵活、更加高效。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/157799.html