Spring学习(四)引用外部属性文件、自动装配_spring factory 配置文件自动装配-程序员宅基地

技术标签: 软件测试  编程语言  

引用外部属性文件:

当bean的配置信息逐渐增多时,查找和修改一些bean的配置信息变得更加困难。这时,可以将一部分信息提取到bean配置文件的外部,以properties格式的属性文件保存起来,同时在bean的配置文件中引用properties属性文件中的内容,从而实现一部分属性值在发生变化时只修改properties文件即可。这种技术多用于连接数据库的基本信息的配置

以连接数据库的基本信息的配置为例:

①导入druid的jar包和mysql驱动

 

②新建datesource.xml文件

 

	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource" p:driverClassName="com.mysql.jdbc.Driver"
	p:url="jdbc:mysql://localhost:3306/test" p:username="ztt" p:password=123">
	</bean>

测试类:

package com.ztt.spring;

import java.sql.SQLException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.druid.pool.DruidDataSource;

public class Test {
	public static void main(String[] args) throws SQLException{
		ApplicationContext ac = new ClassPathXmlApplicationContext("datasource.xml");
		DruidDataSource bean = ac.getBean("datasource",DruidDataSource.class);
		System.out.println(bean.getConnection());
	}
}

运行结果:

com.mysql.jdbc.JDBC4Connection@5b6feec0

或者以properties方式配置,新建一个db.properties文件:

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/test
jdbc.username = ztt
jdbc.password = 123

①通过bean标签加载资源文件,${}从spring加载的资源文件中通过键获得值

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="db.properties"></property>
	</bean>
	
	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

②通过context标签加载资源文件,设置资源文件路径(需引入context标签)

	<context:property-placeholder location="db.properties"/>
	<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

自动装配(属性必须是非字面量的属性):

概念:

①以value或ref的方式明确指定属性值都是手动装配

②根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中

装配模式(autowire属性,取值有byType和byName):

①根据类型(byType)自动装配:将类型匹配的bean作为属性注入到另一个bean中,若IOC容器中有多个与目标bean类型一致的bean,Spring将无法判断哪个bean最适合该属性,所以不能执行自动装配

②根据名称(byName)自动装配:必须将目标bean的名称和属性名设置的完全相同

③通过构造器自动装配:当bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用

示例:

根据类型(byType),需注意类型兼容问题,bean管理的对象可以给父类赋值,也可以给实现的接口赋值:

	<bean id="ccc" class="com.ztt.spring.Car" p:brand="Audi" p:price="888888"></bean>
	<bean id="person" class="com.ztt.spring.Person" autowire="byType">
		<property name="name" value="ztt"></property>
		<property name="age" value="18"></property>
	</bean>

根据名称(byName):

	<bean id="car" class="com.ztt.spring.Car" p:brand="Audi" p:price="888888"></bean>
	<bean id="person" class="com.ztt.spring.Person" autowire="byName">
		<property name="name" value="ztt"></property>
		<property name="age" value="18"></property>
	</bean>

因为Person类中有一个属性名为car,所以必须有一个id为car的bean

问题:

当设置autowire属性,会作用于该bean中所有非字面量属性,但是有时候并不需要为全部属性赋值,所以,以上两种方式都不使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ztt1985/article/details/104860499

智能推荐

将字符串中的英文大写字母换成小写字母-c语言实现_字符串大小写转换c语言-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏10次。其实原理很简单,让我们来来看ascll表,就一目了然了.我们来对比一下大小写字母对应的十进值,A 是81,a 是113,B 82 b 114 可以很明显的发现差值是固定的 ,a-A==b-B,所以我们把一个大写字母加上这个差值,它就变成了小写字母,反之一个小写字母减去这个差值,就变成了大写字母.代码实现#include<stdio.h>#include<string.h>int main(){char str[] = { "HeLLo World..._字符串大小写转换c语言

BZOJ 3674 可持久化并查集加强版(路径压缩版本)-程序员宅基地

文章浏览阅读49次。/*bzoj 3674: 可持久化并查集加强版http://www.lydsy.com/JudgeOnline/problem.php?id=3674用可持久化线段树维护可持久化数组从而实现可持久化并查集可持久化线段树+并查集+路径压缩+读入优化*/#include <cstdio>#include <algorithm>using na..._可持久化并查集路径压缩

mysql case left join_一个复杂的mysql查询语句(case,when,then,left join )-程序员宅基地

