IOC裝配Bean(2)
阿新 • • 發佈:2018-04-25
IOC裝配BeanSpring框架Bean實例化的方式
提供了三種方式實例化Bean.
* 構造方法實例化:(默認無參數)
* 靜態工廠實例化:
* 實例工廠實例化:
無參數構造方法的實例化
<!-- 默認情況下使用的就是無參數的構造方法. -->
<bean id="bean1" class="cn.spring.demo2.Bean1"></bean>
package cn.spring.demo2;
/*
* 使用無參數的構造方法實例化
*/
public class Bean1 {
public Bean1(){};
}
靜態工廠實例化
<!-- 靜態工程實例化 --> <bean id="bean2" class="cn.spring.demo2.Bean2Factory" factory-method="getBean2"></bean>
package cn.spring.demo2;
/*
* 使用靜態工廠實例化
*/
public class Bean2 {
}
package cn.spring.demo2;
/*
* Bean2的靜態工程
*/
public class Bean2Factory {
public static Bean2 getBean2() {
System.out.println("靜態工程或得bean2的方法……");
return new Bean2();
}
}
實例工廠實例化
<!-- 使用實例工程實例化 --> <bean id="bean3" factory-bean="bean3Factroy" factory-method="getBean3"></bean> <bean id="bean3Factroy" class="cn.spring.demo2.Bean3Factory"></bean>
package cn.spring.demo2;
/*
* 使用實例工廠實例化
*/
public class Bean3 {
}
package cn.spring.demo2;
/**
* 使用實例方法
*
* @author NOP
*
*/
public class Bean3Factory {
public Bean3 getBean3() {
System.out.println("實例工廠得bean3的方法……");
return new Bean3();
}
}
測試類編寫
package cn.spring.demo2; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SprintTest2 { @Test // 無參數的構造方法實例化 public void demo1() { ApplicationContext applicaionContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); Bean1 bean1 = (Bean1) applicaionContext.getBean("bean1"); System.out.println(bean1); } @Test // 靜態工廠實例化 public void demo2() { ApplicationContext applicaionContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); Bean2 bean2 = (Bean2) applicaionContext.getBean("bean2"); System.out.println(bean2); } @Test // 實例工程實例化 public void demo3() { ApplicationContext applicaionContext = new ClassPathXmlApplicationContext( "applicationContext.xml"); Bean3 bean3 = (Bean3) applicaionContext.getBean("bean3"); System.out.println(bean3); } }
Bean的其他配置
id和name的區別
- id遵守XML約束的id的約束.id約束保證這個屬性的值是唯一的,而且必須以字母開始,可以使用字母、數字、連字符、下劃線、句話、冒號
- name沒有這些要求
***** 如果bean標簽上沒有配置id,那麽name可以作為id.
***** 開發中Spring和Struts1整合的時候, /login.
<bean name=”/login” class=””>
現在的開發中都使用id屬性即可.
類的作用範圍
- scope屬性:
- singleton:單例的.(默認的值.)
- prototype:多例的.
- request:web開發中.創建了一個對象,將這個對象存入request範圍,request.setAttribute();
- session: web開發中.創建了一個對象,將這個對象存入session範圍,session.setAttribute();
- globalSession:一般用於Porlet應用環境.指的是分布式開發.不是porlet環境,globalSession等同於session;
實際開發中主要使用singleton,prototype
package cn.spring.demo3;
public class Customer {
public Customer(){
super();
System.out.println("Customer類實例化……");
}
}
package cn.spring.demo3;
public class Product {
private String name ;
public void setName(String name) {
this.name = name;
}
public void setup(){
System.out.println("初始化……");
}
public void teardown(){
System.out.println("銷毀……");
}
@Override
public String toString() {
return "Product [name=" + name + "]";
}
}
<!-- cn.spring.demo3 bean作用範圍-->
<!--默認是單實例-->
<bean id="customer" class="cn.spring.demo3.Customer" scope="singleton"></bean>
<!--
測試類結果:單實例對象一樣
Customer類實例化……
cn.spring.demo3.Customer@19e215b
cn.spring.demo3.Customer@19e215b
-->
<!-- 多實例 -->
<bean id="customer" class="cn.spring.demo3.Customer" scope="prototype"></bean>
<!--
測試類結果:多實例對象不一樣
Customer類實例化……
cn.spring.demo3.Customer@19762f
Customer類實例化……
cn.spring.demo3.Customer@19e215b
-->
<!-- bean的生命周期-->
<bean id="Product" class="cn.spring.demo3.Product" init-method="setup" destroy-method="teardown">
<property name="name" value="空調"/>
</bean>
<!-- cn.spring.demo3 bean作用範圍-->
package cn.spring.demo3;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SprintTest3 {
@Test
// 測試單實例或多實例
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Customer c1 = (Customer) applicationContext.getBean("customer");
System.out.println(c1);
Customer c2 = (Customer) applicationContext.getBean("customer");
System.out.println(c2);
}
@Test
public void demo2() {
//ApplicationContext只會執行 init-method="setup" 方法
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Product p1 = (Product) applicationContext.getBean("Product");
/*
*結果:
*初始化……
*/
// 執行銷毀的方法用ClassPathXmlApplicationContext有close的方法
ClassPathXmlApplicationContext applicationContext1 = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Product p2 = (Product) applicationContext.getBean("Product");
System.out.println(p2);
// 會執行destroy-method="teardown"
applicationContext1.close();
/*
*結果:
*初始化……
*銷毀......
*/
}
}
IOC裝配Bean(2)