Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring-引用Bean的属性值

Spring-引用Bean的属性值

作者头像
小小工匠
发布于 2021-08-16 08:36:14
发布于 2021-08-16 08:36:14
73000
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
全面分析 Vue 的 computed 和 watch 的区别
computed 用来监控自己定义的变量,该变量在 data 内没有声明,直接在 computed 里面定义,页面上可直接使用。
呆呆
2021/12/01
2810
computed与watch的区别
程序媛夏天
2024/01/18
2610
Vue中computed和watch的区别
3.computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过的数据通过计算得到的
TimothyJia
2019/11/12
9060
Vue中computed和watch的区别
Vue中的computed和watch的区别
通过代码和gif可以看到当我输入框在变的情况下,b和c数据始终保持一致,这种效果项目中可能会用到。所以说很多人容易混淆,分不清用法。接下来就说说他们的用法和不同。
青年码农
2020/12/17
8350
Vue中的computed和watch的区别
Vue 里的 computed 和 watch 的区别 ?
计算属性将会混入到Vue的实例当中,所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。
青梅煮码
2023/01/16
5720
如何准备好一场vue面试
SSR也就是服务端渲染,也就是将Vue在客户端把标签渲染成HTML的工作放在服务端完成,然后再把html直接返回给客户端
bb_xiaxia1998
2022/11/07
5400
2023前端vue面试题(边面边更)_2023-03-01
key 是为 Vue 中 vnode 的唯一标记,通过这个 key,diff 操作可以更准确、更快速
yyds2026
2023/03/01
6230
最近面试被问到的vue题
如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。key 是为 Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确、更快速
bb_xiaxia1998
2022/11/16
6650
关于Vue在面试中常常被提到的几点(持续更新……
我们在业务组件中,会经常使用循环列表,当时用v-for命令时,会在后面写上:key,那么为什么建议写呢?
Vam的金豆之路
2021/11/30
9900
关于Vue在面试中常常被提到的几点(持续更新……
VueJS 基础知识
原理:<input type="text" :value="datax" @input="datax = $event.target.value">
老猫-Leo
2023/12/11
2470
VueJS 基础知识
vue的计算属性computed和监听器watch
1 <template> 2 <div> 3 this is A.vue <br> 4 <!--计算属性--> 5 <label for="msg">输入message:</label> 6 <input type="text" v-model="message" id="msg"> 7 <div>this is the reversedMessage: {{reversedMessage}}</div> 8 <
用户1149564
2018/12/03
8800
vue3.0 源码解析三 :watch和computed流程解析
之前我们分两个章节详细的介绍了vue3.0 数据相应原理,知道了用proxy代替Object.defineProperty 的利与弊,了解了依赖收集和派发更新的大致流程,知道了vue3.0响应式原理,这节我们一起研究vue3.0中的 watch 有那些变化。
用户6835371
2021/06/01
1.1K0
vue3.0 源码解析三 :watch和computed流程解析
前端一面常见vue面试题合集_2023-03-01
这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不举例展开介绍。
用户10358241
2023/03/01
7320
vue高频面试题合集(二)附答案
Vue 实现响应式并不是在数据发生后立即更新 DOM,使用 vm.$nextTick 是在下次 DOM 更新循环结束之后立即执行延迟回调。在修改数据之后使用,则可以在回调中获取更新后的 DOM。
helloworld1024
2022/08/11
1K0
常见经典vue面试题(面试必问)
如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。key 是为 Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确、更快速
bb_xiaxia1998
2022/12/14
9170
京东前端二面常见vue面试题及答案_2023-02-28
key 是为 Vue 中 vnode 的唯一标记,通过这个 key,diff 操作可以更准确、更快速
yyds2026
2023/02/28
5440
史上最强vue总结~万字长文---面试开发全靠它了
组件化:保留了react的优点,实现了html的封装和重用,在构建单页面应用方面有着独特的优势;
马克社区
2022/04/26
5350
前端一面必会vue面试题1
为什么要有这些模式,目的:职责划分、分层(将Model层、View层进行分类)借鉴后端思想,对于前端而已,就是如何将数据同步到页面上
bb_xiaxia1998
2022/12/19
9370
深入理解Vue中的计算属性与监听属性
在Vue.js这个构建用户界面的渐进式框架中,计算属性(Computed Properties)和监听属性(Watch Properties)是处理数据和响应式更新的两个核心特性。它们为开发者提供了不同的方式来操作和响应数据的变化,正确理解和合理运用这两个概念对于开发高效、可维护的Vue应用具有不可忽视的重要性。
Front_Yue
2025/01/12
1040
深入理解Vue中的计算属性与监听属性
百度前端一面必会vue面试题合集
综合实践类题目,考查实战能力。没有什么绝对的正确答案,把平时工作的重点有条理的描述一下即可
bb_xiaxia1998
2022/12/16
1.7K0
推荐阅读
相关推荐
全面分析 Vue 的 computed 和 watch 的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验