首页 > 代码库 > static关键字,引发的spring普通类获取spring的bean的思考

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 {// extends
                                                                    // ApplicationObjectSupport{

    private static ApplicationContext context = null;
    private static SpringConfigTool stools = null;

    public synchronized static SpringConfigTool init() {
        if (stools == null) {
            stools = new SpringConfigTool();
        }
        return stools;
    }

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        context = applicationContext;
    }

    public synchronized static Object getBean(String beanName) {
        return context.getBean(beanName);
    }

}
<bean id="SpringConfigTool" class="com.nfcm.spring.SpringConfigTool"/>


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

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

 

static关键字,引发的spring普通类获取spring的bean的思考