亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

annuaire recherche
前言 簡介 概覽 使用場景 Spring 2.0和 2.5的新特性 簡介 控制反轉(zhuǎn)(IoC)容器 新的bean作用域 更簡單的XML配置 可擴展的XML編寫 Annotation(注解)驅(qū)動配置 在classpath中自動搜索組件 面向切面編程(AOP) 更加簡單的AOP XML配置 對@AspectJ 切面的支持 對bean命名pointcut( bean name pointcut element)的支持 對AspectJ裝載時織入(AspectJ load-time weaving)的支持 中間層 在XML里更為簡單的聲明性事務配置 對Websphere 事務管理的完整支持 JPA 異步的JMS JDBC Web層 Spring MVC合理的默認值 Portlet 框架 基于Annotation的控制器 Spring MVC的表單標簽庫 對Tiles 2 支持 對JSF 1.2支持 JAX-WS支持 其他 動態(tài)語言支持 增強的測試支持 JMX 支持 將Spring 應用程序上下文部署為JCA adapter 計劃任務 對Java 5 (Tiger) 支持 移植到Spring 2.5 改變 支持的JDK版本 Spring 2.5的Jar打包 XML配置 Deprecated(淘汰)的類和方法 Apache OJB iBATIS Hibernate JDO UrlFilenameViewController 更新的樣例應用 改進的文檔 核心技術(shù) IoC(控制反轉(zhuǎn))容器 簡介 基本原理 - 容器和bean 容器 配置元數(shù)據(jù) 實例化容器 XML配置元數(shù)據(jù)的結(jié)構(gòu) 多種bean bean的命名 bean的別名 實例化bean 用構(gòu)造器來實例化 使用靜態(tài)工廠方法實例化 使用實例工廠方法實例化 使用容器 依賴 注入依賴 構(gòu)造器注入 構(gòu)造器參數(shù)解析 構(gòu)造器參數(shù)類型匹配 構(gòu)造參數(shù)索引 Setter注入 一些例子 依賴配置詳解 直接變量(基本類型、Strings類型等。) idref元素 引用其它的bean(協(xié)作者) 內(nèi)部bean 集合 集合的合并 強類型集合(僅適用于Java5+) Nulls XML配置文件的簡寫及其他 XML-based configuration metadata shortcuts 使用p名稱空間配置屬性 組合屬性名稱 使用depends-on 延遲初始化bean 自動裝配(autowire)協(xié)作者 將bean排除在自動裝配之外 依賴檢查 方法注入 Lookup方法注入 自定義方法的替代方案 Bean的作用域 Singleton作用域 Prototype作用域 Singleton beans和prototype-bean的依賴 其他作用域 初始化web配置 Request作用域 Session作用域 global session作用域 作用域bean與依賴 選擇創(chuàng)建代理的類型 自定義作用域 創(chuàng)建自定義作用域 使用自定義作用域 定制bean特性 生命周期回調(diào) 初始化回調(diào) 析構(gòu)回調(diào) 缺省的初始化和析構(gòu)方法 組合生命周期機制 在非web應用中優(yōu)雅地關(guān)閉Spring IoC容器 了解自己 BeanFactoryAware BeanNameAware bean定義的繼承 容器擴展點 用BeanPostProcessor定制bean 使用BeanPostProcessor的Hello World示例 RequiredAnnotationBeanPostProcessor示例 用BeanFactoryPostProcessor定制配置元數(shù)據(jù) PropertyPlaceholderConfigurer示例 PropertyOverrideConfigurer示例 使用FactoryBean定制實例化邏輯 The ApplicationContext BeanFactory 還是 ApplicationContext? 利用MessageSource實現(xiàn)國際化 事件 底層資源的訪問 ApplicationContext在WEB應用中的實例化 粘合代碼和可怕的singleton 以J2EE RAR文件的形式部署Spring ApplicationContext 基于注解(Annotation-based)的配置 @Autowired 基于注解的自動連接微調(diào) CustomAutowireConfigurer @Resource @PostConstruct 與 @PreDestroy 對受管組件的Classpath掃描 @Component和更多典型化注解 自動檢測組件 使用過濾器自定義掃描 自動檢測組件的命名 為自動檢測的組件提供一個作用域 用注解提供限定符元數(shù)據(jù) 注冊一個LoadTimeWeaver 資源 簡介 Resource接口 內(nèi)置 Resource 實現(xiàn) UrlResource ClassPathResource FileSystemResource ServletContextResource InputStreamResource ByteArrayResource ResourceLoader接口 ResourceLoaderAware 接口 把Resource作為屬性來配置 Application context 和Resource 路徑 構(gòu)造application context 創(chuàng)建 ClassPathXmlApplicationContext 實例 - 簡介 Application context構(gòu)造器中資源路徑的通配符 Ant風格的pattern 潛在的可移植性 classpath*: 前綴 其他關(guān)于通配符的說明 FileSystemResource 說明 校驗,數(shù)據(jù)綁定,BeanWrapper,與屬性編輯器 簡介 使用Spring的Validator接口進行校驗 從錯誤代碼到錯誤信息 Bean處理和BeanWrapper 設(shè)置和獲取屬性值以及嵌套屬性 內(nèi)建的PropertyEditor實現(xiàn) 注冊用戶自定義的PropertyEditor 使用PropertyEditorRegistrars 使用Spring進行面向切面編程(AOP) 簡介 AOP概念 Spring AOP的功能和目標 AOP代理 @AspectJ支持 啟用@AspectJ支持 聲明一個切面 聲明一個切入點(pointcut) 切入點指示符(PCD)的支持 組合切入點表達式 共享通用切入點定義 示例 聲明通知 前置通知 后置通知(After returning advice) 異常通知(After throwing advice) 最終通知(After (finally) advice) 環(huán)繞通知 通知參數(shù)(Advice parameters) 訪問當前的連接點 傳遞參數(shù)給通知 確定參數(shù)名 處理參數(shù) 通知順序 引入(Introduction) 切面實例化模型 例子 基于Schema的AOP支持 聲明一個切面 聲明一個切入點 聲明通知 前置通知 后置通知 異常通知 最終通知 環(huán)繞通知 通知參數(shù) 通知順序 引入 切面實例化模型 Advisor 例子 AOP聲明風格的選擇 Spring AOP還是完全用AspectJ? Spring AOP中使用@AspectJ還是XML? 混合切面類型 代理機制 理解AOP代理 以編程方式創(chuàng)建@AspectJ代理 在Spring應用中使用AspectJ 在Spring中使用AspectJ進行domain object的依賴注入 @Configurable對象的單元測試 Working with multiple application contexts Spring中其他的AspectJ切面 使用Spring IoC來配置AspectJ的切面 在Spring應用中使用AspectJ加載時織入(LTW) 第一個例子 切面 'META-INF/aop.xml' 相關(guān)類庫(JARS) Spring配置 特定環(huán)境的配置 通用Java應用 Tomcat WebLogic 更多資源 Spring AOP APIs 簡介 Spring中的切入點API 概念 切入點運算 AspectJ切入點表達式 便利的切入點實現(xiàn) 靜態(tài)切入點 正則表達式切入點 屬性驅(qū)動的切入點 動態(tài)切入點 控制流切入點 切入點的超類 自定義切入點 Spring的通知API 通知的生命周期 Spring里的通知類型 攔截環(huán)繞通知 前置通知 異常通知 后置通知 引入通知 Spring里的Advisor API 使用ProxyFactoryBean創(chuàng)建AOP代理 基礎(chǔ) JavaBean屬性 基于JDK和CGLIB的代理 對接口進行代理 對類進行代理 使用“全局”通知器 簡化代理定義 使用ProxyFactory通過編程創(chuàng)建AOP代理 操作被通知對象 使用“自動代理(autoproxy)”功能 自動代理bean定義 BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator AbstractAdvisorAutoProxyCreator 使用元數(shù)據(jù)驅(qū)動的自動代理 使用TargetSource 熱交換目標源 池化目標源 原型目標源 ThreadLocal目標源 定義新的Advice類型 更多資源 測試 簡介 單元測試 Mock對象 JNDI Servlet API Portlet API 單元測試支持類 通用工具類 Spring MVC 集成測試 概覽 使用哪個支持框架 通用目標 上下文管理及緩存 測試fixtures依賴注入 事務管理 集成測試支持類 JDBC測試支持 常用注解 JUnit 3.8遺留支持 上下文管理及緩存 測試fixture依賴注入 字段級別(Field Level)注入 事務管理 JUnit 3.8 遺留支持類 Java 5+ 專有支持 使用注解的事務相關(guān)測試 JPA支持類 Spring TestContext Framework 主要的抽象 上下文管理和緩存 測試fixture的依賴注入 事務管理 TestContext支持類 JUnit 3.8支持類 JUnit 4.4支持類 定制JUnit 4.4運行器 TestNG支持類 TestContext框架注解支持 PetClinic示例 更多資源 中間層數(shù)據(jù)訪問 事務管理 簡介 動機 關(guān)鍵抽象 使用資源同步的事務 高層次方案 低層次方案 TransactionAwareDataSourceProxy 聲明式事務管理 理解Spring的聲明式事務管理實現(xiàn) 第一個例子 回滾 為不同的bean配置不同的事務語義 <tx:advice/> 有關(guān)的設(shè)置 使用 @Transactional @Transactional 有關(guān)的設(shè)置 事務傳播 required RequiresNew Nested 通知事務操作 結(jié)合AspectJ使用 @Transactional 編程式事務管理 使用TransactionTemplate 指定事務設(shè)置 使用PlatformTransactionManager 選擇編程式事務管理還是聲明式事務管理 與特定應用服務器集成 IBM WebSphere BEA WebLogic Oracle OC4J 常見問題的解決方法 對一個特定的 DataSource 使用了錯誤的事務管理器 更多的資源 DAO支持 簡介 一致的異常層次 一致的DAO支持抽象類 使用JDBC進行數(shù)據(jù)訪問 簡介 選擇一種工作模式 Spring JDBC包結(jié)構(gòu) 利用JDBC核心類控制JDBC的基本操作和錯誤處理 JdbcTemplate類 一些示例 查詢(SELECT) 更新(INSERT/UPDATE/DELETE) 其他操作 JdbcTemplate 的最佳實踐 NamedParameterJdbcTemplate類 SimpleJdbcTemplate類 DataSource接口 SQLExceptionTranslator接口 執(zhí)行SQL語句 執(zhí)行查詢 更新數(shù)據(jù)庫 獲取自動生成的主鍵 控制數(shù)據(jù)庫連接 DataSourceUtils類 SmartDataSource接口 AbstractDataSource類 SingleConnectionDataSource類 DriverManagerDataSource類 TransactionAwareDataSourceProxy類 DataSourceTransactionManager類 NativeJdbcExtractor JDBC批量操作 使用JdbcTemplate進行批量操作 使用SimpleJdbcTemplate進行批量操作 通過使用SimpleJdbc類簡化JDBC操作 使用SimpleJdbcInsert插入數(shù)據(jù) 使用SimpleJdbcInsert來獲取自動生成的主鍵 指定SimpleJdbcInsert所使用的字段 使用SqlParameterSource提供參數(shù)值 使用SimpleJdbcCall調(diào)用存儲過程 聲明SimpleJdbcCall使用的參數(shù) 如何定義SqlParameters 使用SimpleJdbcCall調(diào)用內(nèi)置函數(shù) 使用SimpleJdbcCall返回的ResultSet/REF Cursor 用Java對象來表達JDBC操作 SqlQuery類 MappingSqlQuery類 SqlUpdate類 StoredProcedure類 SqlFunction類 參數(shù)和數(shù)據(jù)處理的基本原則 為參數(shù)設(shè)置SQL類型信息 處理BLOB 和 CLOB對象 在IN語句中傳入一組參數(shù)值 處理復雜類型的存儲過程調(diào)用 使用ORM工具進行數(shù)據(jù)訪問 簡介 Hibernate 資源管理 在Spring容器中創(chuàng)建 SessionFactory The HibernateTemplate 不使用回調(diào)的基于Spring的DAO實現(xiàn) 基于Hibernate3的原生API實現(xiàn)DAO 編程式的事務劃分 聲明式的事務劃分 事務管理策略 容器資源 vs 本地資源 在應用服務器中使用Hibernate的注意事項 JDO 建立PersistenceManagerFactory JdoTemplate和JdoDaoSupport 基于原生的JDO API實現(xiàn)DAO 事務管理 JdoDialect Oracle TopLink SessionFactory 抽象層 TopLinkTemplate and TopLinkDaoSupport 基于原生的TopLink API的DAO實現(xiàn) 事務管理 iBATIS SQL Maps 創(chuàng)建SqlMapClient 使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport 基于原生的iBATIS API的DAO實現(xiàn) JPA 在Spring環(huán)境中建立JPA LocalEntityManagerFactoryBean 從JNDI中獲取 EntityManagerFactory LocalContainerEntityManagerFactoryBean Tomcat(5.0以上)加載時的織入配置 使用VM代理的全局加載時織入 上下文范圍內(nèi)的加載時織入配置 處理多持久化單元 JpaTemplate 和 JpaDaoSupport 基于原生的JPA實現(xiàn)DAO 異常轉(zhuǎn)化 事務管理 JpaDialect The Web Web MVC framework Web框架 概述 與其他MVC實現(xiàn)框架的集成 Spring Web MVC框架的特點 DispatcherServlet 控制器 AbstractController 和 WebContentGenerator 其它的簡單控制器 MultiActionController 命令控制器 處理器映射(handler mapping) BeanNameUrlHandlerMapping SimpleUrlHandlerMapping 攔截器(HandlerInterceptor) 視圖與視圖解析 視圖解析器(ViewResolver) 視圖解析鏈 重定向(Rediret)到另一個視圖 RedirectView redirect:前綴 forward:前綴 本地化解析器 AcceptHeaderLocaleResolver CookieLocaleResolver SessionLocaleResolver LocaleChangeInterceptor 使用主題 簡介 如何定義主題 主題解析器 Spring對分段文件上傳(multipart file upload)的支持 介紹 使用MultipartResolver 在表單中處理分段文件上傳 使用Spring的表單標簽庫 配置 form標簽 input標簽 checkbox標簽 checkboxes標簽 radiobutton標簽 radiobuttons標簽 password標簽 select標簽 option標簽 options標簽 textarea標簽 hidden標簽 errors標簽 處理異常 慣例優(yōu)先原則(convention over configuration) 對控制器的支持:ControllerClassNameHandlerMapping 對模型的支持:ModelMap(ModelAndView) 對視圖的支持:RequestToViewNameTranslator 基于注解的控制器配置 建立dispatcher實現(xiàn)注解支持 使用@Controller定義一個控制器 使用@RequestMapping映射請求 使用@RequestParam綁定請求參數(shù)到方法參數(shù) 使用@ModelAttribute提供一個從模型到數(shù)據(jù)的鏈接 使用@SessionAttributes指定存儲在會話中的屬性 自定義WebDataBinder初始化 使用@InitBinder自定義數(shù)據(jù)綁定 配置一個定制的WebBindingInitializer 更多資源 集成視圖技術(shù) 簡介 JSP和JSTL 視圖解析器 'Plain-old' JSPs versus JSTL 'Plain-old' JSP與JSTL 幫助簡化開發(fā)的額外的標簽 Tiles 需要的資源 如何集成Tiles UrlBasedViewResolver類 ResourceBundleViewResolver類 SimpleSpringPreparerFactory 和 SpringBeanPreparerFactory Velocity和FreeMarker 需要的資源 Context 配置 創(chuàng)建模板 高級配置 velocity.properties FreeMarker 綁定支持和表單處理 用于綁定的宏 簡單綁定 表單輸入生成宏 輸入域 選擇輸入域 重載HTML轉(zhuǎn)碼行為并使你的標簽符合XHTML XSLT 寫在段首 Bean 定義 標準MVC控制器代碼 把模型數(shù)據(jù)轉(zhuǎn)化為XML 定義視圖屬性 文檔轉(zhuǎn)換 小結(jié) 文檔視圖(PDF/Excel) 簡介 配置和安裝 文檔視圖定義 Controller 代碼 Excel視圖子類 PDF視圖子類 JasperReports 依賴的資源 配置 配置ViewResolver 配置View 關(guān)于報表文件 使用 JasperReportsMultiFormatView 構(gòu)造ModelAndView 使用子報表 配置子報表文件 配置子報表數(shù)據(jù)源 配置Exporter的參數(shù) 集成其它Web框架 簡介 通用配置 JavaServer Faces DelegatingVariableResolver FacesContextUtils Struts ContextLoaderPlugin DelegatingRequestProcessor DelegatingActionProxy ActionSupport Classes Tapestry 注入 Spring 托管的 beans 將 Spring Beans 注入到 Tapestry 頁面中 組件定義文件 添加抽象訪問方法 將 Spring Beans 注入到 Tapestry 頁面中 - Tapestry 4.0+ 風格 WebWork 更多資源 Portlet MVC框架 介紹 控制器 - MVC中的C 視圖 - MVC中的V Web作用范圍的Bean DispatcherPortlet ViewRendererServlet 控制器 AbstractController 和 PortletContentGenerator 其它簡單的控制器 Command控制器 PortletWrappingController 處理器映射 PortletModeHandlerMapping ParameterHandlerMapping PortletModeParameterHandlerMapping 增加 HandlerInterceptors HandlerInterceptorAdapter ParameterMappingInterceptor 視圖和它們的解析 Multipart文件上傳支持 使用 PortletMultipartResolver 處理表單里的文件上傳 異常處理 Portlet應用的部署 整合 使用Spring進行遠程訪問與Web服務 簡介 使用RMI暴露服務 使用RmiServiceExporter暴露服務 在客戶端鏈接服務 使用Hessian或者Burlap通過HTTP遠程調(diào)用服務 為Hessian和co.配置DispatcherServlet 使用HessianServiceExporter暴露你的bean 在客戶端連接服務 使用Burlap 對通過Hessian或Burlap暴露的服務使用HTTP Basic認證 使用HTTP調(diào)用器暴露服務 Exposing the service object 在客戶端連接服務 Web Services 使用JAX-RPC暴露基于servlet的web服務 使用JAX-RPC訪問web服務 注冊JAX-RPC Bean映射 注冊自己的JAX-RPC 處理器 使用JAX-WS暴露基于servlet的web服務 使用JAX-WS暴露單獨web服務 使用Spring支持的JAX-WS RI來暴露服務 使用JAX-WS訪問web服務 使用XFire來暴露Web服務 JMS 服務端配置 客戶端配置 對遠程接口不提供自動探測實現(xiàn) 在選擇這些技術(shù)時的一些考慮 Enterprise Java Beans (EJB) 集成 簡介 訪問EJB 概念 訪問本地的無狀態(tài)Session Bean(SLSB) 訪問遠程SLSB Accessing EJB 2.x SLSBs versus EJB 3 SLSBs 使用Spring提供的輔助類實現(xiàn)EJB組件 EJB 2.x base classes EJB 3 注入攔截 JMS (Java Message Service) 簡介 使用Spring JMS JmsTemplate 連接工廠 目的地管理 消息偵聽容器 SimpleMessageListenerContainer DefaultMessageListenerContainer ServerSessionMessageListenerContainer 事務管理 發(fā)送消息 使用消息轉(zhuǎn)換器 SessionCallback 和 ProducerCallback 接收消息 同步接收 異步接收 - 消息驅(qū)動的POJO SessionAwareMessageListener接口 MessageListenerAdapter 事務中的消息處理 JCA消息端點的支持 JMS命名空間支持 JMX 介紹 將Bean暴露為JMX 創(chuàng)建MBeanServer 重用原有的MBeanServer 延遲初始化的MBean MBean的自動注冊 控制注冊行為 控制Bean的管理接口 MBeanInfoAssembler接口 使用源碼級元數(shù)據(jù) 使用JDK 5.0的注解 源代碼級的元數(shù)據(jù)類型 AutodetectCapableMBeanInfoAssembler接口 用Java接口定義管理接口 使用MethodNameBasedMBeanInfoAssembler 控制Bean的ObjectName 從Properties讀取Properties 使用MetadataNamingStrategy <context:mbean-export/>元素 JSR-160連接器 服務器端連接器 客戶端連接器 基于Burlap/Hessian/SOAP的JMX 通過代理訪問MBean 通知 為通知注冊監(jiān)聽器 發(fā)布通知 更多資源 JCA CCI 簡介 配置CCI 連接器配置 在Spring中配置ConnectionFactory 配置CCI連接 使用一個 CCI 單連接 使用Spring的 CCI訪問支持 記錄轉(zhuǎn)換 CciTemplate類 DAO支持 自動輸出記錄生成 總結(jié) 直接使用一個CCI Connection接口和Interaction接口 CciTemplate 使用示例 建模CCI訪問為操作對象 MappingRecordOperation MappingCommAreaOperation 自動生成輸出記錄 總結(jié) MappingRecordOperation 使用示例 MappingCommAreaOperation 使用示例 事務 Spring郵件抽象層 簡介 使用Spring郵件抽象 MailSender 和 SimpleMailMessage 的基本用法 使用 JavaMailSender 和 MimeMessagePreparator 使用MimeMessageHelper 發(fā)送附件和嵌入式資源(inline resources) 附件 內(nèi)嵌資源 使用模板來創(chuàng)建郵件內(nèi)容 一個基于Velocity的示例 Spring中的定時調(diào)度(Scheduling)和線程池(Thread Pooling) 簡介 使用OpenSymphony Quartz 調(diào)度器 使用JobDetailBean 使用 MethodInvokingJobDetailFactoryBean 使用triggers和SchedulerFactoryBean來包裝任務 使用JDK Timer支持類 創(chuàng)建定制的timers 使用 MethodInvokingTimerTaskFactoryBean類 最后:使用TimerFactoryBean來設(shè)置任務 SpringTaskExecutor抽象 TaskExecutor接口 TaskExecutor類型 使用TaskExecutor 動態(tài)語言支持 介紹 第一個示例 定義動態(tài)語言支持的bean 公共概念 <lang:language/> 元素 Refreshable bean 內(nèi)置動態(tài)語言源文件 理解dynamic-language-backed bean上下文中的構(gòu)造器注入 JRuby beans Groovy beans 通過回調(diào)定制Groovy對象 BeanShell beans 場景 Spring MVC控制器的腳本化 Validator的腳本化 Bits and bobs AOP - 通知腳本化bean 作用域 更多的資源 注解和源代碼級的元數(shù)據(jù)支持 簡介 Spring的元數(shù)據(jù)支持 注解 @Required Spring中的其它@Annotations Jakarta Commons Attributes集成 元數(shù)據(jù)和Spring AOP自動代理 基本原理 聲明式事務管理 示例程序 演示案例 介紹 使用動態(tài)語言實現(xiàn)的Spring MVC控制器 構(gòu)建與部署 使用SimpleJdbcTemplate和@Repository實現(xiàn)DAO 域?qū)ο?/a> Data Access Object 構(gòu)建 XML Schema-based configuration Introduction XML Schema-based configuration Referencing the schemas The util schema <util:constant/> Setting a bean property or constructor arg from a field value <util:property-path/> Using <util:property-path/> to set a bean property or constructor-argument <util:properties/> <util:list/> <util:map/> <util:set/> The jee schema <jee:jndi-lookup/> (simple) <jee:jndi-lookup/> (with single JNDI environment setting) <jee:jndi-lookup/> (with multiple JNDI environment settings) <jee:jndi-lookup/> (complex) <jee:local-slsb/> (simple) <jee:local-slsb/> (complex) <jee:remote-slsb/> The lang schema The jms schema The tx (transaction) schema The aop schema The context schema <property-placeholder/> <annotation-config/> <component-scan/> <load-time-weaver/> <spring-configured/> <mbean-export/> The tool schema The beans schema Setting up your IDE Setting up Eclipse Setting up IntelliJ IDEA Integration issues XML parsing errors in the Resin v.3 application server Extensible XML authoring Introduction Authoring the schema Coding a NamespaceHandler Coding a BeanDefinitionParser Registering the handler and the schema 'META-INF/spring.handlers' 'META-INF/spring.schemas' Using a custom extension in your Spring XML configuration Meatier examples Nesting custom tags within custom tags Custom attributes on 'normal' elements Further Resources spring-beans-2.0.dtd spring.tld Introduction The bind tag The escapeBody tag The hasBindErrors tag The htmlEscape tag The message tag The nestedPath tag The theme tag The transform tag spring-form.tld Introduction The checkbox tag The checkboxes tag The errors tag The form tag The hidden tag The input tag The label tag The option tag The options tag The password tag The radiobutton tag The radiobuttons tag The select tag The textarea tag Spring 2.5開發(fā)手冊中文化項目 聲明 致謝 參與人員 項目歷程
personnages

