1.原始做法: spring xml配置文件,参数直接混合配置
如下
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="jdbc:postgresql://127.0.0.1/feilong" /> <property name="username" value="feilong_prod" /> <property name="password"><value><![CDATA[feilong]]></value></property> <property name="maxActive" value="700" /> <property name="maxIdle" value="20" /> <property name="maxWait" value="3000" /> </bean>
缺点:参数和bean混在一起,不利于查找编辑发布
2.稍微改进,使用context:property-placeholder
新建 dataSource.properties
######################### dataSource info################################### dataSource.driverClassName=org.postgresql.Driver dataSource.url=jdbc:postgresql://10.8.12.207/db_converse dataSource.username=user_converse dataSource.password=user_converse1234 dataSource.maxActive=80 dataSource.maxIdle=20 dataSource.maxWait=3000
<context:property-placeholder location="classpath*:config/datasource.properties" /> <!--dataSource --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${dataSource.driverClassName}" /> <property name="url" value="${dataSource.url}" /> <property name="username" value="${dataSource.username}" /> <property name="password" value="${dataSource.password}" /> <property name="maxActive" value="${dataSource.maxActive}" /> <property name="maxIdle" value="${dataSource.maxIdle}" /> <property name="maxWait" value="${dataSource.maxWait}" /> </bean>
缺点:这个问题困扰我很久,
就是,如果我有的bean 不需要外部参数配置,就想使用 ${} 这样的符号
比如
<bean id="Sku.findSkuRelationByCategory" class="loxia.dao.support.DynamicQueryHolder"> <constructor-arg> <value> <![CDATA[select r.sku_id as sku_id, r.sku_category_id as sku_category_id from t_ma_sc_sku_relation r where r.sku_id in(#foreach($num in [1..$skuCount]) #if($num == 1) :s${num} #else ,:s${num} #end #end) and r.sku_category_id in(#foreach($num in [1..$categoryCount]) #if($num == 1) :c${num} #else ,:c${num} #end #end) order by sku_category_id]]> </value> </constructor-arg> </bean>
在stackoverflow上面,国外的朋友给我解答,虽然我的英文很烂,但是外国人看懂了,开心http://stackoverflow.com/questions/10257448/contextproperty-placeholder-is-a-good-thing-but-i-do-not-want-some-bean-config
解决方案:
1).context:property-placeholder使用placeholderPrefix和placeholderSuffix属性
以前不知道这个属性,长见识了,这个方案不错,如果你的spring是3.0以下的话,使用这个
2).不使用外部参数,但要用$符号的bean,可以使用SPEL 转义#{'$'}num}
这个方案可以解决问题,但是比较坑爹,我有很多这样的sql,都需要人工转义,太麻烦,抛弃
3.使用SPEL和Util标签配置spring xml参数
SPEL 是spring 3.0新的特性
<util:properties id="p_dataSource" location="classpath:config/dataSource.properties"></util:properties>
<!--dataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{p_dataSource['dataSource.driverClassName']}" />
<property name="url" value="#{p_dataSource['dataSource.url']}" />
<property name="username" value="#{p_dataSource['dataSource.username']}" />
<property name="password" value="#{p_dataSource['dataSource.password']}" />
<property name="maxActive" value="#{p_dataSource['dataSource.maxActive']}" />
<property name="maxIdle" value="#{p_dataSource['dataSource.maxIdle']}" />
<property name="maxWait" value="#{p_dataSource['dataSource.maxWait']}" />
</bean>
注意:不能配置成#{p_dataSource.dataSource.maxIdle},读不到这个属性,需要用 [] 方括号括起来
相关推荐
`P()`函数则用于访问属性路径,通常与XML配置文件中的`<beans:property/>`标签一起使用。 8. ** spel表达式在AOP中的应用** 在Spring AOP中,SpEL可用于定义切面的切入点表达式,如`execution(* ...
spring-1 演示了使用setter方式及构造器方式创建bean,util:list标签创建集合,p标签简化配置 和依赖注入, 以及bean的autowire和继承与依赖,以及bean的作用域。 spring-2 演示了外部配置文件的引入(connection)...
首先,SpEL提供了一种简洁的方式来访问和操作Bean的属性,它允许我们在配置中使用表达式来设置Bean的属性值。例如,我们可以使用`#{T(java.lang.Math).random()}`来注入一个随机数,或者`#{systemProperties['java....
在Spring 3版本中,DTD(Document Type Definition)被广泛使用来定义XML配置文件的结构和约束。DTD是一种元数据,它定义了XML文档的元素、属性以及它们之间的关系,确保了配置文件的合法性。 在Spring框架中,DTD...
- **配置参数管理**:介绍如何管理和读取外部配置文件中的参数。 **2.7 Spring受管Bean的作用范围** - **Bean作用域**:讲解Bean的生命周期和作用域管理,包括单例、原型等不同模式。 **2.8 Bean Validation集成...
5. **spring-expression-4.3.1.RELEASE.jar**:这部分是Spring表达式语言(SpEL)的实现,提供了强大且灵活的在运行时评估对象和属性的表达式能力,常用于配置文件和AOP切点表达式。 6. **commons-logging-1.2.jar*...
SpEL表达式可以在XML配置文件、注解或者编程代码中使用,为程序的灵活性和可扩展性提供了强大的支持。 SpEL的核心特性包括: 1. **属性访问**:SpEL允许我们直接通过点号(.)来访问对象的属性,例如`person.name`...
- **基于XML方式使用**:演示如何在XML配置文件中使用SpEL。 - **基于Annotation注解使用**:展示了如何使用注解来使用SpEL。 - **SpEL语法速查**:提供了一些SpEL的基本语法示例。 #### 四、面向切面编程 - **...
例如,我们可以在XML配置中使用SpEL来决定bean的依赖关系,或者在AOP切点表达式中使用它来指定拦截哪些方法。 6. Spring AOP: Spring AOP模块实现了面向切面编程,允许我们在不修改原有代码的情况下,向应用程序...
总结来说,Spring框架的SpEL是支持Spring Bean定义的一个强大工具,它允许开发者在XML配置文件或注解中使用表达式语言来操作数据和逻辑。通过上述示例,我们可以看到在实际的Spring应用中如何利用SpEL进行灵活配置。...
8. **在配置中使用**:SpEL可以在Spring的XML配置中用于动态配置bean的属性,或者在`@Value`注解中用于注入运行时计算的值。 在Spring 3.0中,MVC和EL的结合使用,极大地提升了开发效率和代码质量。通过SpEL,...
它可以从`application.properties`或`application.yml`文件中读取值,也可以使用SpEL(Spring Expression Language)表达式。 3. `@PropertySource`: 这个注解用于指定属性源,通常是从外部的properties文件中...
下面将详细阐述Spring定时器的工作原理、配置方法以及使用场景。 1. **工作原理**: Spring定时器基于`java.util.concurrent.ScheduledExecutorService`接口,它是一个线程池服务,可以用来安排在未来某个时间点...
5. **spring-beans**: 包含了Bean工厂,它是Spring的核心,负责创建、配置和管理对象。 6. **spring-expression**: Spring Expression Language (SpEL) 提供了一种强大且灵活的方式来表达对象模型中的属性、方法...
从多个JAR包的划分可以看出,Spring采用了更为精细的模块化策略,使得开发者能够更容易地管理和使用特定的功能模块。此外,Spring3的构建系统及依赖管理引入了Apache Ivy这一强大的工具,同时也兼容了Maven,这不仅...
5. **Spring Expression Language (SpEL)**: `spring-expression-4.3.6.RELEASE.jar`是Spring的表达式语言,提供了一种强大的方式来在运行时查询和操作对象图。它支持在配置元数据中表达复杂的逻辑,例如在bean的...
总结来说,`spring ioc.jar`是Spring框架实现控制反转和依赖注入的核心,通过加载`applicationContext.xml`配置文件,Spring能够管理应用程序中的对象,建立对象之间的依赖关系,从而使开发者能更专注于业务逻辑,而...
在Spring的XML配置文件中,我们可以使用`<list>`、`<set>`、`<map>`和`<props>`标签来装配集合类型的属性。例如,假设我们有一个`User`类,它包含一个`List<User>`类型的`friends`属性: ```xml ...
2. `spring-beans.jar`:提供了bean工厂,实现依赖注入和配置管理,包括XML配置和基于注解的配置。 3. `spring-context.jar`:扩展了bean工厂,引入了ApplicationContext接口,提供了事件发布、国际化、资源加载等...