Spring注入需要初始化,但前面均使用硬编码注入,如:

JavaConfig配置:

 package soundSystem;

 import org.springframework.stereotype.Component;

 /**
* CompactDisc接口的实现类,此类中定义了CD的名字和作者以及打印相关信息的方法
* @author yan
*/
@Component("compactd")//用于扫描来动态生成bean
public class SgtPeppers implements CompactDisc{ private String title="K歌之王";
private String artist="陈奕迅";
@Override
public void cdInfo() {
System.out.print("This CD's title:"+title+";artist:"+artist);
} }

xml配置(需要实现setter方法):

     <bean id="cd" class="soundSystem.SgtPeppers">
<property name="title" value="L.O.V.E"></property>
<property name="artist" value="May Day"></property>
</bean>

Spring允许注入外部值,这样不用受到硬编码的限制:

--JavaConfig(显式bean)

主要是在配置类中实现:

1.在配置类类名上方添加注解@PropertySource("classpath:/sp.properties"),参数为文件全路径名,properties文件是专门用来存放k-v值对的;

2.在配置类中定义Environment env,并添加@AutoWired注解;

3.在定义bean的方法中使用env.getProperty()方法配置文件(*.properties)中的值来赋给bean作为参数。

 package com.spring.config;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment; import com.spring.custom.Person; @Configuration("com.spring.custom")
@ComponentScan(basePackages={"com.spring"})
@PropertySource("classpath:/sp.properties")
public class CreatureSpingConfig {
@Autowired
Environment env;
@Bean
public Person person(){
return new Person(env.getProperty("name"), env.getProperty("age",Integer.class), env.getProperty("sex"));
}
}

这样就实现了从外部文件注入的目标了。

注:getProperty("key值")返回的是String类型,但并不是所有参数都是String类型,所以这个方法有几个重载形式

解释如下:

 public interface PropertyResolver {  

     //是否包含某个属性
boolean containsProperty(String key); //获取属性值 如果找不到返回null
String getProperty(String key); //获取属性值,如果找不到返回默认值
String getProperty(String key, String defaultValue); //获取指定类型的属性值,找不到返回null
<T> T getProperty(String key, Class<T> targetType); //获取指定类型的属性值,找不到返回默认值
<T> T getProperty(String key, Class<T> targetType, T defaultValue); //获取属性值为某个Class类型,找不到返回null,如果类型不兼容将抛出ConversionException
<T> Class<T> getPropertyAsClass(String key, Class<T> targetType); //获取属性值,找不到抛出异常IllegalStateException
String getRequiredProperty(String key) throws IllegalStateException; //获取指定类型的属性值,找不到抛出异常IllegalStateException
<T> T getRequiredProperty(String key, Class<T> targetType) throws IllegalStateException; //替换文本中的占位符(${key})到属性值,找不到不解析
String resolvePlaceholders(String text); //替换文本中的占位符(${key})到属性值,找不到抛出异常IllegalArgumentException
String resolveRequiredPlaceholders(String text) throws IllegalArgumentException; }

这里列举的是PropertyResolver接口中定义的方法,是因为Environment继承了这个接口,上例中我们使用了第7行和第13行的getProperty的两种重载的形式,当然也可是设置默认值。



--JavaConfig(注解生成bean)演示@Value注解使用方式

实现类:

 package com.spring.beans;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component//自动生成bean
public class VCD implements CompactDisc{ private String title;
private String artist;
private int year; //定义有参构造
@Autowired//必须写,不写会报错(目前不知原因)
public VCD(@Value("${title}")String title, @Value("${artist}")String artist,@Value("${year}")int year) {
super();
this.title = title;
this.artist = artist;
this.year=year;}
@Override
public void play() {
System.out.println("Playing CD's title is"+title+",the artist is"+artist+",the year is"+year);
}
}

配置类:

 package com.spring.config;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment; @Configuration//表明这是一个Spring的配置类
@ComponentScan(value="com.spring")//表示需要扫描的包,因为演示所用为显式bean,所以其实这里没必要添加此注解
@PropertySource(value="classpath:propertiesSource.properties")
//@ImportResource("classpath:spring.xml")//引入XML配置文件
public class SpringConfig {
/**
* 因为采用混合配置,故注释掉重复bean及无用变量
*/
@Autowired
private Environment e; @Bean//要使用@Value注解需要添加此bean
public static PropertySourcesPlaceholderConfigurer pc(){
return new PropertySourcesPlaceholderConfigurer();
}
}

配置文件:

title=L.O.V.E
artist=May Day
year=2006

注:

  1. 要使用@Value需要添加PropertySourcesPlaceholderConfigurer类的bean;
  2. 需要在使用@Value处添加@AutoWired注解,否则会出错。


--XML(显式bean)

此处使用混合配置,以CD为例。

配置类:

 package com.spring.config;

 //import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Configurable;
//import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
//import org.springframework.context.annotation.PropertySource;
//import org.springframework.core.env.Environment; @Configuration//表明这是一个Spring的配置类
@ComponentScan(value="com.spring")//表示需要扫描的包,因为演示所用为显式bean,所以其实这里没必要添加此注解
//@PropertySource(value="classpath:propertiesSource.properties")
@ImportResource("classpath:spring.xml")//引入XML配置文件
public class SpringConfig {
/**
* 因为采用混合配置,故注释掉重复bean及无用变量
*/
// @Autowired
// private Environment e; // @Bean
// public CompactDisc cd(){
// return new VCD(e.getProperty("title"),e.getProperty("artist"));
// }
}

