Spring Bean相關操作
spring中兩個最基本、最重要的包org.springframework.beans 和 org.springframework.context。為了實現無侵入式的框架,這兩個包中大量使用了java中的反射機制。
最重要的兩個類
BeanFactory------->先進的配置機制管理任何種類的Bean
ApplicationContext-------->建立在BeanFactory之上,並增加了例如支援國際化、獲取資源、事件傳遞等功能
Bean的配置
<bean id="life" init-method="init" destroy-method="destroy" scope="prototype" class="SpringLifeCycle"/>
public class SpringLifeCycle { public SpringLifeCycle(){ System.out.println("SpringLifeCycle"); } //定義初始化方法 public void init(){ System.out.println("init..."); } //定義銷燬方法 public void destroy(){ System.out.println("destroy..."); } public voidsayHello(){ System.out.println("say Hello..."); } }
<bean id="hellostaticfac" factory-method="getInstances" lazy-init="true" class="HelloStaticFactory"/>
public class HelloStaticFactory { public HelloStaticFactory(){ System.out.println("HelloStaticFactory constructor"); } //靜態工廠方法 public static Test getInstances(){ return new Test(); } }
depends-on:可以用來在初始化使用這個Bean之前,強制執行一個或者多個Bean的初始化。
Bean初始化:
1.配置文件中 配置init-method屬性(推薦使用)
2.實現org.springframework.bean.factory.InitializingBean介面(會自動執行 afterPropertirsSet()方法進行屬性初始化,不推薦使用,未解耦spring)
Bean的使用:
1.使用BeanWrapper
HelloWorld hw = new HelloWorld();
BeanWrapper bw = new BeanWrapperImpl(hw);
bw.setPropertyValue("msg","hello world!");
System.out.println(bw.getPropertyValue("msg"));
2.使用BeanFactory
InputStream is = new FileInputStream("config.xml");
XmlBeanFactory fac = new XmlBeanFactorty(is);
HelloWorld hw = (HelloWorld)fac.getBean("HelloWorld");
System.out.println(hw.getMsg());
3.使用ApplicationContext
ApplicationContext ac = new FileSystemXmlApplicationContext("config.xml");
HelloWorld hw = (HelloWorld)ac.getBean("HelloWorld");
System.out.println(hw.getMsg());
Bean的銷燬
1.配置檔案中指定 destroy-method
2.實現org.springframework.bean.factory.DisposableBean介面(自動執行destory())
ref屬性指定bean的 三種模式
1.local
local必須與bean的id一致,在同一個xml 中如果沒有匹配元素,xml解析器將會產生一個錯誤,如果一個bean與被引用的bean在同一個xml中,則用local是最好的選擇。
2.bean屬性
bean屬性最大的優點是 被引用的bean可以不在同一個xml中。bean屬性的值可以與被參考引用的bean的id屬性相同,也可以與name屬性相同。
3.parent
各位看官自己查文件瞭解即可,不常用,我也沒看懂啥意思就不寫了