3.8.?The ApplicationContext

beans包提供了以編程的方式管理和操控bean的基本功能,而context包下的ApplicationContext以一種更加面向框架的方式增強了BeanFactory的功能。多數(shù)用戶可以采用聲明的方式來使用ApplicationContext,甚至不用手動創(chuàng)建它,而通過ContextLoader這樣的支持類,把它作為J2EE web應用的一部分自動啟動。當然,我們?nèi)匀豢梢圆捎镁幊痰姆绞絼?chuàng)建一個ApplicationContext。

context包的核心是ApplicationContext接口。它由BeanFactory接口派生而來,因而提供了BeanFactory所有的功能。為了以一種更向面向框架的方式工作以及對上下文進行分層和實現(xiàn)繼承,context包還提供了以下的功能:

  • MessageSource, 提供國際化的消息訪問

  • 資源訪問,如URL和文件

  • 事件傳播,實現(xiàn)了ApplicationListener接口的bean

  • 載入多個(有繼承關(guān)系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層

3.8.1.?BeanFactory 還是 ApplicationContext?

簡單的說:除非你有更好的理由,否則盡量使用ApplicationContext,下面是對于哪些"為什么"等等更深入的建議

ApplicationContext包含BeanFactory的所有功能。通常建議比BeanFactory優(yōu)先,除非有一些限制的場合如字節(jié)長度對內(nèi)存有很大的影響時(Applet)。然后,絕大多數(shù)"典型的"企業(yè)應用和系統(tǒng),ApplicationContext就是你需要使用的。Spring2.0及以上版本,大量使用了link linkend="beans-factory-extension-bpp">BeanPostProcessor擴展(以便應用代理等功能),如果你選擇BeanFactory則無法使用相當多的支持功能,如事務和AOP,這可能會導致混亂,因為配置并沒有錯誤。

下面的功能矩陣列出了BeanFactory提供的功能和ApplicationContext提供的功能(包括其實現(xiàn))。(下一節(jié)更深度的描述了ApplicationContextBeanFactory更強的功能。)

表?3.5.?Feature Matrix特性表

特性 BeanFactory ApplicationContext

Bean 實例化/裝配

Yes

Yes

自動 BeanPostProcessor 注冊

No

Yes

自動 BeanFactoryPostProcessor 注冊

No

Yes

便捷的 MessageSource 訪問( i18n)

No

Yes

ApplicationEvent 發(fā)送

No

Yes


3.8.2.?利用MessageSource實現(xiàn)國際化

ApplicationContext接口擴展了MessageSource接口,因而提供了消息處理的功能(i18n或者國際化)。與HierarchicalMessageSource一起使用,它還能夠處理嵌套的消息,這些是Spring提供的處理消息的基本接口。讓我們快速瀏覽一下它所定義的方法:

  • String getMessage(String code, Object[] args, String default, Locale loc):用來從MessageSource獲取消息的基本方法。如果在指定的locale中沒有找到消息,則使用默認的消息。args中的參數(shù)將使用標準類庫中的MessageFormat來作消息中替換值。

  • String getMessage(String code, Object[] args, Locale loc):本質(zhì)上和上一個方法相同,其區(qū)別在:沒有指定默認值,如果沒找到消息,會拋出一個NoSuchMessageException異常。

  • String getMessage(MessageSourceResolvable resolvable, Locale locale):上面方法中所使用的屬性都封裝到一個MessageSourceResolvable實現(xiàn)中,而本方法可以指定MessageSourceResolvable實現(xiàn)。

當一個ApplicationContext被加載時,它會自動在context中查找已定義為MessageSource類型的bean。此bean的名稱須為messageSource。如果找到,那么所有對上述方法的調(diào)用將被委托給該bean。否則ApplicationContext會在其父類中查找是否含有同名的bean。如果有,就把它作為MessageSource。如果它最終沒有找到任何的消息源,一個空的StaticMessageSource將會被實例化,使它能夠接受上述方法的調(diào)用。

Spring目前提供了兩個MessageSource的實現(xiàn):ResourceBundleMessageSourceStaticMessageSource。它們都繼承NestingMessageSource以便能夠處理嵌套的消息。StaticMessageSource很少被使用,但能以編程的方式向消息源添加消息。ResourceBundleMessageSource會用得更多一些,為此提供了一下示例:

<beans>
  <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
      <list>
        <value>format</value>
        <value>exceptions</value>
        <value>windows</value>
      </list>
    </property>
  </bean>
</beans>

這段配置假定在你的classpath中有三個資源文件(resource bundle),它們是format, exceptionswindows。通過ResourceBundle,使用JDK中解析消息的標準方式,來處理任何解析消息的請求。出于示例的目的,假定上面的兩個資源文件的內(nèi)容為…

# in 'format.properties'
message=Alligators rock!
# in 'exceptions.properties'
argument.required=The '{0}' argument is required.

下面是測試代碼。因為ApplicationContext實現(xiàn)也都實現(xiàn)了MessageSource接口,所以能被轉(zhuǎn)型為MessageSource接口

public static void main(String[] args) {
    MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
    String message = resources.getMessage("message", null, "Default", null);
    System.out.println(message);
}

上述程序的輸出結(jié)果將會是...

Alligators rock!

總而言之,我們在'beans.xml'的文件中(在classpath根目錄下)定義了一個messageSource bean,通過它的basenames屬性引用多個資源文件;而basenames屬性值由list元素所指定的三個值傳入,它們以文件的形式存在并被放置在classpath的根目錄下(分別為format.propertiesexceptions.propertieswindows.properties)。

再分析個例子,這次我們將著眼于傳遞參數(shù)給查找的消息,這些參數(shù)將被轉(zhuǎn)換為字符串并插入到已查找到的消息中的占位符(譯注:資源文件中花括號里的數(shù)字即為占位符)。

<beans>

    <!-- this MessageSource is being used in a web application -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="baseName" value="WEB-INF/test-messages"/>
    </bean>
    
    <!-- let's inject the above MessageSource into this POJO -->
    <bean id="example" class="com.foo.Example">
        <property name="messages" ref="messageSource"/>
    </bean>

</beans>
public class Example {

    private MessageSource messages;

    public void setMessages(MessageSource messages) {
        this.messages = messages;
    }

    public void execute() {
        String message = this.messages.getMessage("argument.required",
            new Object [] {"userDao"}, "Required", null);
        System.out.println(message);
    }

}

調(diào)用execute()方法的輸出結(jié)果是...

The 'userDao' argument is required.

對于國際化(i18n),Spring中不同的MessageResource實現(xiàn)與JDK標準ResourceBundle中的locale解析規(guī)則一樣。比如在上面例子中定義的messageSource bean,如果你想解析British (en-GB) locale的消息,那么需要創(chuàng)建format_en_GB.properties,exceptions_en_GB.propertieswindows_en_GB.properties三個資源文件。

Locale解析通常由應用程序根據(jù)運行環(huán)境來指定。出于示例的目的,我們對將要處理的(British)消息手工指定locale參數(shù)值。

# in 'exceptions_en_GB.properties'
argument.required=Ebagum lad, the '{0}' argument is required, I say, required.
public static void main(final String[] args) {
    MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
    String message = resources.getMessage("argument.required",
        new Object [] {"userDao"}, "Required", Locale.UK);
    System.out.println(message);
}

上述程序運行時的輸出結(jié)果是...

Ebagum lad, the 'userDao' argument is required, I say, required.

MessageSourceAware接口還能用于獲取任何已定義的MessageSource引用。任何實現(xiàn)了MessageSourceAware接口的bean將在創(chuàng)建和配置的時候與MessageSource一同被注入。

3.8.3.?事件

ApplicationContext中的事件處理是通過ApplicationEvent類和ApplicationListener接口來提供的。如果在上下文中部署一個實現(xiàn)了ApplicationListener接口的bean,那么每當一個ApplicationEvent發(fā)布到ApplicationContext時,這個bean就得到通知。實質(zhì)上,這是標準的Observer設(shè)計模式。Spring提供了三個標準事件:

表?3.6.?內(nèi)置事件

事件 解釋
ContextRefreshedEvent ApplicationContext初始化或刷新時發(fā)送的事件。如使用ConfigurableApplicationContext接口的refresh()方法。這里的初始化意味著:所有的bean被裝載,后處理bean被檢測和激活,singleton被預實例化,以及ApplicationContext已就緒可用。刷新在context關(guān)閉會觸發(fā)多次。選擇ApplicationContext可以提供“熱”刷新的功能(如:XmlWebApplicationContext 可以但是GenericApplicationContext 則不可以.)
ContextStartedEvent ApplicationContext啟動時發(fā)送的事件,使用ConfigurableApplicationContext接口的start()方法。這里"啟動"意味著生命周期 beans將獲得一個確實的啟動信號。這經(jīng)常使用在確實停止后重新啟動的場合,但也可以用在啟動一個沒有被配置為自動啟動的組件中(如:在完成初始化后還沒有啟動)。
ContextStoppedEvent 當使用ConfigurableApplicationContext接口的stop() 方法使ApplicationContext停止時候發(fā)送的事件。這里"停止"意味著生命周期 beans將獲得一個確實的停止信號. 停止的context可以通過調(diào)用start()來重新啟動。
ContextClosedEvent 當使用ConfigurableApplicationContext接口close() 方法使ApplicationContext 關(guān)閉時候發(fā)送的事件。 這里關(guān)閉意味著所有的singleton bean都被銷毀。關(guān)閉的context不能刷新和重新啟動。
RequestHandledEvent web特性的事件通告所有的bean有一個http request(將在request結(jié)束后才會發(fā)送)。注意這種事件只兼容于使用SpringDispatcherServlet兼容的web應用。

只要在ApplicationContext調(diào)用publishEvent()方法可以很方便的實現(xiàn)自定義事件,將一個實現(xiàn)了ApplicationEvent的自定義事件類作為參數(shù)就可以了。事件監(jiān)聽器同步的接收事件。這意味著publishEvent()方法將被阻塞,直到所有的監(jiān)聽器都處理完事件(可以通過一個ApplicationEventMulticaster的實現(xiàn)提供可選的事件發(fā)送策略)。此外,如果事務context可用,監(jiān)聽器會接收到一含有發(fā)送者事務context的事件。

看一個例子,首先是ApplicationContext:

<bean id="emailer" class="example.EmailBean">
  <property name="blackList">
    <list>
      <value>black@list.org</value>
      <value>white@list.org</value>
      <value>john@doe.org</value>
    </list>
  </property>
</bean>

<bean id="blackListListener" class="example.BlackListNotifier">
  <property name="notificationAddress" value="spam@list.org"/>
</bean>

再看一下實際的類:

public class EmailBean implements ApplicationContextAware {

    private List blackList;
	private ApplicationContext ctx;

    public void setBlackList(List blackList) {
        this.blackList = blackList;
    }

    public void setApplicationContext(ApplicationContext ctx) {
        this.ctx = ctx;
    }

    public void sendEmail(String address, String text) {
        if (blackList.contains(address)) {
            BlackListEvent event = new BlackListEvent(address, text);
            ctx.publishEvent(event);
            return;
        }
        // send email...
    }
}
public class BlackListNotifier implements ApplicationListener {

    private String notificationAddress;
    
    public void setNotificationAddress(String notificationAddress) {
        this.notificationAddress = notificationAddress;
    }

    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof BlackListEvent) {
            // notify appropriate person...
        }
    }
}

