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

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

5.4.?Bean處理和BeanWrapper

org.springframework.beans包遵循Sun發(fā)布的JavaBean標(biāo)準(zhǔn)。JavaBean是一個(gè)簡單的含有一個(gè)默認(rèn)無參數(shù)構(gòu)造函數(shù)的Java類, 這個(gè)類中的屬性遵循一定的命名規(guī)范,且具有setter和getter方法。例如,某個(gè)類擁有一個(gè)叫做bingoMadness的屬性,并同時(shí)具有與該屬性對(duì)應(yīng)的setter方法:setBingoMadness(..)和getter方法:getBingoMadness()。如果你需要了解JavaBean規(guī)范的詳細(xì)信息可以訪問Sun的網(wǎng)站 (java.sun.com/products/javabeans)。

這個(gè)包中的一個(gè)非常重要的類就是BeanWrapper接口以及它對(duì)應(yīng)的實(shí)現(xiàn)(BeanWrapperImpl)。根據(jù)JavaDoc中的說明,BeanWrapper提供了設(shè)置和獲取屬性值(單個(gè)的或者是批量的),獲取屬性描述信息、查詢只讀或者可寫屬性等功能。不僅如此,BeanWrapper還支持嵌套屬性,你可以不受嵌套深度限制對(duì)子屬性的值進(jìn)行設(shè)置。所以,BeanWrapper無需任何輔助代碼就可以支持標(biāo)準(zhǔn)JavaBean的PropertyChangeListenersVetoableChangeListeners。除此之外,BeanWrapper還提供了設(shè)置索引屬性的支持。通常情況下,我們不在應(yīng)用程序中直接使用BeanWrapper而是使用DataBinderBeanFactory

BeanWrapper這個(gè)名字本身就暗示了它的功能:封裝了一個(gè)bean的行為,諸如設(shè)置和獲取屬性值等。

5.4.1.?設(shè)置和獲取屬性值以及嵌套屬性

設(shè)置和獲取屬性可以通過使用重載的setPropertyValue(s)getPropertyValue(s)方法來完成。在Spring自帶的JavaDoc中對(duì)它們有詳細(xì)的描述。值得一提的是,在這其中存在一些針對(duì)對(duì)象屬性的潛在約定規(guī)則。下面是一些例子:

表?5.1.?屬性示例

表達(dá)式 說明
name 表明屬性name與方法getName()isName() setName(..)相對(duì)應(yīng)。
account.name 指向?qū)傩詀ccount的嵌套屬性name,與之對(duì)應(yīng)的是getAccount().setName()和getAccount().getName()
account[2] 指向索引屬性account的第三個(gè)元素,索引屬性可能是一個(gè)數(shù)組(array),列表(list)或其它天然有序的容器。
account[COMPANYNAME] 指向一個(gè)Map實(shí)體account中以COMPANYNAME作為鍵值(key)所對(duì)應(yīng)的值

在下面的例子中你將看到一些使用BeanWrapper設(shè)置屬性的例子。

如果你不打算直接使用BeanWrapper,這部分不是很重要。如果你僅僅使用DataBinderBeanFactory或者他們的擴(kuò)展實(shí)現(xiàn),你可以跳過這部分直接閱讀PropertyEditor的部分。

考慮下面兩個(gè)類:

public class Company {
    private String name;
    private Employee managingDirector;

    public String getName()	{ 
        return this.name; 
    }
    public void setName(String name) { 
        this.name = name; 
    } 
    public Employee getManagingDirector() { 
        return this.managingDirector; 
    }
    public void setManagingDirector(Employee managingDirector) {
        this.managingDirector = managingDirector;
    }
}
public class Employee {
    private String name;
    private float salary;

