前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring-引用Bean的属性值

Spring-引用Bean的属性值

作者头像
小小工匠
发布于 2021-08-16 08:36:14
发布于 2021-08-16 08:36:14
77800
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

概述

将应用系统的配置信息存放在配置文件中并非总是最合适的,如果应用以集群的方式部署,或者希望在运行期动态调整引用的某些配置,这时,将配置信息放到数据库中不但方便集中管理,而且可以通过应用系统的管理界面动态维护,有效增强应用系统的可维护性。

早期版本,如果想在配置文件中引用另外一个Bean的属性值是比较麻烦的,Spring3.0则提供了优雅的解决方案. 在Spring3.0中,可以通过类似 #{beanName.beanPro}的方式方便的引用另外一个Bean的值。


实例

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

假设数据库中有张TEMP_SYS_CONFIG表,数据如下


基于XML方式的引用

beans.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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">

    
    <context:component-scan base-package="com.xgj.ioc.refOtherBeanProByXml"/>

    
    <bean id="sysConfig" class="com.xgj.ioc.refOtherBeanProByXml.SysConfig"
         init-method="initFromDB"/>

    
    <bean id="applicationManager" class="com.xgj.ioc.refOtherBeanProByXml.ApplicationManager"
        p:sessionTimeout="#{sysConfig.sessionTimeout}"
        p:maxTabPageNum="#{sysConfig.maxTabPageNum}"/>

    
     <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}"/>

    
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dataSource" />

beans>

SysConfig.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 paramList = new ArrayList();
        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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }

}

测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,实例化并缓存。

配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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">

    
    <context:component-scan base-package="com.xgj.ioc.refOtherBeanPro"/>

    
     <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}"/>

    
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dataSource" />

beans>

SysConfig.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

@Component
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
     */

    @PostConstruct
    public void initFromDB() {
        System.out.println("initFrom DB");
        final List paramList = new ArrayList();
        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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xgj.ioc.refOtherBeanPro;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public 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;
    }

}

测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();

    }
}

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/08/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Spring-使用加密的属性文件02
对于不敏感的属性信息,以明文形式出现在属性文件中是合适的,但是如果属性信息是数据库用户名和密码等敏感信息,一般希望以密文的方式保存。
小小工匠
2021/08/16
4260
Spring-使用外部属性文件01
在进行数据源或者邮件服务器等资源配置时,用户可以直接在Spring配置文件中配置用户名、密码、连接信息等,但是有一种更好的方法是将这些配置信息独立到一个外部属性文件中,并在Spring配置文件中通过形如{user}、{password}的占位符引用属性文件中的属性项。
小小工匠
2021/08/16
7630
Spring JDBC-使用Spring JDBC访问数据库
Spring JDBC是Spring所提供的持久层技术,它的主要目的降低JDBC API的使用难度,以一种更直接、更简洁的方式使用JDBC API。
小小工匠
2021/08/17
1.3K0
Spring-基于注解的配置[01定义Bean+扫描Bean]
不管是XML还是注解,他们都是在表达Bean定义的载体,其实质都是为Spring容器提供Bean定义的信息,在表现形式上都是将XML定义的内容通过类注解进行描述。
小小工匠
2021/08/16
6600
Spring-注入参数详解-[字面值及引用其他Bean]
在Spring配置文件中,不但可以将String、int等字面值注入bean中,还可以将集合、map等类型的数据注入Bean中, 此外还可以注入配置文件中其他定义的Bean.
小小工匠
2021/08/16
5260
Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置)
如果不想使用注解或者由于其他原因无法获得项目的源码等,Spring也支持使用XML的方式配置Spring Cache,主要是通过类似于aop:advice的cache:advice来进行的。
小小工匠
2021/08/17
3270
Spring-基于注解的配置[02自动装载bean]
@Autowired默认按照类型(byType)匹配的方式在容器中查找匹配的Bean,当且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
小小工匠
2021/08/16
4610
Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)
首先请阅读Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置),本篇博文基于XML的配置,使用了Ehcache缓存管理器。
小小工匠
2021/08/17
3810
Spring Cache-缓存概述及使用
伴随信息量的爆炸式增长以及构建的应用系统越来越多样化、复杂化,特别是企业级应用互联网化的趋势,缓存(Cache)对应用程序性能的优化变的越来越重要。 将所需服务请求的数据放在缓存中,既可以提高应用程序的访问效率,又可以减少数据库服务器的压力,从而让用户获得更好的用户体验。
小小工匠
2021/08/17
6.1K0
Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块
请参考上篇博文 Maven-EclipseEE使用Maven构建Java web项目从0到1
小小工匠
2021/08/16
8140
Spring-注入参数详解-[集合类型属性]
java.util包中的集合类型是最常用的结构数据类型,主要包括List、Set、Map、Properties。
小小工匠
2021/08/16
4150
Spring-依赖注入
此外Spring还支持工厂方法注入。 这篇博文我们将了解到不同注入方式的具体配置方法。
小小工匠
2021/08/16
5400
Spring-bean之间的关系
不但可以通过引用另外一个bean,建立起Bean和Bean之间的依赖关系, bean元素标签之间也可以建立类似的关系,完成一些特殊的功能。
小小工匠
2021/08/16
3940
Spring JDBC-使用注解配置声明式事务
除了基于XML的事务配置,Spring还提供了基于注解的事务配置,即通过@Transactional对需要事务增强的Bean接口、实现类或者方法进行标注:在容器中配置基于注解的事务增强驱动,即可以启用基于注解的声明式事务。
小小工匠
2021/08/17
3950
Spring-基于注解的配置[03Bean作用范围和生命周期方法]
通过注解配置的Bean和通过配置的Bean一样,默认的作用范围都是singleton。
小小工匠
2021/08/16
3360
Spring-基于Spring使用自定义注解及Aspect实现数据库切换
重写Spring的AbstractRoutingDataSource抽象类的determineCurrentLookupKey方法。
小小工匠
2021/08/16
5060
Spring-基于Java类的配置
JavaConfig是Spring的一个子项目,它旨在通过Java类的方式提供Bean的定义信息,在Spring4.0的版本,JavaConfig正式成为Spring4.0的核心功能。
小小工匠
2021/08/16
6120
Spring-事务
今天开始学习我自己总结的 Java-学习路线 中的《Spring-事务》,小简从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!
小简
2023/01/04
3560
Spring-事务
Spring JDBC-使用Spring JDBC获取本地连接对象以及操作BLOB/CLOB类型数据
我们在Spring-使用Spring JDBC访问数据库使用JDBC进行了CRUD(Create Retrieve Update Delete增删改查)以及调用存过的操作,这里我们将进一步了解一些高级的数据库操作知识,包括获取本地数据连接进行数据库相关的操作和如何操作BLOB、CLBO这些LOB数据。
小小工匠
2021/08/17
1.7K0
Spring-方法注入lookup、方法替换MethodReplacer接口
无状态Bean的作用域一般可以配置为singleton(单例模式),如果我们往singleton的Pilot类中注入prototype的Plane类,并希望每次调用Pilot的getPlane()方法都能返回一个新的plane Bean ,该怎么办呢?
小小工匠
2021/08/16
4660
推荐阅读
相关推荐
Spring-使用加密的属性文件02
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验