當然,這個例子可以使用更好的方法實現(xiàn)(如采用AOP特性) ,但應該足以說明事件的基本機制。

3.8.4.?底層資源的訪問

為了更好的使用和理解應用上下文,通常用戶應當對Spring的Resource有所了解,詳見第?4?章 資源

應用上下文同時也是個資源加載器(ResourceLoader),能被用來加載多個Resource。一個Resource實質(zhì)上可以當成一個java.net.URL,可被用來從大多數(shù)位置以透明的方式獲取底層的資源,包括從classpath、文件系統(tǒng)位置、任何以標準URL描述的位置以及其它一些變種。如果資源位置串是一個沒有任何前綴的簡單路徑,這些資源來自何處取決于實際應用上下文的類型。

為了讓bean能訪問靜態(tài)資源,可以象其它屬性一樣注入Resource。被注入的Resource屬性值可以是簡單的路徑字符串,ApplicationContext會使用已注冊的PropertyEditor,來將字符串轉(zhuǎn)換為實際的Resource對象。

ApplicationContext構(gòu)造器的路徑就是實際的資源串,根據(jù)不同的上下文實現(xiàn),字符串可視為不同的形式(例如:ClassPathXmlApplicationContext會把路徑字符串看作一個classpath路徑)。然而,它也可以使用特定的前綴來強制地從classpath或URL加載bean定義文件,而不管實際的上下文類型。

