java 注解 静态变量_Spring中静态方法中使用@Resource注解的变量
开发中,有些时候可能会工具类的静态方法,而这个静态方法中又使用到了@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注解的变量相关推荐
- java 静态调用非静态方法_java中静态方法中调用非静态方法的详解
首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的:函数 前后顺序是先加载 ...
- java中静态方法中调用非静态方法的详解
静态static方法中不能调用非静态(non-static)方法,准确地说是不能直接调用non-static方法.但是可以通过将一个对象的引用传入static方法中,再去调用该对象的non-stati ...
- java编写静态工具类_Java编程中静态内部类与同步类的写法示例
java静态内部类 将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致.不过其细节方面仍然有很大的不同.具体来说,主要有如下几个地方要引起各位程序开发人员的注意. (一 ...
- java异步线程数_spring异步service中处理线程数限制详解
情况简介 spring项目,controller异步调用service的方法,产生大量并发. 具体业务: 前台同时传入大量待翻译的单词,后台业务接收单词,并调用百度翻译接口翻译接收单词并将翻译结果保存 ...
- java 内存 静态_Java内存的 静态方法和实例方法的区别及使用场景
注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...
- php类如何变为静态调用,PHP类中静态方法如何调用非静态方法?_后端开发
php如何将字符串转成json_后端开发 php将字符串转成json的方法是:可以通过json_encode()函数来实现.json_encode()函数用于对变量进行JSON编码,该函数如果执行成功 ...
- java静态方法求n,java之静态属性和静态方法
前言 静态属性和方法必须用static修饰符 static 可以修饰属性.方法.代码块.内部类 静态属性和非静态属性的区别: 1.在内存中存放位置不同 所有带static修饰符的属性或者方法都存放 ...
- php中静态方法的调用,php中静态方法和非静态方法如何相互调用?
php中静态方法和非静态方法如何相互调用?2020-09-01 00:05:28 php中静态方法和非静态方法相互调用的方法:1.非静态方法调用静态方法: 可以[self]或者类名加[::]的形式调用 ...
- Java获取静态资源文件路径
Java获取静态资源文件路径 开发中经常会有文件相关的操作,比如说文件的查找,文件的存储.但是在使用中往往会因为路径问题耽误大量的开发时间.在实际中常常通过File file = new File ...
最新文章
- MySQL的IFNULL函数
- Jquery的ajax在IE提交数据乱码解决方法
- 云炬Android开发笔记 5-1,2网络框架接口创建
- 为什么机器学习工程师用PyTorch的多于TensorFlow?
- TypeError: ‘int‘ object is not callable
- EV3 直接命令 - 第 2 课 让你的 EV3 做点什么
- python 重定向 ctf_3.CTF——python利用工具
- Serverless 实战 —— Serverless 的运行原理与组件架构
- 【零基础学Java】—Scanner类的使用( 十)
- 1、构造函数、静态代码块、构造代码块执行顺序
- 【智能制造】服装企业数字化转型之路
- STM32 硬件IIC OLED
- 上海黑马python培训
- Kotlin读书总结之面向对象
- 实习生如何在平淡无奇的工作中凸显自我价值?
- 多方位玩转“地平线新发布AIoT开发板——旭日X3派(Sunrise x3 Pi)” 插电!开机!轻松秒杀!
- 极智Coding | 剖析 darknet load_weights 接口
- String类型的测量长度
- 实例61小写字母转大写
- 启动redis失败 Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功
热门文章
- SAP Spartacus 的页面模型在SAP 电商云后台WCMS里的模型
- SAP Spartacus加载delivery region的实现
- SAP Spartacus取语言设置的入口程序
- SAP Spartacus里的StorefrontConfig静态类型
- ABAP Development Tool前后台交互的原理
- command exec make executable file not found in %PATH%
- when click one item in table Select at least one column to perform the search
- SAP Cloud for Customer里的ticket回复UI的实现
- CRM WebClient UI里标准configuration和custom configuration区别
- SAP CRM IBASE在ABAP update task中实现update和delete操作