Spring中静态方法中使用@Resource注解的变量
开发中,有些时候可能会工具类的静态方法,而这个静态方法中又使用到了@Resource注解后的变量。如果要直接使用 Utils.staticMethod(),项目会报异常;如果不直接使用,还要先 new Utils().staticMethod() 吧啦吧啦一大堆!对于一个强迫症码农不能忍! 那么,问题来了…
---------------------
- 例如下面代码:
/**
* @Description 业务开关工具类
* @Author ZF
* @Date 2017/8/24 15:53
*/
public class SwitchUtil { private static MyLogger log = MyLogger.getLogger(SwitchUtil.class); @Resource
private SysConfigManager sysConfigManager; /**
* 这是一个静态方法,这个方法中使用到了sysConfigManager这个由@Resource注解的变量
* 看似这样就可以使用了,其实不行,项目会报错。
*/
public static boolean getSwitch(String code) {
String switchName = sysConfigManager.getSysConfigByCode("switch").getName();
JSONObject jsonObject = JSONObject.fromObject(switchName);
return jsonObject.getBoolean(code);
}- 上面的代码启动报如下异常:
- java.lang.IllegalStateException: @Resource annotation is not supported on static fields
- 修改后的代码
/**
* @Description 业务开关工具类
* @Author ZF
* @Date 2017/8/24 15:53
*/
@Component
public class SwitchUtil { private static MyLogger log = MyLogger.getLogger(SwitchUtil.class); @Resource
private SysConfigManager sysConfigManager; // 维护一个本类的静态变量
public static SwitchUtil switchUtil; // 初始化的时候,将本类中的sysConfigManager赋值给静态的本类变量
@PostConstruct
public void init() {
switchUtil = this;
switchUtil.sysConfigManager = this.sysConfigManager;
} /**
* 通过使用本类中维护的静态变量来使用sysConfigManager
*/
public static boolean getSwitch(String code) {
String switchName = switchUtil.sysConfigManager.getSysConfigByCode("switch").getName();
JSONObject jsonObject = JSONObject.fromObject(switchName);
return jsonObject.getBoolean(code);
}下面简单介绍一下相关注解
- 1.@Component
- 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
2.@Resource
Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分别 是 name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使 用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;
---------------------
3. @PostConstruct
- 在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。
Spring中静态方法中使用@Resource注解的变量的更多相关文章
- java中静态方法中为什么不能使用this、super和直接调用非静态方法
这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆 ...
- PHP 类中静态方法调用非静态方法
静态方法调用非静态方法: 在类中静态方法中,需要实例化对象,然后再调用类中的方法 非静态方法调用静态方法: 可以self 或者 类名加::的形式调用 如下面的案例: <?php class A{ ...
- Autowried注解和Resource注解的区别
目录 1.概述 2.Autowried 3.Resource 4.总结 1.概述 在使用Spring框架的过程中, 依赖注入是必须的, 大多时候会使用Autowried注解来进行依赖注入, 但是也可以 ...
- (转)用@Resource注解完成属性装配
http://blog.csdn.net/yerenyuan_pku/article/details/52858878 前面我们讲过spring的依赖注入有两种方式: 使用构造器注入. 使用属性set ...
- Spring中@Autowired注解、@Resource注解的区别 (zz)
Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...
- Spring中Autowired注解,Resource注解和xml default-autowire工作方式异同
前面说到了关于在xml中有提供default-autowire的配置信息,从spring 2.5开始,spring又提供了一个Autowired以及javaEE中标准的Resource注释,都好像可以 ...
- Spring中@Resource注解报错
描述:Spring框架中,@Resource注解报错,在书写时没有自动提示 解决方法:因为maven配置文件的pom.xml文件中缺少javax.annotation的依赖,在pom.项目路中加入依赖 ...
- Spring中 @Autowired注解与J2EE@Resource注解的区别
在开发中经常使用到@Autowired和@Resource进行装配. 不禁好奇这两个注解的差异在何处??? 相同点: @Resource的作用相当于@Autowired,均可标注在字段或属性的sett ...
- Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
随机推荐
- 2019 中至数据java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中至数据等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中至数据,入职一年时间了,也成为了面 ...
- Java自学-接口与继承 final
Java的修饰符final final修饰类,方法,基本类型变量,引用的时候分别有不同的意思. 示例 1 : final修饰类 当Hero被修饰成final的时候,表示Hero不能够被继承 其子类会出 ...
- java读取Properties文件的方法
resource.properties的内容: com.tsinkai.ettp.name=imooc com.tsinkai.ettp.website=www.imooc.com com.tsink ...
- windows创建虚拟环境
mkvirtualenv --no-site-packages --python=C:\Python36\python.exe MyCrawler
- iodine dig A
(base) bonelee@bonelee-VirtualBox:~/Desktop$ dig paeadgpy.abc.com @45.32.247.94 ; <<>> D ...
- Appium连接夜神模拟器,模拟手势点击(tap)
# -*- coding:utf-8 -*- from appium import webdriver from time import sleep desired_caps ={ 'platform ...
- selenium安装
pip安装 pqi优化pip下载速度 pip install selenium pip install --upgrade selenium pip show selenium 离线安装 官网下载se ...
- Ubuntu 18.04 环境下安装 Matlab2018
由于实验环境要求,最近在 Ubuntu 18.04 上安装了 Matlab2018b , 这里简单记录过程. (1) 首先是获取对应的 Matlab2018b 的安装包,这里笔者是在一个外国的网站上获 ...
- MySQL中的内连接、左连接、右连接、全连接、交叉连接
创建两个表(a_table.b_table),两个表的关联字段分别为:a_table.a_id和b_table.b_id CREATE TABLE a_table ( a_id int NOT NUL ...
- spark——故障排除
故障排除一:控制reduce端缓冲大小以避免OOM 在Shuffle过程,reduce端task并不是等到map端task将其数据全部写入磁盘后再去拉取,而是map端写一点数据,reduce端task ...