    public String getName()	{
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getSalary() {
        return salary;
    }
    public void setSalary(float salary) {
        this.salary = salary;
    }
}

下面的代碼片斷展示了如何獲取和設(shè)置上面兩個(gè)示例類 CompaniesEmployees的屬性:

BeanWrapper company = BeanWrapperImpl(new Company());
// setting the company name..
company.setPropertyValue("name", "Some Company Inc.");
// ... can also be done like this:
PropertyValue value = new PropertyValue("name", "Some Company Inc.");
company.setPropertyValue(value);

// ok, let's create the director and tie it to the company:
BeanWrapper jim = BeanWrapperImpl(new Employee());
jim.setPropertyValue("name", "Jim Stravinsky");
company.setPropertyValue("managingDirector", jim.getWrappedInstance());

// retrieving the salary of the managingDirector through the company
Float salary = (Float) company.getPropertyValue("managingDirector.salary");

5.4.2.?內(nèi)建的PropertyEditor實(shí)現(xiàn)

Spring大量使用了PropertyEditor以在ObjectString之間進(jìn)行有效地轉(zhuǎn)化。仔細(xì)想想,有時(shí)換一種方式來展示屬性的確要比直接用對(duì)象自身更容易讓人理解。例如,Date可以表示成人們易讀的方式(如String的方式,'2007-14-09'),與此同時(shí)我們可以將這種人們比較容易理解的形式轉(zhuǎn)化為原有的原始Date類型(甚至對(duì)于任何人們輸入的可理解的日期形式都可以轉(zhuǎn)化成相應(yīng)的Date對(duì)象)。要做到這點(diǎn),可以通過注冊(cè)一個(gè)用戶定制編輯器(類型為java.beans.PropertyEditor)來完成。注冊(cè)一個(gè)用戶自定義的編輯器可以告訴BeanWrapper我們將要把屬性轉(zhuǎn)換為哪種類型。正如在先前章節(jié)提到的,另外一種選擇是在特定的IoC 容器中完成注冊(cè)。你可以從Sun提供的java.beans包的JavaDoc中了解到更多PropertyEditors的細(xì)節(jié)。

屬性編輯器主要應(yīng)用在以下兩個(gè)方面:

  • 使用PropertyEditors設(shè)置Bean屬性。當(dāng)你在XML文件中聲明的bean的屬性類型為java.lang.String時(shí),Spring將使用ClassEditor將String解析成Class對(duì)象(如果setter方法需要一個(gè)Class參數(shù)的話)。

