springboot实战之获取工具类bean

  这次的实践经验的起因在于,在开发中,我想在工具类中使用配置文件的变量值。通常使用@value注解,这个只能在spring中管理的bean总获取。之前我也很疑惑,为什么之前的开发人员会在SpringUtil类上加入@Component注解,今天又遇到这种情况,其原因完全理解了。

@Component
public class SpringUtil implements EnvironmentAware {
    private static Environment env;
    public static String getProperty(String key){
        return env.getProperty(key);
    }
    @Override
    public void setEnvironment(Environment environment) {
        injectEnvironment(env); // 因为spring会创建这个接口的实现类的一个对象,所以实例方法调用静态方法,只是目前这个类我们是看不到的
    }
    public  static void injectEnvironment(Environment env){
        SpringUtil.env = env;  // 这其实是实例方法调用静态方法
    }
}

  这个原理很简单,就是实例方法调用静态方法,所以还是生成了对象,只生产了一个工具类对象,而不是很多,这很java,很spring。相应的,@Service注解的也是单例(这应该是基于方法是天然并行的,每次调用方法,都会生成自己的数据栈),也可以看到,这spring中使用对象很合适,可以忽略创建对象的开销。

  学习spring,我们都知道spring的一个重要功能就是对象管理。那么一个重要的问题就是:我们如何获取我们想要的Bean?spirng中有没有一个静态类,通过名字直接获取对象。很抱歉,这不是spring的正确打开方式,虽然使用静态类是多么的直白,但是spring并没这样实现。通常的做法也是同上,就是通过spirng注入ApplicationContext对象,这就是一个bean容器,然后就可以获得我们想要获得的类了。很报谦,你也无法自己new 一个ApplicationContext对象,这也许是保持运行环境中只有一个ApplicationContext对象吧。

  单例就是一种简洁美。至于为什么使用单例而不使用静态类,我觉得原因有二:1.单例的创建和销毁方遍,可以在不使用时节约资源2.我们继承的类,大多数是实例方法和实例变量(至于为甚是实例方法和实例变量,应该是很绝大多数类都要实例化,并且可能有多个对象),那么继承的时候就是实例方法和实例变量,可以说这是面向对象编程风格在单例情况下的影响。单例的缺点可能就是生成对象的开销,现在这已经不算什么了。

  对象一般比类丰满,嗯,这是经验。

原文地址:https://www.cnblogs.com/Robin008/p/11595212.html

时间: 2024-08-05 02:48:15

springboot实战之获取工具类bean的相关文章

系统内存信息获取工具类

/** * 得到系统内存信息的工具类 * @author zwenkai */ public class SystemInfoUtils { /** * 得到运行的进程总个数 * * @param context * @return 运行进程个数 */ public static int getRunningProcessCount(Context context) { ActivityManager am = (ActivityManager) context.getSystemService

Android设备网络、屏幕尺寸、SD卡、本地IP、存储空间等信息获取工具类

Android设备网络.屏幕尺寸.SD卡.本地IP.存储空间.服务.进程.应用包名等信息获取的整合工具类. 1 package com.qiyu.ddb.util; 2 3 import android.annotation.SuppressLint; 4 import android.annotation.TargetApi; 5 import android.app.Activity; 6 import android.app.ActivityManager; 7 import androi

Spring-Boot ? ShapeFile文件读写工具类+接口调用

一.项目目录结构树 二.项目启动 三.往指定的shp文件里写内容 (1) json数据[Post] { "name":"test", "path":"c:/test", "geom":"MULTIPOLYGON(((101.870371 25.19228,101.873633 25.188183,101.880564 25.184416,101.886808 25.186028,101.89204

springboot图片上传工具类

package com.wiscom.ism.webapi.ismUtil; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Component; import org.springframework.util.ResourceUtils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

Lucene5学习之LuceneUtils工具类简单封装

花了整整一天时间,将Lucene5中有关索引的常见操作进行了简单封装,废话不多说,上代码: package com.yida.framework.lucene5.util; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; i

Android 开发工具类 35_PatchUtils

增量更新工具类[https://github.com/cundong/SmartAppUpdates] 1 import java.io.File; 2 3 import android.app.Activity; 4 import android.app.ProgressDialog; 5 import android.content.Context; 6 import android.content.Intent; 7 import android.net.Uri; 8 import and

获取Spring容器Bean对象工具类

在开发中,总是能碰到用注解注入不了Spring容器里面bean对象的问题.为了解决这个问题,我们需要一个工具类来直接获取Spring容器中的bean.因此就写了这个工具类,在此记录一下,方便后续查阅.废话不多说,直接上代码. 一.代码 package com.zxy.demo.spring; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext;

获取Spring Bean工具类SpringContextUtil

有时候需要在非Spring环境获取Spring的Bean import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import o

SpringBoot整合Redis及Redis工具类

前言 想做一个秒杀项目,问了几个大佬要了项目视频,结果,自己本地实践的时候,发现不太一样,所以写下这篇,为以后做准备. 环境配置 IDE:IDEA 环境:Windows 数据库:Redis Maven配置 习惯用SpringBoot的小伙伴都知道,需要配置Maven,添加几个dependency. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-