BeanFactoryPostProcessor 接口是对Bean 工厂的后处理操作。
在Spring 的PropertyPlaceholderConfigurer 类是实现BeanFactoryProcessor 接口中非常有用的类。它用于Spring 从外部属性文件中载入属性,并使用这些属性值替换Spring 配置文件中的占位符变量(${varible})。
Spring 的ApplicationContext 容器可以非常方便的使用PropertyPlaceholderConfigurer,只需通过简单的配置即可使用。
示例:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="jdbc.properties" />
</bean>
如果需要使用多个配置文件可以使用PropertyPlaceholderConfigurer 的locations属性。
具體一點的例子如下:
Spring的框架中为您提供了一个 BeanFactoryPostProcessor 的实作类别: org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。藉由这个类别,您可以将一些组态设定,移出至.properties档案中,如此的安排可以让XML定义档负责系统相关设定,而.properties档可以作为客户根据需求,自定义一些相关的参数。
来看一个Bean定义档的实际例子:
beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="configBean"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>hello.properties</value> </property> </bean>
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean">
<property name="helloWord">
<value>${onlyfun.caterpillar.helloWord}</value>
</property>
</bean>
</beans>
假设在helloBean中有许多依赖注入的属性,这些都是比较不常变动的属性,而其中helloWord会经常变动,可以透过hello.properties来简单的设定,而这个资讯已设定在configBean的location属性中:
hello.properties
onlyfun.caterpillar.helloWord=Welcome!
在helloBean的helloWord属性中,${onlyfun.caterpillar.helloWord}将会被hello.properties的helloWord所取代。
如果有多个.properties档案,则可以透过locations属性来设定,例如:
beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="configBean"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations">
<list> <value>hello.properties</value>
<value>welcome.properties</value>
<value>other.properties</value>
</list>
</property> </bean>
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean">
<property name="helloWord">
<value>${onlyfun.caterpillar.helloWord}</value>
</property>
...
</bean>
</beans> ======================================PropertyPlaceholderConfigurer类就是bean factory post-processor的一种,它的作用是一个资源属性的配置器,能够将BeanFactory的里定义的内容放在一个以.propertis后缀的文件中。
例如---spring-context.xml----
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>${driver}</value></property>
<property name="url"><value>jdbc:${dbname}</value></property>
</bean>而实际的jdbc.propertis文件是
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root
而jdbc.propertis是怎样引用的呢: 将上边一段配置注册在web.xml中就可以了
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</context-param>
当然,不要忘了spring的监听器注册
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
这样,一个简单的数据源就设置完毕了。
实际上,PropertyPlaceholderConfigurer起的作用就是将占位符指向的数据库配置信息放在bean中定义
的工具。
分享到:
相关推荐
在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和管理Bean,并利用Java的反射机制来实例化这些Bean。 首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些...
综上所述,Spring Bean的实例化顺序是一个复杂的过程,涉及到配置、依赖关系、注解和接口等多个层面。理解这些机制有助于优化和调试应用程序,确保Bean的正确初始化和协同工作。在实际开发中,应谨慎处理Bean的实例...
Spring支持多种配置方式,包括XML、Java配置类(@Configuration)、注解(@Component、@Service等)以及通过@ConfigurationProperties处理YAML或Properties文件。在实验小例子中,我们可能看到这几种配置方式的组合...
本文将围绕“JDK代理”、“CGI代理”以及它们与Spring后处理Bean的关系进行深入探讨。 首先,JDK代理,也称为接口代理,是Java内置的一种动态代理机制。通过实现`java.lang.reflect.InvocationHandler`接口并调用`...
此外,`@Autowired`注解的工作原理涉及`AutowiredAnnotationBeanPostProcessor`类,它是一个Bean后处理器,会在Bean实例化后进行处理,找到匹配的依赖并注入。 在开发中,Spring提供的各种工具如`BeanPostProcessor...
这里我们将详细探讨如何在Java中通过Spring获取配置的bean。 1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和...
创建一个切面,定义切点并实现所需逻辑,确保在多线程环境中正确处理bean。 3. **ExecutorService**:Spring提供的`TaskExecutor`或Java的`ExecutorService`可以用来创建线程池。在提交任务时,可以将bean作为参数...
在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式地在配置文件中声明每个Bean,而是让Spring容器自动发现并管理应用中的组件。这一特性极大地简化了Spring应用的配置,提高了开发效率。...
综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂方法的误用、AOP代理的配置问题或是Bean作用域设置不准确导致的。通过仔细检查和修正这些问题,可以避免...
- 如果有多个配置源,如多个`beans.xml`文件或混合Java配置,Spring会合并所有的Bean定义,然后按照合并后的顺序进行处理。 在"sample"这个压缩包项目中,我们可以创建多个Bean,通过观察它们的初始化顺序来验证...
9. **Bean后处理器(Bean Post Processor)**: Bean后处理器允许在初始化Bean之后和销毁Bean之前执行自定义逻辑。通过实现`BeanPostProcessor`接口,我们可以自定义Bean的初始化和销毁行为。 10. **Resource注入**:...
在Spring框架中,动态加载配置文件是一项重要的功能,它使得开发者在开发过程中无需重启应用就能实时更新配置,极大地提高了开发效率。热部署方案是这一功能的具体应用,它允许我们在不中断服务的情况下,对应用程序...
在Spring框架中,Bean的生命周期管理和ApplicationContext的应用是两个核心概念,它们对于理解Spring如何管理和协调应用中的对象至关重要。本文将深入探讨这两个主题,并结合国际化(i18n)和事件传递来阐述它们在...
在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式配置每个Bean,而是通过指定包路径来让Spring自动发现和管理Bean。本文将深入探讨这个主题,帮助你更好地理解和应用这一功能。 首先,让...
在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程。本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们...
总结起来,Spring提供了多种方式让我们能够在Bean的生命周期中插入自定义操作。选择哪种方式取决于具体需求,如代码的可维护性、灵活性以及是否需要统一处理。在理解和掌握了这些知识后,我们可以更好地控制Bean的...
7. **XML配置中的bean定义**:尽管大部分配置可以通过注解完成,但在某些情况下,我们仍需在XML文件中声明bean,例如,当需要自定义初始化方法、配置特定的bean属性,或者处理非Java组件(如数据库连接池)时。...
在Spring的XML配置文件中,我们可以创建一个`<aop:config>`元素,并在其内部定义`<aop:advisor>`来创建Advisor。Advisor的`advice-ref`属性用于指定通知bean的ID,`pointcut-ref`属性用于指定切点bean的ID。 2. ...
总结来说,Spring的ClassPathResource是处理类路径资源的强大工具,它使开发者能够方便地加载和使用类路径中的文件,如XML配置文件,进而实现bean的初始化和管理。在学习和应用过程中,结合具体场景和需求,我们可以...
- `InitializingBean`后处理:如果Bean实现了`InitializingBean`接口,Spring会调用`afterPropertiesSet()`方法。 5. **容器级回调**: 如果Bean定义了`@PostConstruct`注解的方法,Spring会在初始化后调用。这为...