文章浏览阅读1.1k次。select `a`.`id` AS `id`,`a`.`UserName` AS `UserName`,(case when (`a`.`sRegDate` = _utf8'1990-01-01 00:00:00.0') then _utf8'' else cast(date_format(`a`.`sRegDate`,_utf8'%Y-%m-%d %H:%i:%S') as char char..._mysql case when left join

oracle大量表导入mysql_大神们,从oracle 数据库迁移到mysql数据库哪个工具好用?数据量很大,100多g?...-程序员宅基地

文章浏览阅读241次。从oracle 数据库迁移到mysql数据库,其实方法还是很多的,根据自己的需求来选择:1、SQL LOAD最简单的数据迁移方式。第一步把Oracle的数据导成CSV或者SQL,然后再load或者source到MySQL中就可以了。2、Python第一步建立配置表,同时和MySQL的表进行mapping,标识出是全量的还是增量的,如果是增量的,以什么做为增量来处理。第二步就是根据mapping进行..._oracle数据库如何增量导入到mysql

access笔试答案_ACCESS数据库考试试题及答案-程序员宅基地

文章浏览阅读809次。一、单项选择题(本大题共25小题,每小题1分,共25分)在每小题列出的四个备用选项中只有一个符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1、数据库系统的数据管理方式中,下列说法中不正确的是[C]A.数据库减少了数据冗余B.数据库中的数据可以共享C.数据库避免了一切数据的重复D.数据库具有较高的数据独立性2、数据库系统的核心是[A]A.数据库管理系统B.数据库C.数据模型D..._access 数据库考试试卷

c语言lcm函数的头文件,LCM中C++的API介绍-程序员宅基地

文章浏览阅读1.8k次。LCM支持多种语言,也有很多版本,这里只介绍C++的几个类以及方法。类型简介C++的API,LC提供了三个类以及两个结构体来封装LCM,他们分别是:class lcm::LCMstruct lcm::ReceiveBufferclass lcm::Subscriptionstruct lcm::LogEventclass lcm::LogFile两个struct是配合类来使用的。前..._lcm_eventlog_write_event

随便推点

海思芯片怎么使用tde给qt加速_对于嵌入式,Qt值得学习吗?-程序员宅基地

文章浏览阅读262次。qt值得学习吗?嵌入式要学的东西真的很多,我们可能会说不写界面的话就不用学qt了?我不赞同。Qt的实现主要是采用p-impl手法,实现接口与实现分离,它有很好的消息循环机制,有的对象与线程的相关性,它也有借助moc生成反射元信息,这种设计方法至今仍然非常适用。qt内核部分其实是完全和界面无关的,你完全可以抛开Qt GUI部分来学习和使用Qt。当你完完全全学习了qt及其理念后,你会发现写优雅的代码是..._qt tde

CentOS7 Thinkpad T450 安装Intel Wireless 7265-N无线网卡驱动_iwlwifi-firmware-iwl7265d-程序员宅基地

文章浏览阅读1w次。CentOS7 uname -r 3.10.0-327.el7.x86_64笔记本Thinkpad T450 自带的Intel Wireless 7265-N 无法驱动的解决方法通过 modinfo iwlwifi 和 dmesg |grep firmware 发现缺少相应版本的固件。下载后放到/lib/firmware目录即可。1.dmesg |gre_iwlwifi-firmware-iwl7265d

Tapdata 与优炫数据库完成产品兼容性互认证_优炫数据库管理系统v2.1是基于什么sql-程序员宅基地

文章浏览阅读214次。近日, Tapdata 实时数据平台与优炫数据库管理系统完成产品兼容互认证。经严格测试,结果证实 Tapdata实时数据平台与优炫数据库管理系统 V2.1 完全兼容,运行稳定,可为各类信息化应用提供保障。这表明 Tapdata 已进一步覆盖金融、能源、医疗、教育等主流行业生态场景,实现更广泛的数据源连接与打通。..._优炫数据库管理系统v2.1是基于什么sql

java.util.zip.ZipInputStream读取zip文件采坑记录_java.util.zip.inflaterinputstream.read-程序员宅基地

文章浏览阅读4.4k次,点赞6次,收藏2次。问题描述最近做个东西,需求是这样的。web端上传一个zip的Java应用部署包到Linux服务器上的指定目录下,我负责后端。zip包目录结构是这个的:· conf # 该目录下存放app配置文件· lib # 该目录下存放app用到的jar包需求很简单,于是开始实现,主体代码也就是下面这样子。byte[] buf = new byte[1024];try (ZipInputStre..._java.util.zip.inflaterinputstream.read

SystemInit解析和SetSysClock()_fnsysclkinit-程序员宅基地

文章浏览阅读468次。void SystemInit(void){ /* FPU settings 浮点运算单元设置,此处一般不执行---------------------------*/ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL << 10*2)|(3UL << ..._fnsysclkinit

CSDN AI写作助手:提升创作力,引领未来_csdnai写手-程序员宅基地

文章浏览阅读5.3k次。随着科技的不断进步,AI技术的发展正影响着世界各个领域。CSDN AI写作助手——InsCode AI创作助手,凭借其独特的对话式AI和高效创作支持,成为了一个值得期待的创新工具。在本文中,我们将探讨这类AI工具的使用体验、技巧以及未来的发展趋势与影响。_csdnai写手

推荐文章

热门文章

相关标签