05 sping核心技术-IOC容器(容器的扩展点)

2023-12-26 04:43:28
通常,应用程序开发人员不需要创建ApplicationContext实现类的子类。相反,可以通过插入特殊集成接口的实现来扩展Spring IoC容器。

一 使用BeanPostProcessor定制bean

如果你想在spring容器完成实例化,配置和初始化一个bean的时候,你可以增加一个自定义是实现BeanPostProcesser接口的类。
你可以写多个实现类,同时你也可以通过order控制执行顺序。

package scripting;

import org.springframework.beans.factory.config.BeanPostProcessor;

public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {

	// simply return the instantiated bean as-is
	public Object postProcessBeforeInitialization(Object bean, String beanName) {
		return bean; // we could potentially return any object reference here...
	}

	public Object postProcessAfterInitialization(Object bean, String beanName) {
		System.out.println("Bean '" + beanName + "' created : " + bean.toString());
		return bean;
	}
}

1 AutowiredAnnotationBeanPostProcessor

二 使用BeanFactoryPostProcessor自定义配置元数据

BeanFactoryPostProcessor 对配置元数据进行操作

1 PropertySourcesPlaceholderConfigurer

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
	<property name="locations" value="classpath:com/something/jdbc.properties"/>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="${jdbc.driverClassName}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
</bean>

2 PropertyOverrideConfigurer

PropertyOverrideConfigurer与PropertySourcesPlaceholderConfigurer类似,但与后者不同的是,原始定义可以为bean属性提供默认值,也可以根本没有值。如果重写的Properties文件没有某个bean属性的条目,则使用默认上下文定义。

三 使用FactoryBean定制实例化逻辑 Customizing Instantiation Logic with a FactoryBean

在这里插入图片描述
当您需要向容器请求实际的FactoryBean实例本身而不是它生成的bean时,请在调用ApplicationContext的getBean()方法时,在bean的id前面加上&符号。因此,对于id为myBean的给定FactoryBean,在容器上调用getBean(“myBean”)将返回FactoryBean的产品,而调用getBean(“&myBean”)将返回FactoryBean实例本身。

文章来源:https://blog.csdn.net/qq_36551101/article/details/135199220
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。