zoukankan      html  css  js  c++  java
  • spring实战之获取bean

      Spring中获取配置文件中的值非常简单,使用@Value("xxx"), 比如port,profile等,对于Spring对象容器管理的bean而言是这样的。但是如果想在静态类中获取呢?这样就会报错,因为@Value是基于Spring管理的对象创建的,同理,在对象注入时,我们习惯了@Autowired。这时我们就得使用spring提供的 EnvironmentAware,  

    ApplicationContextAware接口来获取元数据对象,如Environment,如下面代码所示,当然要注入云数据对象,还是要使用Spring的方式,创建对象。

    @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中有没有一个静态类,通过名字直接获取对象,或者这直接new有一个对象呢?很抱歉,这不是spring的正确打开方式。有时我们会很疑惑,现ApplicationContext这种类,为什么在设计时不设计成为静态类呢,而采用单例模式。

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

      -----------------------------------------2020--------------------------------------

      在我们以往的经验中,生成对象,然后交给spring管理就ok了。但是如果业务设计到要移除对象,活着替换对象,问题怎么解决呢?可以设想一种情景,如果一个对象突然在Sprinboot中消失了,会发生什么呢?

  • 相关阅读:
    C语言内存调试技巧—C语言最大难点揭秘
    include .h 以及.cpp的记录
    VS2010中<无法打开包括文件:“iostream.h”:>错误解决方法
    #include<iostream>与#include<iostream.h>的区别
    VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
    【Oracle】Oracle日期格式详解
    【EasyUI】 日期格式化
    【TortoiseGit】TortoiseGit将本地库push到远端
    【Tomcat】解决Eclipse无法添加Tomcat Service问题
    【Tomcat】配置Tomcat
  • 原文地址:https://www.cnblogs.com/Robin008/p/11595212.html
Copyright © 2011-2022 走看看