spring实战之获取bean
Spring中获取配置文件中的值非常简单,使用@Value("xxx"), 比如port,profile等,对于Spring对象容器管理的bean而言是这样的。但是如果想在静态类中获取呢?这样就会报错,因为@Value是基于Spring管理的对象创建的。同理,在对象注入时,我们习惯了@Autowired,那么如何在静态类中中获取这些环境变量和对象呢?
这得使用spring提供的EnvironmentAware和ApplicationContextAware接口。
比如要获取配置变量,则可以先获取Environment,如下面代码所示。当然,SpringUtil也是一个由spring管理的对象,应为要注入Environment对象。
@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; // 这其实是实例方法调用静态方法 } }
那么Spirng中有没有一个静态类,通过名字(或者class文件)直接获取对象?很抱歉,没有,这不是spring的正确打开方式。有时我们会很疑惑,如ApplicationContext这种类,为什么在设计时不设计成为静态类呢,而采用单例模式呢?
最重要的原因是类没有生命周期的概念,从程序一加载就在,直到程序终止。而对象就不一样了,在需要的时候new,在不需要时就destroy了(比如在方法中使用到的对象,方法退出,就访问不到对象了),还可以根据条件决定是否创建对象,符合面向对象程序设计的思想:将程序看成有状态对象的集合。
正是如此,作为对象的容器,ApplicationContext在其他bean没有创建完时,是不能访问的。所以这个容器也是一个对象,且在其他bean都创建完成后,才提供给用户访问。
-----------------------------------------2020--------------------------------------
在我们以往的经验中,生成对象,然后交给spring管理就ok了。但是如果业务设计到要移除对象,运行时替换对象,问题怎么解决呢?这就是部署技术了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义