  • 在Spring MVC架構(gòu)中使用各種PropertyEditors解析HTTP請(qǐng)求中的參數(shù)。你可以用各種CommandController的子類來進(jìn)行手工綁定。

Spring提供了許多內(nèi)建的PropertyEditors可以簡化我們的工作。下面的列表列出了所有Spring自帶的PropertyEditor,它們都位于org.springframework.beans.PropertyEditors包內(nèi)。它們中的大多數(shù)已經(jīng)默認(rèn)在BeanWrapperImpl的實(shí)現(xiàn)類中注冊(cè)好了。作為可配置的選項(xiàng),你也可以注冊(cè)你自己的屬性編輯器實(shí)現(xiàn)去覆蓋那些默認(rèn)編輯器。

表?5.2.?內(nèi)建的PropertyEditors

類名 說明
ByteArrayPropertyEditor byte數(shù)組編輯器。字符串將被簡單轉(zhuǎn)化成他們相應(yīng)的byte形式。在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了。
ClassEditor 將以字符串形式出現(xiàn)的類名解析成為真實(shí)的Class對(duì)象或者其他相關(guān)形式。當(dāng)這個(gè)Class沒有被找到,會(huì)拋出一個(gè)IllegalArgumentException的異常,在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了。
CustomBooleanEditor Boolean類型屬性定制的屬性編輯器。在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了,但可以被用戶自定義的編輯器實(shí)例覆蓋其行為。
CustomCollectionEditor 集合(Collection)編輯器,將任何源集合(Collection)轉(zhuǎn)化成目標(biāo)的集合類型的對(duì)象。
CustomDateEditor 為java.util.Date類型定制的屬性編輯器,支持用戶自定義的DateFormat。默認(rèn)沒有被BeanWrapperImpl注冊(cè),需要用戶通過指定恰當(dāng)?shù)膄ormat類型來注冊(cè)。
CustomNumberEditor Integer, Long, Float, Double等Number的子類定制的屬性編輯器。在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了,但可以被用戶自己定義的編輯器實(shí)例覆蓋其行為。
FileEditor 能夠?qū)⒆址D(zhuǎn)化成java.io.File對(duì)象,在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了。
InputStreamEditor 一個(gè)單向的屬性編輯器,能夠把文本字符串轉(zhuǎn)化成InputStream(通過ResourceEditorResource作為中介),因而InputStream屬性可以直接被設(shè)置成字符串。注意在默認(rèn)情況下,這個(gè)屬性編輯器不會(huì)為你關(guān)閉InputStream。在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了。
LocaleEditor 在String對(duì)象和Locale 對(duì)象之間互相轉(zhuǎn)化。(String的形式為[語言]_[國家]_[變量],這與Local對(duì)象的toString()方法得到的結(jié)果相同)在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了。
PatternEditor 可以將字符串轉(zhuǎn)化為JDK 1.5的 Pattern對(duì)象,反之亦然。
PropertiesEditor 能將String轉(zhuǎn)化為Properties對(duì)象(由JavaDoc規(guī)定的java.lang.Properties類型的格式)。在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了。
StringTrimmerEditor 一個(gè)用于修剪(trim)String類型的屬性編輯器,具有將一個(gè)空字符串轉(zhuǎn)化為null值的選項(xiàng)。默認(rèn)沒有注冊(cè),必須由用戶在需要的時(shí)候自行注冊(cè)。
URLEditor 能將String表示的URL轉(zhuǎn)化為一個(gè)具體的URL對(duì)象。在BeanWrapperImpl中已經(jīng)默認(rèn)注冊(cè)好了。

Spring使用java.beans.PropertyEditorManager來為可能需要的屬性編輯器設(shè)置查詢路徑。查詢路徑同時(shí)包含了sun.bean.editors,這個(gè)包中定義了很多PropertyEditor的具體實(shí)現(xiàn),包括FontColor以及絕大多數(shù)的基本類型的具體實(shí)現(xiàn)。同樣值得注意的是,標(biāo)準(zhǔn)的JavaBean基礎(chǔ)構(gòu)架能夠自動(dòng)識(shí)別PropertyEditor類(無需做額外的注冊(cè)工作),前提條件是,類和處理這個(gè)類的Editor位于同一級(jí)包結(jié)構(gòu),而Editor的命名遵循了在類名后加了“Editor”的規(guī)則。舉例來說,當(dāng)FooEditorFoo在同一級(jí)別包下的時(shí)候,FooEditor能夠識(shí)別Foo類并作為它的PropertyEditor。

com
  chank
    pop
      Foo
      FooEditor   // the PropertyEditor for the Foo class

注意,你同樣可以使用標(biāo)準(zhǔn)的BeanInfo JavaBean機(jī)制(詳情見這里)。在下面的例子中,你可以看到一個(gè)通過使用BeanInfo機(jī)制來為相關(guān)類的屬性明確定義一個(gè)或者多個(gè)PropertyEditor實(shí)例。

com
  chank
    pop
      Foo
      FooBeanInfo   // the BeanInfo for the Foo class

下面就是FooBeanInfo類的源碼,它將CustomNumberEditorFoo中的age屬性聯(lián)系在了一起。

public class FooBeanInfo extends SimpleBeanInfo {
      
    public PropertyDescriptor[] getPropertyDescriptors() {
        try {
            final PropertyEditor numberPE = new CustomNumberEditor(Integer.class, true);
            PropertyDescriptor ageDescriptor = new PropertyDescriptor("age", Foo.class) {
                public PropertyEditor createPropertyEditor(Object bean) {
                    return numberPE;
                };
            };
            return new PropertyDescriptor[] { ageDescriptor };
        }
        catch (IntrospectionException ex) {
            throw new Error(ex.toString());
        }
    }
}

5.4.2.1.?注冊(cè)用戶自定義的PropertyEditor

當(dāng)以一個(gè)字符串值來設(shè)置bean屬性時(shí),Spring IoC 容器最終使用標(biāo)準(zhǔn)的JavaBean PropertyEditor來將這些字符串轉(zhuǎn)化成復(fù)雜的數(shù)據(jù)類型。Spring預(yù)先注冊(cè)了一些PropertyEditor(舉例來說,將一個(gè)以字符串表示的Class轉(zhuǎn)化成Class對(duì)象)。除此之外,Java標(biāo)準(zhǔn)的JavaBean PropertyEditor會(huì)識(shí)別在同一包結(jié)構(gòu)下的類和它對(duì)應(yīng)的命名恰當(dāng)?shù)腅ditor,并自動(dòng)將其作為這個(gè)類的的Editor。

如果你想注冊(cè)自己定義的PropertyEditor,那么有幾種不同的機(jī)制供君選擇。其中,最原始的手工方式是在你有一個(gè)BeanFactory的引用實(shí)例時(shí),使用ConfigurableBeanFactoryregisterCustomEditor()方法。當(dāng)然,通常這種方法不夠方便,因而并不推薦使用。另外一個(gè)簡便的方法是使用一個(gè)稱之為CustomEditorConfigurer的特殊的bean factory后置處理器。盡管bean factory的后置處理器可以半手工化的與BeanFactory實(shí)現(xiàn)一起使用,但是它存在著一個(gè)嵌套屬性的建立方式。因此,強(qiáng)烈推薦的一種做法是與ApplicationContext一起來使用它。這樣就能使之與其他的bean一樣以類似的方式部署同時(shí)被容器所感知并使用。

注意所有的bean factory和application context都會(huì)自動(dòng)地使用一系列的內(nèi)置屬性編輯器,通過BeanWrapper來處理屬性的轉(zhuǎn)化。在這里列出一些在BeanWrapper中注冊(cè)的標(biāo)準(zhǔn)的屬性編輯器。除此之外,ApplicationContext覆蓋了一些默認(rèn)行為,并為之增加了許多編輯器來處理在某種意義上合適于特定的application context類型的資源查找。

標(biāo)準(zhǔn)的JavaBean的PropertyEditor實(shí)例將以String表示的值轉(zhuǎn)化成實(shí)際復(fù)雜的數(shù)據(jù)類型。CustomEditorConfigurer作為一個(gè)bean factory的后置處理器,能夠便捷地將一些額外的PropertyEditor實(shí)例加入到ApplicationContext中去。

考慮用戶定義的類ExoticTypeDependsOnExoticType,其中,后者需要將前者設(shè)置為它的屬性:

package example;
		
public class ExoticType {

    private String name;

    public ExoticType(String name) {
        this.name = name;
    }
}

public class DependsOnExoticType { 
   
    private ExoticType type;

    public void setType(ExoticType type) {
        this.type = type;
    }
}

在一切建立起來以后,我們希望通過指定一個(gè)字符串來設(shè)置type屬性的值,然后PropertyEditor將在幕后幫你將其轉(zhuǎn)化為實(shí)際的ExoticType對(duì)象:

<bean id="sample" class="example.DependsOnExoticType">
    <property name="type" value="aNameForExoticType"/>
</bean>

PropertyEditor的實(shí)現(xiàn)看上去就像這樣:

// converts string representation to ExoticType object
package example;

public class ExoticTypeEditor extends PropertyEditorSupport {

    private String format;

    public void setFormat(String format) {
        this.format = format;
    }
    
    public void setAsText(String text) {
        if (format != null && format.equals("upperCase")) {
            text = text.toUpperCase();
        }
        ExoticType type = new ExoticType(text);
        setValue(type);
    }
}

