Spring 3支持@value注解的方式获取properties文件中的配置值,大简化了读取配置文件的代码。

在xml文件中配置properties文件

例如

cas.authn.mongo.collection.name=crmUser

cas.authn.mongo.db.host=mongodb://192.168.30.249:27017/testCrm
cas.authn.mongo.attributes=username,password,phone,crmRoles
cas.authn.mongo.username.attribute=username
cas.authn.mongo.password.attribute=password

在任意xml中加入

<util:properties id="casProperties" location="${cas.properties.config.location:/WEB-INF/cas.properties}"/>
    <context:property-placeholder properties-ref="casProperties"/>

在java文件中即可使用@value注解获取配置文件的值

@Repository("personMongoDB")
public class PersonMongoDB {

private static final Logger LOGGER = LoggerFactory
.getLogger(PersonMongoDB.class);

@Value("${cas.authn.mongo.collection.name:users}")
private String collectionName;

@Value("${cas.authn.mongo.db.name:cas}")
private String databaseName;

@Value("${cas.authn.mongo.db.host:}")
private String mongoHostUri;

@Value("${cas.authn.mongo.attributes:}")
private String attributes;

@Value("${cas.authn.mongo.username.attribute:username}")
private String usernameAttribute;

@Value("${cas.authn.mongo.password.attribute:password}")
private String passwordAttribute;

public void setMongoHostUri(final String mongoHostUri) {
this.mongoHostUri = mongoHostUri;
}

public void setCollectionName(final String collectionName) {
this.collectionName = collectionName;
}

public void setDatabaseName(final String databaseName) {
this.databaseName = databaseName;
}

public void setAttributes(final String attributes) {
this.attributes = attributes;
}

public void setUsernameAttribute(final String usernameAttribute) {
this.usernameAttribute = usernameAttribute;
}

public void setPasswordAttribute(final String passwordAttribute) {
this.passwordAttribute = passwordAttribute;
}

但是有可能@value注解的属性为null值。这种有可能是缺乏第三个步骤的原因。

确保使用@value的类已经注册为bean或者被spring扫描到

使用@value的类必须注册为spring的容器,所以需要注册为bean。

所以这里需要加上

<bean id="personMongoDB" class="self.PersonMongoDB" />

如果不注册为bean,使用spring来自动扫描也是可以的。

一般都是交给spring管理,controller 全部交给springMVC 去扫描的,spring 配置文件里把注解扫描时没有扫描controller,所有会取不到值。

context:component-scan 扫描多个包
 <context:component-scan base-package="com.aaa.service,com.aaa.util"/>

base-package这里扫描需要覆盖PersonMongoDB所在的路径。

被调用的类也必须选择注解的方式

如果前面三个步骤都做了还是null值,可以考虑这个原因:

原因是如果有注入bean的那个类,在被其他类作为对象引用的话(被调用)。这个被调用的类也必须选择注解的方式,注入到调用他的那个类中,不能用 new出来做对象,new出来的对象再注入其他bean就会 发生获取不到的现象。所以要被调用的javabean,都需要@service,交给Spring去管理才可以,这样他就默认注入了。

也就是 例如我上面的PersonMongoDB 在被使用时是不能

new  PersonMongoDB()来使用的,这样注解的属性不会进去。

只能用过注解来使用 PersonMongoDB。

所以我在配置文件中使用到它的bean里配置了PersonMongoDB。

<bean id="attributeRepository" p:backingMap-ref="attrRepoBackingMap"
p:personMongoDB-ref="personMongoDB" class="self.MongoDBPersonAttributeDao" />

<bean id="personMongoDB" class="self.PersonMongoDB" />

遇到问题---java---@value注解为null的更多相关文章

  1. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  2. lombok 简化java代码注解

    lombok 简化java代码注解 安装lombok插件 以intellij ide为例 File-->Setting-->Plugins-->搜索"lombok plug ...

  3. 深入理解Java:注解

    注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...

  4. Java Annotation 注解

    java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...

  5. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  6. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  7. Java之注解

    package com.demo.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementTy ...

  8. java 利用注解实现BaseDao 增删查改

    第一步,编写两个注解类,用于表明实体类对应的表名及字段. TableInfo.java 此注解用于标注表名及主键名 import static java.lang.annotation.Element ...

  9. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  10. JAVA配置&注解方式搭建简单的SpringMVC前后台交互系统

    前面两篇文章介绍了 基于XML方式搭建SpringMVC前后台交互系统的方法,博文链接如下: http://www.cnblogs.com/hunterCecil/p/8252060.html htt ...

随机推荐

  1. 如何在多机架(rack)配置环境中部署cassandra节点

    cassandra节点上数据的分布和存储是由系统自动完成的.除了我们要设计好partition key之外,在多机架(rack)配置环境中部署cassandra节点,也需要考虑cassandra分布数 ...

  2. Netty源码分析第2章(NioEventLoop)---->第3节: 初始化线程选择器

    Netty源码分析第二章:NioEventLoop   第三节:初始化线程选择器 回到上一小节的MultithreadEventExecutorGroup类的构造方法: protected Multi ...

  3. 从零系列--开发npm包(二)

    一.利用shell简化组合命令 set -e CVERSION=$(git tag | ) echo "current version:$CVERSION" echo " ...

  4. 第十四次ScrumMeeting博客

    第十四次ScrumMeeting博客 本次会议于12月3日(日)22时整在3公寓725房间召开,持续30分钟. 与会人员:刘畅.辛德泰.张安澜.方科栋. 1. 每个人的工作(有Issue的内容和链接) ...

  5. Scrum Meeting 5 -2014.11.11

    放假过掉一大半.大家都努力赶着进度,算法实现基本完成.可能还有些细小的改动,但也可以统一进入测试阶段了. 今天叫了部分在校人员开了个小会.任务决定以测试为主,同时开始进行服务器的部署. 在之前尝试服务 ...

  6. Sprint8

    进展:添加事件主界面实现之后,实现事件添加部分代码的编写,进行设置事件提醒,选择时间.

  7. 四则运算<C++>

    代码: #include<iostream> #define N 30 using namespace std; void main() { cout<<"***** ...

  8. XCODE的演变及使用经验分享

    IOS编程使用的是XCODE 编译器,安装XCODE你需要一台MAC(黑苹果也可以,个人不推荐,不稳定),然后直接去MAC上的APP STORE上下载安装就行,很简单,再次不做过多介绍... OK,那 ...

  9. golang type

    参考链接 https://blog.csdn.net/tzs919/article/details/53571632 type是golang中非常重要的关键字,常见的就是定义结构体,但是其功能远不止是 ...

  10. Think In Java读书笔记:内部类覆盖及其初始化

    本文相关章节:第十章 内部类 10.10 内部类可以被覆盖吗 在读至本节第二个范例代码时(及下方的代码),我对输出结果中的第一个“Egg.Yolk()”很不理解,为什么它会第一个地方输出. 我起初认为 ...