Spring-引用Bean的属性值
来源:互联网 发布:软件成本估算方法 编辑:程序博客网 时间:2024/06/01 09:35
- 概述
- 实例
- 基于XML方式的引用
- 基于注解的引用
概述
将应用系统的配置信息存放在配置文件中并非总是最合适的,如果应用以集群的方式部署,或者希望在运行期动态调整引用的某些配置,这时,将配置信息放到数据库中不但方便集中管理,而且可以通过应用系统的管理界面动态维护,有效增强应用系统的可维护性。
早期版本,如果想在配置文件中引用另外一个Bean的属性值是比较麻烦的,Spring3.0则提供了优雅的解决方案. 在Spring3.0中,可以通过类似 #{beanName.beanPro}的方式方便的引用另外一个Bean的值。
实例
代码已托管到Github—> https://github.com/yangshangwei/SpringMaster
假设数据库中有张TEMP_SYS_CONFIG表,数据如下
基于XML方式的引用
beans.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 扫描@Autowired --> <context:component-scan base-package="com.xgj.ioc.refOtherBeanProByXml"/> <!-- 定义Bean,通过initFromDB初始化方法从数据库中加载数据 --> <bean id="sysConfig" class="com.xgj.ioc.refOtherBeanProByXml.SysConfig" init-method="initFromDB"/> <!-- 引用sysConfig Bean的属性值 --> <bean id="applicationManager" class="com.xgj.ioc.refOtherBeanProByXml.ApplicationManager" p:sessionTimeout="#{sysConfig.sessionTimeout}" p:maxTabPageNum="#{sysConfig.maxTabPageNum}"/> <!-- 使用context命名空间 引入外部属性文件 --> <context:property-placeholder location="classpath:spring/jdbc.properties" /> <!-- 通过属性名引用属性值 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}"/> <!-- 配置Jdbc模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" /></beans>
SysConfig.java
package com.xgj.ioc.refOtherBeanProByXml;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowCallbackHandler;public class SysConfig { public int sessionTimeout; public int maxTabPageNum; private JdbcTemplate jdbcTemplate; @Autowired public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** * * * @Title: initFromDB * * @Description: 从数据库中初始化sessionTimeout和maxTabPageNum属性 * * * @return: void */ public void initFromDB() { System.out.println("initFrom DB"); final List<String> paramList = new ArrayList<String>(); String sql = " select value from TEMP_SYS_CONFIG a where a.code in ('sessionTimeout' ,'maxTabPageNum') "; jdbcTemplate.query(sql, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { paramList.add(rs.getString("value")); } }); sessionTimeout = Integer.parseInt(paramList.get(0)); maxTabPageNum = Integer.parseInt(paramList.get(1)); }}
ApplicationManager.java
package com.xgj.ioc.refOtherBeanProByXml;public class ApplicationManager { private int sessionTimeout; private int maxTabPageNum; public int getSessionTimeout() { System.out.println("sessionTimeout:" + sessionTimeout); return sessionTimeout; } public void setSessionTimeout(int sessionTimeout) { this.sessionTimeout = sessionTimeout; } public int getMaxTabPageNum() { System.out.println("maxTabPageNum:" + maxTabPageNum); return maxTabPageNum; } public void setMaxTabPageNum(int maxTabPageNum) { this.maxTabPageNum = maxTabPageNum; }}
测试类
package com.xgj.ioc.refOtherBeanProByXml;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanPropReferenceTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/xgj/ioc/refOtherBeanProByXml/beans.xml"); ApplicationManager applicationManager = ctx.getBean( "applicationManager", ApplicationManager.class); applicationManager.getSessionTimeout(); applicationManager.getMaxTabPageNum(); }}
运行结果:
基于注解的引用
在基于注解和基于JAVA类配置的Bean中,可以通过@Value(“#{beanName.beanPro}”)的注解形式引用Bean的属性值
通过在配置文件中配置context:component-scan ,扫描标注了注解的POJO,实例化并缓存。
配置文件:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 --> <context:component-scan base-package="com.xgj.ioc.refOtherBeanPro"/> <!-- 使用context命名空间 引入外部属性文件 --> <context:property-placeholder location="classpath:spring/jdbc.properties" /> <!-- 通过属性名引用属性值 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}"/> <!-- 配置Jdbc模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" /></beans>
SysConfig.java
package com.xgj.ioc.refOtherBeanPro;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowCallbackHandler;import org.springframework.stereotype.Component;@Componentpublic class SysConfig { public int sessionTimeout; public int maxTabPageNum; private JdbcTemplate jdbcTemplate; @Autowired public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** * * * @Title: initFromDB * * @Description: 从数据库中初始化sessionTimeout和maxTabPageNum属性 * * * @return: void */ @PostConstruct public void initFromDB() { System.out.println("initFrom DB"); final List<String> paramList = new ArrayList<String>(); String sql = " select value from TEMP_SYS_CONFIG a where a.code in ('sessionTimeout' ,'maxTabPageNum') "; jdbcTemplate.query(sql, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { paramList.add(rs.getString("value")); } }); sessionTimeout = Integer.parseInt(paramList.get(0)); maxTabPageNum = Integer.parseInt(paramList.get(1)); }}
ApplicationManager.java
package com.xgj.ioc.refOtherBeanPro;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Componentpublic class ApplicationManager { private int sessionTimeout; private int maxTabPageNum; public int getSessionTimeout() { System.out.println("sessionTimeout:" + sessionTimeout); return sessionTimeout; } @Value("#{sysConfig.sessionTimeout}") public void setSessionTimeout(int sessionTimeout) { this.sessionTimeout = sessionTimeout; } public int getMaxTabPageNum() { System.out.println("maxTabPageNum:" + maxTabPageNum); return maxTabPageNum; } @Value("#{sysConfig.maxTabPageNum}") public void setMaxTabPageNum(int maxTabPageNum) { this.maxTabPageNum = maxTabPageNum; }}
测试类
package com.xgj.ioc.refOtherBeanPro;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanPropReferenceTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/xgj/ioc/refOtherBeanPro/beans.xml"); ApplicationManager applicationManager = ctx.getBean( "applicationManager", ApplicationManager.class); applicationManager.getSessionTimeout(); applicationManager.getMaxTabPageNum(); }}
运行结果:
阅读全文
1 0
- Spring-引用Bean的属性值
- Spring配置中的bean引用其它bean的属性值
- Spring配置中的bean直接引用其它bean的属性值
- Spring使用注解的方式配置bean的属性-bean之间的引用关系
- Spring Bean的属性值定义
- spring学习笔记——引用bean的属性值,动态管理网站参数与菜单项
- Spring的bean属性配置
- spring bean 的 sigleton 属性
- spring bean的scope属性
- spring bean的scope属性
- Spring-bean的属性-2
- Spring bean的相关属性
- spring bean的scope属性
- spring Bean的集合属性
- Spring <property 的 ref 属性建立 bean 之前的引用关系
- Spring属性注入Bean的List属性
- Spring学习,引用在java类代码中的bean属性
- Spring @Resource 标签引用bean的方式
- PAT basic 1034
- 2017-08-07 NOIP模拟赛
- Collectioni List 集合
- PAT basic 1035
- PAT basic 1036
- Spring-引用Bean的属性值
- PAT basic 1037
- 安卓自定义相机,使用系统相机教程源码都有
- H5-----null和undefined的区别?
- 使用phantomjs.exe将网页链接保存成pdf、png等文件
- PAT basic 1038
- 实现listview手指快速滑动后抬起状态下图片数据加载优化
- 盒马-在路上的服务设计品牌
- PAT basic 1038