zoukankan      html  css  js  c++  java
  • static关键字,引发的spring普通类获取spring的bean的思考

    在c++和java中static关键字用于修饰静态成员变量和成员函数

    举例一个普通的javabean

    class AA
    {
       int a;
       static int b;
       geta/seta;//此处省略getset
       getb/setb;
    
    
    }


    如果创建了一个对象AA,

    AA a =new AA();

    这个时候只会在内存中给这个对象分配四个字节,也就是a变量所占的字节数,因为static申明的全局变量在全局区中,是所有这个类的对象共有的,例如:

    a.setB(10);
    
    AA b =new A();
    
    System.out.println(b.getB());

    发现结果是10;

    也就证实了,static申明的关键字是所有对象共有。

    这也解释了,为什么静态函数只可以使用静态变量的原因了,因为静态函数也是所有类共有的,在编译器编译的时候不会将该类的引用传递到这个方法中,

    所以静态函数不知道是哪个对象调用了我这个方法。

    那么普通的函数存在哪里呢,为什么对象调用这个方法的时候,函数知道是哪个对象调用我的呢?

    因为普通的成员变量和方法在编译器编译的时候,会帮我们做了转化。

     还是上面的类,在编译的时候,编译器会将类变成:

    class AA
    {
        int a;
        public void setA(AA *ac,int a)
        {
           ac->a=a;
        
        }
    
    }    


    会将当前类的地址传递过来,修改该对象a的值。(上面代码是c++实现的,我认为java底层也是这样实现的)

    调用静态static函数的方式在java中包括(java)

    1类名.static方法();

    2对象.static方法();

     普通java类获取spring容器的类的方法:

    public class SpringConfigTool implements ApplicationContextAware{
        
        private static ApplicationContext applicationContext;
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext=applicationContext;
        }
    
        
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    }
    <bean id="SpringConfigTool" class="com.nfcm.spring.SpringConfigTool"/>


    这会在spring容器运行的时候,将spring上下文对象设置到我们自定义的SpringConfigTool的全局变量中,而上面我们得知:全局变量是所有类公用的,

    所以我们可以直接使用SpringConfigTool.getBean("beanName");或者new一个对象调用getBean都可以获取到spring对应的bean

  • 相关阅读:
    StarGAN v2
    STGAN
    Neo4j 图数据库查询
    StarGAN
    AttGAN
    分布式事务解决方案--Seata源码解析
    5分钟彻底了解Nginx的反向代理
    SpringBoot启动流程源码解析
    JAVA基础5--注解的实现原理
    Redis进阶三之底层存储数据结构及内存优化
  • 原文地址:https://www.cnblogs.com/nfcm/p/7226600.html
Copyright © 2011-2022 走看看