开发中,有些时候可能会工具类的静态方法,而这个静态方法中又使用到了@Resource注解后的变量。如果要直接使用 Utils.staticMethod(),项目会报异常;如果不直接使用,还要先 new Utils().staticMethod() 吧啦吧啦一大堆!对于一个强迫症码农不能忍! 那么,问题来了…

---------------------

例如下面代码:

/*** @Description 业务开关工具类

* @Author ZF

* @Date 2017/8/24 15:53*/

public classSwitchUtil {private static MyLogger log = MyLogger.getLogger(SwitchUtil.class);

@ResourceprivateSysConfigManager sysConfigManager;/*** 这是一个静态方法,这个方法中使用到了sysConfigManager这个由@Resource注解的变量

* 看似这样就可以使用了,其实不行,项目会报错。*/

public static booleangetSwitch(String code) {

String switchName= sysConfigManager.getSysConfigByCode("switch").getName();

JSONObject jsonObject=JSONObject.fromObject(switchName);returnjsonObject.getBoolean(code);

}

上面的代码启动报如下异常:

java.lang.IllegalStateException: @Resource annotation is not supported on static fields

修改后的代码

/*** @Description 业务开关工具类

* @Author ZF

* @Date 2017/8/24 15:53*/@Componentpublic classSwitchUtil {private static MyLogger log = MyLogger.getLogger(SwitchUtil.class);

@ResourceprivateSysConfigManager sysConfigManager;//维护一个本类的静态变量

public staticSwitchUtil switchUtil;//初始化的时候,将本类中的sysConfigManager赋值给静态的本类变量

@PostConstructpublic voidinit() {

switchUtil= this;

switchUtil.sysConfigManager= this.sysConfigManager;

}/*** 通过使用本类中维护的静态变量来使用sysConfigManager*/

public static booleangetSwitch(String code) {

String switchName= switchUtil.sysConfigManager.getSysConfigByCode("switch").getName();

JSONObject jsonObject=JSONObject.fromObject(switchName);returnjsonObject.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的属性(依赖注入))。

java 注解 静态变量_Spring中静态方法中使用@Resource注解的变量相关推荐

  1. java 静态调用非静态方法_java中静态方法中调用非静态方法的详解

    首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的:函数 前后顺序是先加载 ...

  2. java中静态方法中调用非静态方法的详解

    静态static方法中不能调用非静态(non-static)方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-stati ...

  3. java编写静态工具类_Java编程中静态内部类与同步类的写法示例

    java静态内部类 将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致.不过其细节方面仍然有很大的不同.具体来说,主要有如下几个地方要引起各位程序开发人员的注意. (一 ...

  4. java异步线程数_spring异步service中处理线程数限制详解

    情况简介 spring项目,controller异步调用service的方法,产生大量并发. 具体业务: 前台同时传入大量待翻译的单词,后台业务接收单词,并调用百度翻译接口翻译接收单词并将翻译结果保存 ...

  5. java 内存 静态_Java内存的 静态方法和实例方法的区别及使用场景

    注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...

  6. php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发

    php如何将字符串转成json_后端开发 php将字符串转成json的方法是:可以通过json_encode()函数来实现.json_encode()函数用于对变量进行JSON编码,该函数如果执行成功 ...

  7. java静态方法求n,java之静态属性和静态方法

    前言 静态属性和方法必须用static修饰符 static 可以修饰属性.方法.代码块.内部类 静态属性和非静态属性的区别: 1.在内存中存放位置不同   所有带static修饰符的属性或者方法都存放 ...

  8. php中静态方法的调用,php中静态方法和非静态方法如何相互调用?

    php中静态方法和非静态方法如何相互调用?2020-09-01 00:05:28 php中静态方法和非静态方法相互调用的方法:1.非静态方法调用静态方法: 可以[self]或者类名加[::]的形式调用 ...

  9. Java获取静态资源文件路径

    Java获取静态资源文件路径 ​ 开发中经常会有文件相关的操作,比如说文件的查找,文件的存储.但是在使用中往往会因为路径问题耽误大量的开发时间.在实际中常常通过File file = new File ...

最新文章

  1. MySQL的IFNULL函数
  2. Jquery的ajax在IE提交数据乱码解决方法
  3. 云炬Android开发笔记 5-1,2网络框架接口创建
  4. 为什么机器学习工程师用PyTorch的多于TensorFlow?
  5. TypeError: ‘int‘ object is not callable
  6. EV3 直接命令 - 第 2 课 让你的 EV3 做点什么
  7. python 重定向 ctf_3.CTF——python利用工具
  8. Serverless 实战 —— Serverless 的运行原理与组件架构
  9. 【零基础学Java】—Scanner类的使用( 十)
  10. 1、构造函数、静态代码块、构造代码块执行顺序
  11. 【智能制造】服装企业数字化转型之路
  12. STM32 硬件IIC OLED
  13. 上海黑马python培训
  14. Kotlin读书总结之面向对象
  15. 实习生如何在平淡无奇的工作中凸显自我价值?
  16. 多方位玩转“地平线新发布AIoT开发板——旭日X3派(Sunrise x3 Pi)” 插电!开机!轻松秒杀!
  17. 极智Coding | 剖析 darknet load_weights 接口
  18. String类型的测量长度
  19. 实例61小写字母转大写
  20. 启动redis失败 Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功

热门文章

  1. SAP Spartacus 的页面模型在SAP 电商云后台WCMS里的模型
  2. SAP Spartacus加载delivery region的实现
  3. SAP Spartacus取语言设置的入口程序
  4. SAP Spartacus里的StorefrontConfig静态类型
  5. ABAP Development Tool前后台交互的原理
  6. command exec make executable file not found in %PATH%
  7. when click one item in table Select at least one column to perform the search
  8. SAP Cloud for Customer里的ticket回复UI的实现
  9. CRM WebClient UI里标准configuration和custom configuration区别
  10. SAP CRM IBASE在ABAP update task中实现update和delete操作