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

原文地址:https://www.cnblogs.com/nfcm/p/7226600.html