bean的4種例項化方法
具體檔案格式
application.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
<import resource="classpath:beaninstance/xml/beaninstance.xml"></import>
</beans>
beaninstance.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation ="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd" >
<!--bean的初始化-->
<!--①.構造器例項化(無引數構造器),最標準,使用最多。-->
<bean id="bean1" class="beaninstance.beanold.bean1"></bean>
<!--②.靜態工廠方法例項化:解決系統遺留問題
<!-- class:靜態工廠的類名 從根目錄中獲取
factory-method:靜態工廠中對應的靜態方法,該方法會返回相對應的物件(在這裡返回的是bean2物件)
-->
<bean id="bean2" class="beaninstance.staticfactory.bean2factory" factory-method="getbean2"></bean>
<!--③.例項工廠方法例項化:解決系統遺留問題-->
<!--
配置時應該配置2個bean,第一個為工廠bean,第二個為物件的bean
其中factory-bean:例項化工廠物件
factory-method:例項化工廠物件的方法,該方法返回對應的物件
-->
<bean id="bean3factory" class="beaninstance.instancefactory.bean3factory"></bean>
<bean id="bean3" factory-bean="bean3factory" factory-method="getbean3"></bean>
<!--④.實現FactoryBean介面例項化:例項工廠變種-->
<!-- class:為具體例項工廠 -->
<bean id="bean4" class="beaninstance.factorybean.bean4factory"></bean>
</beans>
//第一種例項化方式
bean1類
package beaninstance.beanold;
public class bean1 {
//<!--①.構造器例項化(無引數構造器),最標準,使用最多。-->
public bean1() {
System.out.println("走好選擇的路,別選擇好走的路,你才能擁有真正的自己。");
}
public void sayhello(){
System.out.println("所謂的焦慮就是書讀得太少,而想得又太多");
}
}
//第二種例項化方式
bean2類
package beaninstance.staticfactory;
public class bean2 {
//②.靜態工廠方法例項化:解決系統遺留問題
public bean2() {
System.out.println("剛開始是假裝堅強,後來就真的堅強了。");
}
public void sayhello(){
System.out.println("人間不會有單純的快樂,快樂總夾雜著煩惱和憂慮,人間也沒有永遠。");
}
}
bean2factory靜態工廠類
package beaninstance.staticfactory;
public class bean2factory {
//②.靜態工廠方法例項化:解決系統遺留問題
public static bean2 getbean2(){
return new bean2();
}
}
//第三種例項化方式
bean3類
package beaninstance.instancefactory;
public class bean3 {
public bean3() {
System.out.println("年輕的時候以為不讀書不足以瞭解人生,直到後來才發現如果不瞭解人生,是讀不懂書的。讀書的意義大概就是用生活所感去讀書,用讀書所得去生活吧。");
}
public void sayhello(){
System.out.println("我不要兒子,我要女兒──只要一個,像你的。見她之前,從未想結婚;娶她之後,我從未後悔");
}
}
bean3factory例項化工廠類
package beaninstance.instancefactory;
public class bean3factory {
public bean3 getbean3(){
return new bean3();
}
}
//第四種例項化方式
bean4類
package beaninstance.factorybean;
public class bean4 {
public bean4() {
System.out.println("我和誰都不爭,和誰爭我都不屑。簡樸的生活、高貴的靈魂是人生的至高境界。");
}
public void sayhello(){
System.out.println("一個人不想攀高就不怕下跌,也不用傾軋排擠,可以保其天真,成其自然,潛心一志完成自己能做的事。");
}
}
bean4factory工廠類
package beaninstance.factorybean;
import org.springframework.beans.factory.FactoryBean;
public class bean4factory implements FactoryBean<bean4> {
//例項工廠方法,建立當前類的物件
@Override
public bean4 getObject() throws Exception {
return new bean4();
}
//返回物件的型別
@Override
public Class<?> getObjectType() {
return bean4.class;
}
//是否弄成單例,如果返回true,永遠返回該物件
@Override
public boolean isSingleton() {
return true;
}
}
test測試類
package beaninstance.test;
import beaninstance.beanold.bean1;
import beaninstance.factorybean.bean4;
import beaninstance.instancefactory.bean3;
import beaninstance.instancefactory.bean3factory;
import beaninstance.staticfactory.bean2;
import beaninstance.staticfactory.bean2factory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//SpringJUnit4ClassRunner.class為單元測試
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration:關聯自己的測試檔案,為xml格式檔案,其中檔案路徑為classpath路徑下的檔案
@ContextConfiguration("classpath:beaninstance/xml/beaninstance.xml")
public class test {
//自動注入
@Autowired
private bean1 bean1;
@Test
public void beaninstance(){
System.out.println(bean1);
bean1.sayhello();
}
//②.靜態工廠方法例項化:解決系統遺留問題
@Autowired
private ApplicationContext ctx;
@Test
public void testStaticFactory(){
//老方法
bean2 bean2= bean2factory.getbean2();
bean2.sayhello();
System.out.println(bean2);
//新方法
bean2 bean2new=ctx.getBean("bean2",bean2.class);
System.out.println("-----------------");
System.out.println(bean2new);
bean2new.sayhello();
}
//③.例項工廠方法例項化:解決系統遺留問題
@Test
public void testInstanceFactory(){
//老方法
bean3factory factory=new bean3factory();
bean3 bean3=factory.getbean3();
System.out.println(bean3);
bean3.sayhello();
//新方法
bean3 beannew3=ctx.getBean("bean3",bean3.class);
System.out.println(beannew3);
beannew3.sayhello();
}
@Test
public void testFactoryBean(){
bean4 bean4=ctx.getBean("bean4",bean4.class);
System.out.println(bean4);
bean4.sayhello();
}
}
測試結果如下