Spring Aware
1、介绍
Spring的依赖注入的最大亮点就是你所以的Bean对Spring容器的存在是没有意思的。即你可以将你的容器换成别 的容器
在项目中,只有容器存在时,才可以调用Spring所提供的资源。
@Autowired 用在构造函数上
我们知道@Autowired 注释,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,此种方式就是在构造函数上使用@Autowired。
最后会介绍在静态方法中注入
2、简单的示例
程序清单
- 一个text文件
- 演示的bean,即AwareService
- 配置类 AwareConfig 类似于applicationContext.xml
- 程序入口,AwareMain
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
* @description: 依赖注入的使用
* 继承之后重新
* BeanNameAware 获取到容器中Bean的名称
* ResourceLoaderAware 获得记载器
*
* @author: Shenshuaihu
* @version: 1.0
* @data: 2019-05-25 00:24
*/
@Service
public class AwareService implements BeanNameAware, ResourceLoaderAware {
private String beanName;
private ResourceLoader loader;
@Override
public void setBeanName(String name) {
this.beanName = name;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.loader = resourceLoader;
}
public void outputResult() {
System.out.println("Bean的名称为:" + beanName);
Resource resource = loader.getResource("classpath:com/ch3/aware/test.txt");
try {
System.out.println("加载文件内容为:" + IOUtils.toString(resource.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @description: 配置类
* @author: Shenshuaihu
* @version: 1.0
* @data: 2019-05-25 00:35
*/
@Configuration
@ComponentScan("com.ch3.aware")
public class AwareConfig {
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @description: 运行
* @author: Shenshuaihu
* @version: 1.0
* @data: 2019-05-25 00:36
*/
public class AwareMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AwareConfig.class);
AwareService awareService = context.getBean(AwareService.class);
awareService.outputResult();
context.close();
}
}
3、深入理解
在项目中正常情况是直接自动注入的
@Service
public class SpitterUserDetailService implements UserDetailService {
@Autowired
public SpittleRepository spittleRepository;
}
或者是
@Service
public class SpitterUserDetailService implements UserDetailService {
public SpittleRepository spittleRepository;
@Autowired
public void setSpittleRepository(SpittleRepository spittleRepository) {
this.spittleRepository = spittleRepository;
}
如果出现静态的就尴尬了
4、拓展理解
在项目上,可能是在Utils类中,静态方法需要调用Service 会使用到自动注入,或者静态方向需要访问数据,咱需要静态方法时的注入
@Component
public class HttpUtil {
private static RedisTemplate redisTemplate;
/**
* 注入bean,可以使用静态方法
* @param redisTemplate redis
*/
@Autowired
public void setRedisTemplate(RedisTemplate redisTemplate) {
HttpUtil.redisTemplate = redisTemplate;
}
public static String postRest(String sysUrl, String tokenParam) {
String tokenKey = REDIS_KEY_TOKEN + sysUrl;
/**
* 每次请求都获取,改变成从redis中取 获取token,
* 如果redis不存在需要重新获取,如果执行失败了,需要重新获取
*/
String token = (String) redisTemplate.opsForValue().get(tokenKey);
return token;
}
}
例子2,参考于其他:
2. 使用 @PostConstruct 注解
@PostConstruct是Java EE 5引入来影响Servlet生命周期的注解,被用来修饰非静态的void()方法,@PostConstruct在构造函数之后执行,init()方法之前执行。
代码:
@Component
public class PropConfig {
@Autowired
private SysConfigService sysConfigService;
private static PropConfig propConfig;
@PostConstruct
public void init() {
propConfig = this;
propConfig.sysConfigService = this.sysConfigService;
}
public static Map<String, String> LoadPoperties(String filePath)
throws ConfigException {
List<SysConfig> configs = propConfig.sysConfigService.getSysConfigData();
return poperties;
}
}
参考文章
https://blog.51cto.com/zhengjiang/2141118
2019/05/25凌晨于成都
网友评论