3.8.5.?ApplicationContext在WEB應用中的實例化

BeanFactory通常以編程的方式被創(chuàng)建不同的是,ApplicationContext能以聲明的方式創(chuàng)建,如使用ContextLoader。當然你也可以使用ApplicationContext的實現(xiàn)之一來以編程的方式創(chuàng)建ApplicationContext實例。首先,讓我們先分析ContextLoader接口及其實現(xiàn)。

ContextLoader機制有兩種方式,ContextLoaderListenerContextLoaderServlet,他們功能相同但是listener不能在Servlet2.3容器下使用。Servlet2.4規(guī)范中servlet context listeners需要在web應用啟動并能處理初始請求時立即運行。(servlet context listener關(guān)閉的時候也是相同的)。servlet context listener是初始化Spring ApplicationContext理想的方式。你可能愿意選擇ContextLoaderListener,雖然是一樣的,但決定權(quán)在于你。你可以查看ContextLoaderServlet的Javadoc來獲得更詳細的信息。

可以象下面所示例的一樣使用ContextLoaderListener注冊一個ApplicationContext

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- or use the ContextLoaderServlet instead of the above listener
<servlet>
  <servlet-name>context</servlet-name>
  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
-->

監(jiān)聽器首先檢查contextConfigLocation參數(shù),如果它不存在,它將使用/WEB-INF/applicationContext.xml作為默認值。如果已存在,它將使用分隔符(逗號、冒號或空格)將字符串分解成應用上下文件位置路徑。可以支持ant-風格的路徑模式,如/WEB-INF/*Context.xml(WEB-INF文件夾下所有以"Context.xml"結(jié)尾的文件)?;蛘?code class="literal">/WEB-INF/**/*Context.xml(WEB-INF文件夾及子文件夾下的以"Context.xml"結(jié)尾的文件)。

ContextLoaderServletContextLoaderListener一樣使用'contextConfigLocation'參數(shù)。

Article précédent: Article suivant: