spring心得2--bean的生命週期@Spring監聽器的作用@Spring初始化容器案例分析@web專案使用
Scope的預設值是singleton,lazy-init的預設值是default,default相當於false
1.bean的生命週期
bean被載入到容器中時,他的生命週期就開始了。bean工廠在一個bean可以使用前完成很多工作:
1).容器尋找bean的定義資訊並例項化。
2).使用依賴注入,spring按bean定義資訊配置bean的所有屬性。
3).若bean實現了BeanNameAware介面,工廠呼叫Bean的setBeanName()方法傳遞bean的ID。
4).若bean實現了BeanFactoryAware介面,工廠呼叫setBeanFactory()方法傳入工廠自身。
5).若BeanPostProcessor和bean關聯,則它們的 postProcessBeforeInitialization()方法被呼叫。
6).若bean指定了ini-method方法、,它將被呼叫。
7).最後,若有BeanPostProcessor和bean關聯,則它們的postProcessAfterInitialization()方法被呼叫。
2.Spring監聽器的作用
我們自動載入spring配置檔案需要在web.xml檔案中新增一段配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath*:applicationContext-*.xml </param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
ContextLoaderListener的作用就是啟動Web容器時,自動裝配ApplicationContext的配置資訊。因為它實現了ServletContextListener這個介面,在web.xml配置這個監聽器,啟動容器時,就會預設執行它實現的方法。至於ApplicationContext.xml這個配置檔案部署在哪,如何配置多個xml檔案,檢視它的API文件,在ContextLoaderListener中關聯了ContextLoader這個類,所以整個載入配置過程由ContextLoader來完成。
檢視API得知:ContextLoader可以由 ContextLoaderListener和ContextLoaderServlet生成。如果檢視ContextLoaderServlet的API,可以看到它也關聯了ContextLoader這個類而且它實現了HttpServlet這個介面;
ContextLoader建立的是 XmlWebApplicationContext這樣一個類,它實現的介面是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext-> BeanFactory這樣一來spring中的所有bean都由這個類來建立。
如何部署applicationContext的xml檔案,如果在web.xml中不寫任何引數配置資訊,預設的路徑是"/WEB-INF/applicationContext.xml,在WEB-INF目錄下建立的xml檔案的名稱必須是applicationContext.xml。如果是要自定義檔名可以在web.xml里加入contextConfigLocation這個context引數:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext-*.xml
</param-value>
</context-param>
在<param-value> </param-value>裡指定相應的xml檔名,如果有多個xml檔案,可以寫在一起並一“,”號分隔。上面的applicationContext-*.xml採用萬用字元,比如這那個目錄下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等檔案,都會一同被載入
注意:
如果beans.xml檔案放在src目錄下,在生成ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");但若是applicationContext.xml必須放到WEB-INF下的Classes目錄下,才能用ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");生成ApplicationContext,若是直接放到WEB-INF下會丟擲異常說找不到applicationContext檔案
3. Spring初始化容器 案例分析
package www.csdn.spring.test;
import java.beans.XMLDecoder;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import www.csdn.spring.service.HelloService;
import www.csdn.spring.service.impl.HelloServiceImpl;
publicclass FactoryTest {
@Test
publicvoid testFacory() {
/*
* Spring初始化容器.三種經常用到的實現:
* 一、ClassPathXmlApplicationContext:從類路徑中載入。
* 二、FileSystemXmlApplicationContext:從檔案系統載入。
* 三、XmlWebApplicationContext:從web系統中載入。 InputStreamResource不能夠使用了。
* 特殊的例子:不能使用InputStreamResource
* InputStreamResource res = new InputStreamResource(new
* FileInputStream("D:\\Ncode\\mcode\\sday02\\src\\spring.xml"));
*
* isOpen(){ return true;}
*/
//下面所列舉的案例都是使用bean工廠載入配置檔案的幾種案例,使用上下文的案例在上一篇部落格的springHelloJava案例中已經介紹過了
/*//方法一:FileSystemResource類的使用
FileSystemResource fileResource = new FileSystemResource(
"F:\\csdn-study\\MyWorkspace\\springHelloJava\\src\\spring.xml");
//方法二:ClassPathResource類的使用
ClassPathResource classResource = new ClassPathResource("spring.xml");
BeanFactory factory = (BeanFactory) new XmlBeanFactory(classResource);
*/
//方法三:FileSystemXmlApplicationContext與ClassPathXmlApplicationContext的對比案例
//BeanFactory factory = new FileSystemXmlApplicationContext("F:\\csdn-study\\MyWorkspace\\springHelloJava\\src\\spring.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:spring.xml");
HelloService helloservice = (HelloService) factory
.getBean("helloServiceImpl",HelloServiceImpl.class);
helloservice.sayHello();
}
}
4.web專案使用spring的入門案例
一下配置檔案和類關鍵還是看註釋,註釋中有spring的注意事項以及犀利的知識點
spring.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.xsd">
<!-- spring容器就是負責建立、管理、維護Bean 並且能夠依賴注入到相應元件上 -->
<bean id="helloDaoImpl" class="www.csdn.spring.dao.impl.HelloDaoImpl" scope="singleton" lazy-init="default"></bean>
</beans>
Web.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 這裡的classpath路徑是spring.xml在src路徑下
<param-value>classpath:spring.xml</param-value>
-->
<!-- 也可以像下面這種寫法 -->
<param-value>/WEB-INF/classes/www/csdn/spring/resource/spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>www.csdn.spring.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
HelloServlet類
package www.csdn.spring.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;
import www.csdn.spring.dao.HelloDao;
import www.csdn.spring.dao.impl.HelloDaoImpl;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*// 1.利用XmlWebApplicationContext物件載入
XmlWebApplicationContext context = new XmlWebApplicationContext();
* 預設的路徑/WEB-INF/applicationContext.xml,applicationContext.xml檔名稱
* 可以任意起,比如我改成了spring.xml;
* 位置也可以隨便放,但是如果放到src下路徑就應該寫成/WEB-INF/classes/applicationContext.xml;
* 放到某一包下,路徑就應該寫成對應classes加上包名,比如:
//載入spring檔案
context.setConfigLocation("/WEB-INF/classes/www/csdn/spring/resource/spring.xml");
//將servlet的上下文環境設定成spring的上下文環境
context.setServletContext(getServletContext());
//重新整理容器
context.refresh();
HelloDao helloDao = (HelloDao) context.getBean("helloDaoImpl");
helloDao.sayHello();
// XmlWebApplicationContext context = new XmlWebApplicationContext();
System.out.println("=======================");*/
//2.利用WebApplicationContextUti物件載入
//使用這種方式,spring不會預設的額載入spring配置檔案,也不能像上面那種寫法一樣去寫,這時要在web.xml配置一個監聽器,寫一個配置標籤來指定spring配置檔案的位置
WebApplicationContext contexts = WebApplicationContextUtils
.getWebApplicationContext(getServletContext());
HelloDao helloDaos = contexts.getBean("helloDaoImpl", HelloDaoImpl.class);
helloDaos.sayHello();
}
}
相關文章
- spring bean的作用域和生命週期SpringBean
- 探索Spring系列(一)Spring容器和Bean的生命週期SpringBean
- Spring教程-Spring Bean的生命週期SpringBean
- spring生命週期Spring
- Spring Bean的生命週期SpringBean
- Spring Bean 的生命週期SpringBean
- Spring Bean的生命週期SpringBean
- Spring的生命週期主Spring
- Spring(十二):IOC容器中Bean的生命週期方法SpringBean
- Spring中bean的生命週期SpringBean
- Spring之Bean的生命週期SpringBean
- Spring Bean生命週期SpringBean
- Spring Bean 生命週期SpringBean
- 詳解Spring中Bean的作用域與生命週期SpringBean
- 淺析spring——IOC 之 分析 Bean 的生命週期SpringBean
- 【Spring】Bean的LifeCycle(生命週期)SpringBean
- 面試Spring之bean的生命週期面試SpringBean
- Spring容器啟動流程+Bean的生命週期【附原始碼】SpringBean原始碼
- Spring原始碼:bean的生命週期(一)Spring原始碼Bean
- Spring原始碼:Bean的生命週期(二)Spring原始碼Bean
- 聊一聊Spring Bean 的生命週期SpringBean
- Spring原始碼分析:Spring IOC容器初始化Spring原始碼
- Spring Boot 啟動原始碼解析結合Spring Bean生命週期分析Spring Boot原始碼Bean
- spring通過註解註冊bean的方式+spring生命週期SpringBean
- Spring中與bean有關的生命週期SpringBean
- JAVA面試題:Spring中bean的生命週期Java面試題SpringBean
- 【spring原始碼系列】之【Bean的生命週期】Spring原始碼Bean
- Spring核心系列之Bean的生命週期SpringBean
- spring心得3--bean的生命週期結合案例詳細講解@普通期圖解與uml圖解一併分析SpringBean圖解
- Spring短生命週期bean注入長生命週期bean問題SpringBean
- Spring原始碼:Bean生命週期(三)Spring原始碼Bean
- Spring原始碼:Bean生命週期(四)Spring原始碼Bean
- Spring原始碼:Bean生命週期(五)Spring原始碼Bean
- Spring生命週期管理之總結Spring
- Spring 框架基礎(02):Bean的生命週期,作用域,裝配總結Spring框架Bean
- Spring中如何優雅的使用監聽器模式Spring模式
- Spring Bean各階段生命週期的介紹SpringBean
- Spring Bean生命週期,好像人的一生。。SpringBean