spring @Value注解的使用,有三种形式:1.是加载properties文件或者配置文件,从这些文件中获取;2.是任意代码中初始赋值,如固定或者数据库初始赋值;3.是动态更新赋值,用@refreshScope注解;本篇交流下第2种的任意代码初始赋值形式,下面是例子代码:
package com.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.env.MapPropertySource;
import org.springframework.stereotype.Component;
import com.test.dao.MemberDao;
import com.test.member.MemberEntity;
@Component
public class DbUtil implements ApplicationContextAware{
@Autowired
MemberDao memberDao;
public Map<String , Object> getMailInforFromDb(){
MemberEntity t = new MemberEntity();
t.setId(2);
t.setStatus("NORMAL");
t.setGroupId(238);
System.out.println("memberDao : " + memberDao);
List<MemberEntity> list = memberDao.searchMember(t);
Map<String, Object> result = new HashMap<>();
// 固定值
result.put("mail.host", "smtp.qq.com");
result.put("mail.username", "java");
result.put("mail.password", "123456");
// 数据库获取值
result.put("member.size", list.size());
return result;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// TODO Auto-generated method stub
this.applicationContext = applicationContext;
System.out.println("DbUtil获取容器 : " + applicationContext);
GenericApplicationContext contextTemp = (GenericApplicationContext) applicationContext;
// 模拟从DB中获取配置信息
Map<String, Object> mailInfoFromDb = this.getMailInforFromDb();
// 将其丢在MapPropertySource中(MapPropertySource类是spring提供的一个类,是PropertySource的子类)
MapPropertySource mailPropertySource = new MapPropertySource("mail", mailInfoFromDb);
// 将mailPropertySource丢在Environment中的PropertySource列表的第一个中,让优先级最高
contextTemp.getEnvironment().getPropertySources().addFirst(mailPropertySource);
}
}