用spring注解@Value绑定属性失败

环境:

  • eclipse Version: Luna Release (4.4.0)
  • spring 4.0
  • Junit4
  • 其他依赖包

描述:

JsrDAO类,在该类中使用了SpEL和spring注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.laowang.annotationBase;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ImportResource;
import org.springframework.stereotype.Repository;
("dao")
@ImportResource("classpath*:jdbc.properties")
public class {
@Value("${url}")
private String url;
@Value("${name}")
private String name;
@Value("${password}")
private String password;
public void save(){
System.out.println("jsr saving...");
System.out.println("url: "+url);
System.out.println("name: "+name);
System.out.println("password: "+password);
}
public void init(){
System.out.println("init jsrDAO Bean ...");
}
public void destroy(){
System.out.println("destroy jsrDAO Bean ...");
}
}

资源文件内容

url=http://localhost:3306/database
name=root
password=root

JavaConfig类,Bean的装配工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.laowang.annotationBase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.test.context.ContextConfiguration;
@Configuration
public class JavaConfig {
@Bean(name="dao", initMethod="init", destroyMethod="destroy")
public JsrDAO getJseDAO(){
return new JsrDAO();
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.laowang.annotationBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=JavaConfig.class)
public class TestA {
@Autowired
private JsrDAO jsDao;
@Test
public void testDAO(){
jsDao.save();
}

结果获得数据显示为

init jsrDAO Bean ...
jsr saving...
url: ${url}
name: ${name}
password: ${password}
destroy jsrDAO Bean ...

问题出现在用SpEL占位符绑定bean的三个属性没有成功,正确的结果应该是这样的

init jsrDAO Bean ...
jsr saving...
url: http://localhost:3306/database
name: root
password: root
destroy jsrDAO Bean ...

问题出现在哪里呢?按理说应该不会错的。于是百度、谷歌搜索,都没解决,最后去了spring官方文档看到正确使用方式

所以只需要修改JavaConfig文件就可以了,添加一行注解,变成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.laowang.annotationBase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath*:spring-annotationBase.xml")//这个必须要引入,否者得到配置文件中的值是有问题的,有了这个可以不用在JsrDAO中重配置了,多了也无妨
public class JavaConfig {
@Bean(name="dao", initMethod="init", destroyMethod="destroy")
public JsrDAO getJseDAO(){
return new JsrDAO();
}
@Bean
public JsrService getJsrService(){
JsrService service =new JsrService();
service.setJsrDAO(getJseDAO());
return service;
}
}

同时再添加一个对应的xml配置文件,指定属性配置文件的位置,此时JsrDAo中属性文件位置的指定也可以不用了。
下面是对应的xml文件

1
2
3
4
5
6
7
8
9
10
11
12
<?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: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:/properties/jdbc.properties"/>
</beans>

PS:下面补充一点知识

关于代理模式,如图

运行时注入

  1. 属性占位符(Property Placeholder)
  2. Spring 表达式语言SpEL

属性占位符(Property Placeholder)

加载资源配置文件后,通过环境对象(Environment)env获取配置文件内容,如

1
env.getProperty("jdbc.name");

具体使用要参考文档

解析属性占位符一般使用SpEL语言
SpEL语言特性如下:

  • 使用bean的ID来引用bean
  • 调用方法和访问对象的属性
  • 对值进行算术、关系和逻辑运算
  • 正则表达式匹配
  • 集合操作

“#{…}”=======表达式
“${…}”=======占位符

  • 字面常量
    “#{1}”=======计算结果为1

  • 引用bean、属性和方法
    “#{bean}”=======引用bean
    “#{bean.attr}”=======计算得到(引用)bean的属性
    “#{systemProperties[‘jdbc.name’]}”=======通过systemProperties对象引用系统属性(个人理解为引用形同加载配置文件中的属性的值)
    “#{bean.method()}”=======调用bean的方法
    “#{bean.method()?.toUpperCase()}”=======方法返回不为空时继续调用toUpperCase(),否则不调用

  • 在表达式中使用类型
    “#{T(java.lang.Math).random}”=======只能调用类的静态方法和常量

  • SpEL 运算符
    不说了

  • 计算正则表达式:文本(matches)正则表达式
    “#{admin.email matches ‘[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.com’}”=======邮件验证

  • 计算集合
    “#{bean.list[2].attr}”=======获取bean中结合list第3个元素的attr属性

SpEL 其他运算符

