用@value注解的时候遇到过两次问题,下面说一下两次的解决思路
spring框架可以直接读取,前提是properties文件里有这些值
jdbc_driver=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/xxx
jdbc_username=root
jdbc_password=root
import ;
@Service(value = "sqlService")
public class SqlServiceImpl implements SqlService {
@Value("${jdbc_driver}")
private String jdbcDriver;
@Value("${jdbc_url}")
private String jdbcUrl;
@Value("${jdbc_username}")
private String jdbcUsername;
@Value("${jdbc_password}")
private String jdbcPassword;
@Override
public void fun(){}
}
第一次:是核心包没有引
<dependency>
<groupId></groupId>
<artifactId>spring-context</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-context-support</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-aop</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-web</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-webmvc</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-jdbc</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-test</artifactId>
<version>${}</version>
<scope>test</scope>
</dependency>
第二次:后来在另外一个工程里取不到值了,试了很多次,发现是在中的如下代码中有错误,代码如下
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="" />
正确代码如下,扫描controller包下的所有类时,controller包的地址没有写完整。
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="" />
【出错原因】是【无法识别占位符,就是在加载过程中直接把${jdbc_driver}当做字符串处理了】
整理一下错误流程:
我的工程里有一个和,前者先执行,有如下代码:
<bean id="decryptedPropertyPlaceholderConfigurer"
class="">
<property name="order" value="1"/>
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:*.properties</value>
<value>classpath*:</value>
<value>classpath*:</value>
</list>
</property>
</bean>
<!-- 自动扫描 -->
<context:component-scan base-package="">
<context:exclude-filter type="annotation"
expression="" />
<context:exclude-filter type="annotation"
expression="" />
</context:component-scan>
里面配置了数据库配置文件,并且自动扫描工程包下的所有文件,包括controller层和service层(带value注解的方法是写在service层里),在这时候是能正确的解析@value注解并且取到properties的值的;后来执行,由于扫描的路径填错成 base-package=”” ,它又把service层的@value注解扫描了,由于这个文件没有配置数据库配置文件,导致取不到值,把@value注解中的占位符当作字符串处理。