实现类:

 package com.spring.beans;
public class VCD implements CompactDisc{ private String title;
private String artist;
private int year;
//定义有参构造
public VCD(String title, String artist,int year) {
super();
this.title = title;
this.artist = artist;
this.year=year;
System.out.println("Playing CD's title is"+this.title+",the artist is"+this.artist+",the year is"+this.year);}
@Override
public void play() {}
}

在XML中:

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
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:property-placeholder location="classpath:propertiesSource.properties"/>
<bean id="cd" class="com.spring.beans.VCD" c:_0="${title}" c:_1="${artist}" c:_2="${year}">
</bean>
</beans>

配置文件中:

title=L.O.V.E
artist=May Day
year=2006

这样便可以实现从外部注入属性值了。

注意:

  1. 在XML配置中,要添加<context:property-placeholder/>标签,其属性location的值便为配置文件的路径,这与JavaConfig中的@PropertySource起同样的作用;
  2. 从例子中可以看出,构造器注入,可以使用c-命名空间来设置初始值,格式如:c:_index,index为构造器中参数的索引值,从0开始。而<context:property-placeholder/>标签是专门用来匹配属性占位符的,缺少此标签则不起作用。

2016-10-25 21:20:52

资料参考:

  1. Environment用法:http://blog.csdn.net/hdngbj/article/details/18003001#
  2. 混合配置用法:http://www.cnblogs.com/yw0219/p/5989865.html

Spring-注入外部值的更多相关文章

  1. SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean

    分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路 ...

  2. spring in action 学习笔记十:用@PropertySource避免注入外部属性的值硬代码化

    @PropertySource的写法为:@PropertySource("classpath:某个.properties文件的类路径") 首先来看一下这个案例的目录结构,重点看带红 ...

  3. Spring(八):Spring配置Bean(一)BeanFactory&ApplicationContext概述、依赖注入的方式、注入属性值细节

    在Spring的IOC容器里配置Bean 配置Bean形式:基于xml文件方式.基于注解的方式 在xml文件中通过bean节点配置bean: <?xml version="1.0&qu ...

  4. spring boot 使用拦截器 无法注入 配置值 、bean问题

    参考:https://www.cnblogs.com/SimonHu1993/p/8360701.html 一定要将 拦截器组件 交给spring容器进行管理,这样才能注入配置值,或者注入bean: ...

  5. spring读取classpath目录下的配置文件通过表达式去注入属性值.txt

    spring读取配置文件: 1. spring加载配置文件: <context:property-placeholder location="classpath:config/syst ...

  6. spring in action 学习十一:property placeholder Xml方式实现避免注入外部属性硬代码化

    这里用到了placeholder特有的一个语言或者将表达形式:${},spring in action 描述如下: In spring wiring ,placeholder values are p ...

  7. spring:为javabean的集合对象注入属性值

    spring:为JavaBean的集合对象注入属性值 在 spring 中可以对List.Set.Map 等集合进行配置,不过根据集合类型的不同,需要使用不同的标签配置对应相应的集合. 1.创建 Ts ...

  8. spring练习,使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出.要求如下: ...

  9. spring in action 学习十二:property placeholder 注解的方式实现避免注入外部属性硬代码化

    这里的注解是指@PropertySource这个注解.用@PropertySource这个注解加载.properties文件. 案例的目录结构如下: student.properties的代码如下: ...

随机推荐

  1. window 2008 定时任务调用bat不成功的解决方法

    之前一直有在一台XP的机器上调用定时任务.如今这台机器换成了window 2008的操作系统,调用一直不成功.只是在偶然之间攻克了. 选择"任务计划程序"     任务计划程序库 ...

  2. Python中的break和continue的使用方法

    一.continue的使用方法(结束当前的循序,进行下一个数的循环) # *************************************************************** ...

  3. iOS学习笔记37-时间和日期计算

    一.时间和日期计算 我们在应用开发中,时常须要和时间打交道,比方获取当前时间,获取两个时间点相隔的时间等等,在iOS开发中与时间相关的类有例如以下几个: 1. NSDate:表示一个绝对的时间点 2. ...

  4. jvm 性能调优 经验总结---转

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  5. js需要学习的

    1.js作用域 2.html5和css3 3.js面向对象 4.js原生ajax 5.js与后端交互 6.html5手机移动端页面练习 7.jquery中的jQuery UI框架和jQuery Eas ...

  6. Ubuntu设置root密码

    最初使用系统时,只有当前管理员的密码,root密码为随机生成的. 通过 sudo passwd 设置root密码,然后su获得root,也就是最高权限

  7. Session过期后自动跳转到登录页面

    最近研究如果用原生的Filter来判别session存在否或者过期否.来跳转到的页面实例,下载来展示代码. 因为顾虑器是每次请求能会进入的,所以可以设置了,进行拦截判断 1.配置web.xml < ...

  8. PHP MysqlI操作数据库

    1连接数据库. //procedural style $mysqli = mysqli_connect('host','username','password','database_name'); / ...

  9. POI生成EXCEL,公式不自动执行的有关问题

    POI生成EXCEL,公式不自动执行的问题 场景:POI读取Excel模板. 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式 ...

  10. swd 适配器接口线序

    1 vref 2 gnd 3 swdio FP1 4 swclk PF0 5 nrst 6 swo PF2