  • (.?[])对集合进行过滤。[]里面是表达式
    “#{bean.list.?[attr eq ‘laowang’]}”
  • .^[] 集合中查询第一个匹配项
  • .$[] 集合中查询最后一个匹配项

spring基于@Value绑定属Bean性失的更多相关文章

  1. Spring 基于Java的Bean声明

    Spring 基于Java的Bean声明 使用@Configuration进行设置: Xml: <?xml version="1.0" encoding="UTF- ...

  2. Spring框架入门之基于xml文件配置bean详解

    关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一.Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入 构造方法注入 工厂方法注入(很少使用,不推荐,本 ...

  3. Spring框架入门之基于Java注解配置bean

    Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...

  4. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring基于XML装配Bean

    Bean 的装配可以理解为依赖关系注入,Bean 的装配方式也就是 Bean 的依赖注入方式.Spring 容器支持多种形式的 Bean 的装配方式,如基于 XML 的 Bean 装配.基于 Anno ...

  5. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  6. Spring实战3:装配bean的进阶知识

    主要内容: Environments and profiles Conditional bean declaration 处理自动装配的歧义 bean的作用域 The Spring Expressio ...

  7. Spring MVC资源绑定视图解析器

    ResourceBundleViewResolver使用属性文件中定义的视图bean来解析视图名称. 以下示例显示如何使用Spring Web MVC框架中的ResourceBundleViewRes ...

  8. 002-Spring4 快速入门-项目搭建、基于注解的开发bean,Bean创建和装配、基于注解的开发bean,Bean初始化销毁、Bean装配,注解、Bean依赖注入

    一.项目搭建 1.项目创建 eclipse→project explorer→new→Project→Maven Project 默认配置即可创建项目 2.spring配置 <dependenc ...

  9. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

随机推荐

  1. ZJNU 1699 - Bits

    可得应当优先寻找最大的2^n-1这个数 如果l的位数不等于r的位数,那么这个数 2^n-1 就是最优解(每一位全为1) 如果l和r的位数相同,先看r是否符合 2^n-1,符合直接返回,不符合的话拆除最 ...

  2. 运行SQL文件报错Invalid ON UPDATE clause for 'create_date' column

    Invalid ON UPDATE clause for 'create_date' column   原因: 高版本的mysql导数据到低版本出现的问题 日期类型报错 MySQL 5.5 每个表只允 ...

  3. MySQL--存储引擎的特性

    常用存储引擎的对比 特点 MyISAM InnoDB MEMORY MERGE NDB 存储限制 有 64TB 有 没有 有 事务安全   支持       锁机制 表锁 行锁 表锁 表锁 行锁 B树 ...

  4. docker 一些简略环境搭建及部分链接

    1.center 7  搭建 docker https://www.cnblogs.com/yufeng218/p/8370670.html 2.docker 命令 https://www.cnblo ...

  5. Python笔记_第三篇_面向对象_1.面向对象的基本概念和作用域

    1. 软件编程的实质: 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程.重要的是思想,代码技术反而次要.因此思想也是最难的,突破固定的思想是关键 2. 什么是面向过程: * 自上而下顺序执 ...

  6. 0.3W微功率放大器

    电路结构 电路摘自<晶体管电路设计(上)>. 电路采用+5V单电源供电,两级结构.Tr1构成共射极放大电路作为电压放大级:Tr3,Tr4构成推挽的射极跟随器作为输出级:Tr2作为射极跟随器 ...

  7. SaltSatck常用指令一

    1.查看版本号: salt --version [root@master ~]# salt --version salt (Fluorine) [root@master ~]# 2.显示依赖关系及版本 ...

  8. vue开发之图片加载不出来问题解决

    在使用vue开发项目的时候,经常会遇到的一个问题就是:图片加载不出来.下面是我总结的几种图片加载不出来的情况及解决办法. 一.项目打包完成后,打开整体空白 1.路径问题 原因 在vue+webpack ...

  9. Nmap_使用介绍

    Nmap 注意,本文仅是作为课余时间的学习了解,请不要做有关违反法律法规的事情,违者自行承担后果!!! 环境centos7.7yum -y install nmap 命令操作 1.扫描单个目标 1. ...

  10. S5P4418开发板android源码下uboot和内核缺省文件的配置

    uboot 需要配置缺省文件,进入解压的源码目录 android,然后进入 u-boot 目录,如下图所示.如上图所示,如果是 1G 核心板,则使用“cp nsih-1G16b-4418.txt ns ...