Spring實例化Bean的三種方式分別是:
1,xml配置使用bean的類構造器
<bean id="personService" class="cn.service.impl.PersonServiceBean"></bean>
2,xml配置+factory類,使用靜態工廠方法實例化
<bean id="personService2" class="cn.service.impl.PersonServiceBeanFactory" factory-method="createPersonServiceBean"/>
3,xml配置+factory類,使用實例工廠方法實例化
<bean id="personServiceFactory" class="cn.service.impl.PersonServiceBeanFactory"/>
<bean id="personService3" factory-bean="personServiceFactory" factory-method="createPersonServiceBean2"/>
三種Spring實例化Bean方法的用處,
第一種方法,通過bean的缺省構造函數創建,當各個bean的業務邏輯相互比較獨立的時候或者和外界關聯較少的時候可以使用。
第二種方法,利用靜態factory方法創建,可以統一管理各個bean的創建,如各個bean在創建之前需要相同的初始化處理,則可用這個factory方法險進行統一的處理等等。
第三種方法,利用實例化factory方法創建,即將factory方法也作為了業務bean來控制。
Bean的作用域:
1,默認:singleton(單例,每次getBean()都是相同的Bean)
<bean id="bean1" class="cn.transaction.Bean1"></bean>
2,prototype:(每次getBean()都會獲得新的Bean)
<bean id="bean1" class="cn.transaction.Bean1" scope="prototype"></bean>
Bean的生命周期:
1,默認:singleton 在容器實例化的時候就會實例化;
1.1,更該實例化時間:
<bean id="bean1" class="cn.transaction.Bean1" lazy-init="true"></bean>
如果要為所有的Bean延遲初始化:
在beans中配置該屬性
1.2,配置初始化方法:
<bean id="bean1" class="cn.transaction.Bean1" lazy-init="true" init-method="init"></bean>
1.3,配置銷毀方法
<bean id="bean1" class="cn.transaction.Bean1" lazy-init="true" init-method="init" destroy-method="destroy"></bean>
1.4,bean在什么時候被銷毀
默認既然是在spring容器初始化時創建Bean,所以是Bean是在spring容器關閉的時候銷毀。
2,prototype:在調用getBean()的時候進行實例化;
-----------------------------------------------------------------------------------------------------------------
spring學習,理解控制反轉和spring在項目中可以帶來的好處
Spring是一個開源的控制反轉(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是簡化企業開發.
1 首先要理解控制反轉的概念,如下面的程序
public class PersonServiceBean {
private PersonDao personDao = new PersonDaoBean();
public void save(Person person){
personDao.save(person);
}
}
PersonDao 就是依賴對象的類,PersonDaoBean 是在應用內部創建及維護的。所謂控制反轉就是應用本身不負責依賴對象的創建及維護,依賴對象的創建及維護是由外部容器負責的。這樣控制權就由應用轉移到了外部容器,控制權的轉移就是所謂反轉
2把依賴對象交給外部容器負責創建,那么PersonServiceBean 類可以改成如下:
public class PersonServiceBean {
private PersonDao personDao ;
//通過構造器參數,讓容器把創建好的依賴對象注入進PersonServiceBean,當然也可以使用setter方法進行注入。
public PersonServiceBean(PersonDao personDao){
this.personDao=personDao;
}
public void save(Person person){
personDao.save(person);
}
}
所謂依賴注入就是指:在運行期,由外部容器動態地將依賴對象注入到組件中。
3.黎老師對spring在項目中可以帶來下面的好處進行了總結。
1)降低組件之間的耦合度,實現軟件各層之間的解耦。
Controller——>Service——>DAO
2)可以使用容器提供的眾多服務,如:事務管理服務、消息服務等等。當我們使用容器管理事務時,開發人員就不再需要手工控制事務.也不需處理復雜的事務傳播。
3)容器提供單例模式支持,開發人員不再需要自己編寫實現代碼。
4)容器提供了AOP技術,利用它很容易實現如權限攔截、運行期監控等功能。
5)容器提供的眾多輔作類,使用這些類能夠加快應用的開發,如: JdbcTemplate、 HibernateTemplate。
6)Spring對於主流的應用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,這樣更便於應用的開發。
7) 使用spring容器可以提供的服務:事務管理服務,JMS服務,Spring Core核心服務,持久化服務等。
8)如果使用Spring, 我們就不再需要手工控制事務,例如在Hibernate中控制事務的語句 session.beginTransaction(); session.getTransaction().commit();
9)使用Spring,不再需要我們處理復雜的事務傳播行為。
經常有人分不清spring屬於輕量級框架,還是重量框架?有些人認為一個項目超過10M就是重量級的,這種划分很明顯是錯誤的,因為有可能它包含了大部分的圖片,而只含有很少的代碼。其實划分一個應用是否屬於輕量級還是重量級,主要看它使用了多少服務.使用的服務越多,容器要為普通java對象做的工作就越多,必然會影響到應用的發布時間或者運行性能.
對於spring容器,它提供了很多服務,但這些服務並不是默認為應用打開的,應用需要某種服務,還需要指明使用該服務,如果應用使用的服務很少,如:只使用了spring核心服務,那么我們可以認為此時應用屬於輕量級的,如果應用使用了spring提供的大部分服務,這時應用就屬於重量級。目前EJB容器就因為它默認為應用提供了EJB規范中所有的功能,所以它屬於重量級。
---------------------------------------------------------------------------------------------------------------------
實例化bean的方式及Bean的作用域
使用Spring需要的jar
可以到http://www.springsource.org/download下載spring,然后進行解壓縮,在解壓目錄中找到下面jar文件,拷貝到類路徑下
dist/spring.jar
lib/jakarta-commons/commons-logging.jar
如果使用了切面編程(AOP),還需要下列jar文件
lib/aspectj/aspectjweaver.jar和aspectjrt.jar
lib/cglib/cglib-nodep-2.1_3.jar
如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,還需要下列jar文件
lib/j2ee/common-annotations.jar
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
.....
</beans>
該配置模版可以從spring的參考手冊或spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目錄下,但考慮到通用性,一般放在類路徑下。
實例化Spring容器常用的兩種方式:
方法一:
在類路徑下尋找配置文件來實例化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});
方法二:
在文件系統路徑下尋找配置文件來實例化容器
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{“d://beans.xml“});
一般使用第一種方式,Spring的配置文件可以指定多個,可以通過String數組
傳入。
當spring容器啟動后,因為spring容器可以管理bean對象的創建,銷毀等生命
周期,所以我們只需從容器直接獲取Bean對象就行,而不用編寫一句代碼來創建
bean對象。從容器獲取bean對象的代碼如下:
ApplicationContext ctx = new ClassPathXmlApplicationContext(“beans.xml”);
OrderService service = (OrderService)ctx.getBean("personService");
三種實例化bean的方式:
1.使用類構造器實例化
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
2.使用靜態工廠方法實例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
3.使用實例工廠方法實例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
Bean的作用域
.singleton (單例)
在每個Spring IoC容器中一個bean定義只有一個對象實例。默認情況下會在容器啟動時初始化bean,但我們可以指定Bean節點的lazy-init=“true”來延遲初始化bean,這時候,只有第一次獲取bean會才初始化bean。如:
<bean id="xxx" class="cn.itcast.OrderServiceBean" lazy-init="true"/>
如果想對所有bean都應用延遲初始化,可以在根節點beans設置default-lazy-init=“true“,如下:
<beans default-lazy-init="true“ ...>
實際應用中不把這個屬性設置為true.
.prototype (原型)
每次從容器獲取bean都是新的對象。每次調用getBean方法,都獲取新的實例。
調用調用getBean方法時 bean才實例化
.request
.session
.global session
在配置文件中指定Bean的初始化方法和銷毀方法
<bean id="xxx" class="cn.itcast.OrderServiceBean" init-method="init" destroy-method="close"/>
Bean實例化后 ,就會執行init方法, Spring容器通過反射機制來調用。
AbstractApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
ctx.close();//正常關閉spring容器。
