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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM