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.我们继承的类,大多数是实例方法和实例变量(至于为甚是实例方法和实例变量,应该是很绝大多数类都要实例化,并且可能有多个对象),那么继承的时候就是实例方法和实例变量,可以说这是面向对象编程风格在单例情况下的影响。单例的缺点可能就是生成对象的开销,现在这已经不算什么了。
对象一般比类丰满,嗯,这是经验。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Mybatis-Plus中分页插件PaginationInterceptor的使用
我们在开发的过程中,经常会遇到分页操作,本文主要介绍了Mybatis-Plus中分页插件PaginationInterceptor的使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧2023-06-06SpringBoot +DynamicDataSource切换多数据源的全过程
这篇文章主要介绍了SpringBoot +DynamicDataSource切换多数据源的全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-01-01restTemplate发送get与post请求并且带参数问题
这篇文章主要介绍了restTemplate发送get与post请求并且带参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-07-07
最新评论