【SSH三大框架】Spring基礎第一篇:搭建Spring環境、實例化Bean、管理Bean的作用域以及Bean的生命週期

一、搭建Spring環境:

在lib目錄下引入jar包,然後add to path,這就不過多說了。

二、實例化Bean的三種方式:

首先,我們先寫兩個java類:

接口類:

public interface PersonService {
	public abstract void save();

}

實現類:

public class PersonServiceBean implements PersonService {
	
	@Override
	public void save(){
		System.out.println("我是save()方法");
	}
}

再寫一個測試方法:

public class SpringTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		
	}

	@Test
	public void instanceSpring() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		PersonService personService = (PersonService)ctx.getBean("personService");
		personService.save();
	}

}

1、使用類構造器實例化Bean

如果我們使用類構造器實例化Bean,則我們需要配置一下beans.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" xmlns:context="http://www.springframework.org/schema/context"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    
    http://www.springframework.org/schema/context    
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
   	
   	<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>
	
</beans>
id是這個bean的唯一標識,class是這個bean指向的路徑。

我們運行測試類中的instanceSpring方法,可以在控制檯打印出:

我是save()方法

2、使用靜態工廠實例化Bean

首先,我們建立一個工廠類,其中有個方法是靜態的:

public class PersonServiceBeanFactory {
	public static PersonServiceBean createPersonServiceBean(){
		return new PersonServiceBean();
	}	
}
然後,我們需要配置一下beans.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" xmlns:context="http://www.springframework.org/schema/context"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    
    http://www.springframework.org/schema/context    
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
   	
   	<bean id="personServiceFactory" class="cn.itcast.service.impl.PersonServiceBeanFactory" factory-method="createPersonServiceBean"></bean>  
	
</beans>
id是這個bean的唯一標識,class表明指向的類,factory-method表明使用工廠方法中的某個方法。

我們運行測試類中的instanceSpring方法,可以在控制檯打印出:

我是save()方法

3、使用實例工廠的方法實例化Bean

使用實例工廠需要配置兩個bean:

我們配置一下beans.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" xmlns:context="http://www.springframework.org/schema/context"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    
    http://www.springframework.org/schema/context    
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
   	
   	<bean id="personServiceFactory" class="cn.itcast.service.impl.PersonServiceBeanFactory"></bean>  
	<bean id="personService" factory-bean="personServiceFactory" factory-method="createPersonServiceBean"></bean>
	
</beans>
可以看到,我們配置了兩個bean,第二個bean通過factory-bean引用了第一個bean,並調用factory-method

我們看一下PersonServiceBeanFactory.java:

public class PersonServiceBeanFactory {
	public PersonServiceBean createPersonServiceBean(){  //注意,這裏相對於靜態工廠少了個static  
	    return new PersonServiceBean();  
	} 
}
有一點需要注意的是,這裏被調用的bean所指向的類中要調用的方法不能是靜態的,因爲這不是靜態工廠實例化。

我們運行測試類中的instanceSpring方法,可以在控制檯打印出:

我是save()方法

三、管理Bean的作用域

在Spring的Bean中有一個屬性scope是用來配置Spring Bean的作用域,它標識Bean的作用域

在Spring 2.0之後默認有五種類型的Bean:

singleton、prototype、request、session、global session(application)

其中,後三種是用於WEB中的Bean對象,這裏只介紹前兩種。

PS:需要注意的一點就是,如果Bean沒有設置作用域的時候,默認是singleton類型

1、 .singleton

當一個Bean的作用域設置爲.singleton,Srping IOC容器中僅僅會存在一個共享的bean實例。

在所有對bean的請求中,只要請求的id與bean的id相同,則他們返回的實例都是同一個。

即當設置爲singleton的時候,容器只會創建唯一的一個實例。這個單一實例會被存儲到單例緩存(singleton cache)中,並且所有針對該bean的後續請求和引用都將返回被緩存的對象實例。

2、.prototype

當bean的作用域設置爲prototype的時候,在每次請求bean的時候,Spring IOC容器都會創建一個新的Bean實例。

四、Bean的作用域

1、當Bean的作用域是單例(scope="singleton"或者沒有scope屬性)的時候

當容器實例化的時候,Bean也同時實例化了。

另外,如果當bean的lazy-init屬性設置爲true的時候,會延遲初始化,即在調用getBean()方法的時候初始化Bean

2、當Bean的作用域是(scope="prototype")的時候

當調用getBean()方法的時候,Bean纔會被實例化。


對於所有的Bean實例有幾個屬性,init-method方法和destroy-method方法。

init-method方法是在實例化Bean之後,調用此方法(這是通過IOC容器反射技術實現的)

destroy-method方法是在容器關閉之後,調用此方法











發佈了149 篇原創文章 · 獲贊 25 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章