[TOC]
# ApplicationContext與BeanFactory關系

ApplicationContext它是擴展BeanFactory接口。
BeanFactory它采取延遲加載的方案,只有真正在getBean時才會實例化Bean
在開發中我們一般使用的是ApplicationContext,真正使用的是其實現類,
FileSystemXmlAppliCationContext 根據文件路徑獲取
ClassPathXmlApplicationContext 根據類路徑獲取
AppliCationContext它會在配置文件加載時,就會初始化Bean,
并且ApplicationContext它提供不同的應用層的Context實現。
例如在web開發中可以使用WebApplicationContext.
# Bean實例化方式
## 無參數構造
對于這種方式,注意Bean類中必須提供無參數構造
~~~
<bean name="user" class="studySpring.User"></bean>
~~~
## 靜態工廠方法
需要創建一個工廠類,在工廠類中提供一個static返回bean對象的方法就可以。
~~~
<!-- 創建方式2:靜態工廠創建
調用UserFactory的createUser方法創建名為user2的對象.放入容器
-->
<bean name="user2"
class="hello.UserFactory"
factory-method="createUser" ></bean>
~~~
UserFactory
~~~
public static User createUser() {
System.out.println("靜態工廠創建User");
return new User();
}
~~~
## 實例工廠方法
需要創建一個工廠類,在工廠類中提供一個非static的創建bean對象的方法,在配置文件中需要將工廠配置,還需要配置bean
~~~
<!-- 創建方式3:實例工廠創建
調用UserFactory對象的createUser2方法創建名為user3的對象.放入容器
-->
<bean name="UserFactory"
class="hello.UserFactory"></bean>
<bean name="user3"
factory-bean="UserFactory"
factory-method="createUser2" ></bean>
~~~
UserFactory
~~~
public User createUser2() {
System.out.println("實例工廠創建User");
return new User();
}
~~~
# Bean的作用域

在bean聲明時它有一個scope屬性,它是用于描述bean的作用域。
可取值有:
singleton:單例 代表在spring ioc容器中只有一個Bean實例 (默認的scope)
prototype多例 每一次從spring容器中獲取時,都會返回一個新的實例
request 用在web開發中,將bean對象request.setAttribute()存儲到request域中
session 用在web開發中,將bean對象session.setAttribute()存儲到session域中
在開如常用的值是singleton與prototype
# Bean的生命周期

1. instantiate bean對象實例化
2. populate properties 封裝屬性
3. 如果Bean實現BeanNameAware執行setBeanName
4. 如果Bean實現BeanFactoryAwar或ApplicationContextAwar設置工廠setBeanFactory或上下文對象setApplicationContext
5. 如果存在類實現BeanPostProcessor(后處理Bean),執行postProcessBeforeInitialization
6. 如果Bean實現InitializingBean執行afterPropertiesSet
7. 調用自定義的init-method方法
8. 如果存在類實現BeanPostProcessor(處理Bean),執行postProcessAfterInitialization
9. 執行業務處理
10. 如果Bean實現DisposableBean執行destroy
11. 調用自定義的destroy-method
對于bean的生命周期方法:
第三步與第四步是讓Bean了解spring容器。
第五步與第八步 可以針對指定的Bean進行功能增強,這時一般會使用動態代理.
第六步與第十步:通過實現指定的接口來完成init與destroy操作
但是在開發中一般不使用第6步與第10步,原因是我們可以使用第7步與第11步來完成。
第7步與第11步的初始化與銷毀操作它無耦合,推薦使用的。但是必須在配置文件中指定初始化與銷毀的方法
~~~
<bean name="user" class="studySpring.User" init-method="init" destroy-method="destory"></bean>
~~~
然后在User類中寫init和destory方法
然后再寫測試方法
~~~
// 1.創建容器對象,因為直接在src下,就寫applicationContext.xml
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.向容器要User對象
Object u = ac.getBean("user");
// 打印User對象
System.out.println(u);
// 關閉容器,觸發銷毀方法,close方法在ClassPathXmlApplicationContext中
ac.close();
~~~
總結:
對于bean的生命周期,我們需要關注的主要有兩個方法:
1. 增強bean的功能可以使用后處理Bean, BeanPostProcessor
2. 如果需要初始化或銷毀操作我們可以使用init-method destroy-method
注意:destroy-method只對scope=singleton有效果。
- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化