最后,我們通過使用CustomEditorConfigurer來為ApplicationContext注冊(cè)一個(gè)新的PropertyEditor,這樣,我們就可以在任何需要的地方使用它了:

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
  <property name="customEditors">
    <map>
      <entry key="example.ExoticType">
        <bean class="example.ExoticTypeEditor">
          <property name="format" value="upperCase"/>
        </bean>
      </entry>
    </map>
  </property>
</bean>
5.4.2.1.1.?使用PropertyEditorRegistrars

將屬性編輯器注冊(cè)到Spring容器的另一種方式是創(chuàng)建并使用PropertyEditorRegistrar。 當(dāng)你在不同情況下(如編寫一個(gè)相應(yīng)的注冊(cè)器然后在多種情況下重用它)需要使用相同的屬性編輯器時(shí)該接口特別有用。 PropertyEditorRegistrarsPropertyEditorRegistry接口協(xié)同工作, PropertyEditorRegistry是一個(gè)由Spring的BeanWrapper (及DataBinder)實(shí)現(xiàn)的一個(gè)接口。 當(dāng)與CustomEditorConfigurer (在此處曾介紹過)協(xié)同使用時(shí), PropertyEditorRegistrars尤為方便, CustomEditorConfigurer會(huì)暴露一個(gè)叫做setPropertyEditorRegistrars(..)的方法: 在這種情況下DataBinder和Spring MVC Controllers會(huì)很容易地共享加到CustomEditorConfigurer中的PropertyEditorRegistrars。 此外,自定義編輯器無需再進(jìn)行同步了:每次創(chuàng)建bean時(shí)PropertyEditorRegistrar都會(huì)創(chuàng)建一個(gè)新的PropertyEditor

通過示例最能說明PropertyEditorRegistrar的優(yōu)點(diǎn)了。首先,你需要?jiǎng)?chuàng)建你自己的PropertyEditorRegistrar實(shí)現(xiàn):

package com.foo.editors.spring;

public final class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar {

    public void registerCustomEditors(PropertyEditorRegistry registry) {

        // it is expected that new PropertyEditor instances are created
        registry.registerCustomEditor(ExoticType.class, new ExoticTypeEditor());

        // you could register as many custom property editors as are required here...
    }
}

org.springframework.beans.support.ResourceEditorRegistrar是另一個(gè)PropertyEditorRegistrar實(shí)現(xiàn)的范例。請(qǐng)注意在registerCustomEditors(..)方法的實(shí)現(xiàn)中,它是如何創(chuàng)建每個(gè)屬性編輯器的實(shí)例的。

接下來我們配置一個(gè)CustomEditorConfigurer,然后將CustomPropertyEditorRegistrar實(shí)例注入其中:

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
    <property name="propertyEditorRegistrars">
        <list>
            <ref bean="customPropertyEditorRegistrar"/>
        </list>
    </property>
</bean>

<bean id="customPropertyEditorRegistrar" class="com.foo.editors.spring.CustomPropertyEditorRegistrar"/>

最后,稍微偏離一下本章的主題,對(duì)于使用了Spring的MVC web框架的應(yīng)用來說,與數(shù)據(jù)綁定Controllers (例如SimpleFormController)一同使用PropertyEditorRegistrars會(huì)非常便捷。在下面的例子中,initBinder(..)方法的實(shí)現(xiàn)使用了PropertyEditorRegistrar

public final class RegisterUserController extends SimpleFormController {

    private final PropertyEditorRegistrar customPropertyEditorRegistrar;

    public RegisterUserController(PropertyEditorRegistrar propertyEditorRegistrar) {
        this.customPropertyEditorRegistrar = propertyEditorRegistrar;
    }

    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        this.customPropertyEditorRegistrar.registerCustomEditors(binder);
    }

    // other methods to do with registering a User
}

這種注冊(cè)PropertyEditor的形式使得代碼非常簡練(initBinder(..)的實(shí)現(xiàn)就一行代碼而已!),同時(shí)它使得通用的PropertyEditor注冊(cè)代碼可被封裝到一個(gè)類中,然后在需要時(shí)被多個(gè)Controllers共享。

上一篇: 下一篇: