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

?? ??? ??
前言 簡(jiǎn)介 概覽 使用場(chǎng)景 Spring 2.0和 2.5的新特性 簡(jiǎn)介 控制反轉(zhuǎn)(IoC)容器 新的bean作用域 更簡(jiǎn)單的XML配置 可擴(kuò)展的XML編寫(xiě) Annotation(注解)驅(qū)動(dòng)配置 在classpath中自動(dòng)搜索組件 面向切面編程(AOP) 更加簡(jiǎn)單的AOP XML配置 對(duì)@AspectJ 切面的支持 對(duì)bean命名pointcut( bean name pointcut element)的支持 對(duì)AspectJ裝載時(shí)織入(AspectJ load-time weaving)的支持 中間層 在XML里更為簡(jiǎn)單的聲明性事務(wù)配置 對(duì)Websphere 事務(wù)管理的完整支持 JPA 異步的JMS JDBC Web層 Spring MVC合理的默認(rèn)值 Portlet 框架 基于Annotation的控制器 Spring MVC的表單標(biāo)簽庫(kù) 對(duì)Tiles 2 支持 對(duì)JSF 1.2支持 JAX-WS支持 其他 動(dòng)態(tài)語(yǔ)言支持 增強(qiáng)的測(cè)試支持 JMX 支持 將Spring 應(yīng)用程序上下文部署為JCA adapter 計(jì)劃任務(wù) 對(duì)Java 5 (Tiger) 支持 移植到Spring 2.5 改變 支持的JDK版本 Spring 2.5的Jar打包 XML配置 Deprecated(淘汰)的類(lèi)和方法 Apache OJB iBATIS Hibernate JDO UrlFilenameViewController 更新的樣例應(yīng)用 改進(jìn)的文檔 核心技術(shù) IoC(控制反轉(zhuǎn))容器 簡(jiǎn)介 基本原理 - 容器和bean 容器 配置元數(shù)據(jù) 實(shí)例化容器 XML配置元數(shù)據(jù)的結(jié)構(gòu) 多種bean bean的命名 bean的別名 實(shí)例化bean 用構(gòu)造器來(lái)實(shí)例化 使用靜態(tài)工廠方法實(shí)例化 使用實(shí)例工廠方法實(shí)例化 使用容器 依賴(lài) 注入依賴(lài) 構(gòu)造器注入 構(gòu)造器參數(shù)解析 構(gòu)造器參數(shù)類(lèi)型匹配 構(gòu)造參數(shù)索引 Setter注入 一些例子 依賴(lài)配置詳解 直接變量(基本類(lèi)型、Strings類(lèi)型等。) idref元素 引用其它的bean(協(xié)作者) 內(nèi)部bean 集合 集合的合并 強(qiáng)類(lèi)型集合(僅適用于Java5+) Nulls XML配置文件的簡(jiǎn)寫(xiě)及其他 XML-based configuration metadata shortcuts 使用p名稱(chēng)空間配置屬性 組合屬性名稱(chēng) 使用depends-on 延遲初始化bean 自動(dòng)裝配(autowire)協(xié)作者 將bean排除在自動(dòng)裝配之外 依賴(lài)檢查 方法注入 Lookup方法注入 自定義方法的替代方案 Bean的作用域 Singleton作用域 Prototype作用域 Singleton beans和prototype-bean的依賴(lài) 其他作用域 初始化web配置 Request作用域 Session作用域 global session作用域 作用域bean與依賴(lài) 選擇創(chuàng)建代理的類(lèi)型 自定義作用域 創(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)國(guó)際化 事件 底層資源的訪問(wè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)檢測(cè)組件 使用過(guò)濾器自定義掃描 自動(dòng)檢測(cè)組件的命名 為自動(dòng)檢測(cè)的組件提供一個(gè)作用域 用注解提供限定符元數(shù)據(jù) 注冊(cè)一個(gè)LoadTimeWeaver 資源 簡(jiǎn)介 Resource接口 內(nèi)置 Resource 實(shí)現(xiàn) UrlResource ClassPathResource FileSystemResource ServletContextResource InputStreamResource ByteArrayResource ResourceLoader接口 ResourceLoaderAware 接口 把Resource作為屬性來(lái)配置 Application context 和Resource 路徑 構(gòu)造application context 創(chuàng)建 ClassPathXmlApplicationContext 實(shí)例 - 簡(jiǎn)介 Application context構(gòu)造器中資源路徑的通配符 Ant風(fēng)格的pattern 潛在的可移植性 classpath*: 前綴 其他關(guān)于通配符的說(shuō)明 FileSystemResource 說(shuō)明 校驗(yàn),數(shù)據(jù)綁定,BeanWrapper,與屬性編輯器 簡(jiǎn)介 使用Spring的Validator接口進(jìn)行校驗(yàn) 從錯(cuò)誤代碼到錯(cuò)誤信息 Bean處理和BeanWrapper 設(shè)置和獲取屬性值以及嵌套屬性 內(nèi)建的PropertyEditor實(shí)現(xiàn) 注冊(cè)用戶自定義的PropertyEditor 使用PropertyEditorRegistrars 使用Spring進(jìn)行面向切面編程(AOP) 簡(jiǎn)介 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) 訪問(wèn)當(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? 混合切面類(lèi)型 代理機(jī)制 理解AOP代理 以編程方式創(chuàng)建@AspectJ代理 在Spring應(yīng)用中使用AspectJ 在Spring中使用AspectJ進(jìn)行domain object的依賴(lài)注入 @Configurable對(duì)象的單元測(cè)試 Working with multiple application contexts Spring中其他的AspectJ切面 使用Spring IoC來(lái)配置AspectJ的切面 在Spring應(yīng)用中使用AspectJ加載時(shí)織入(LTW) 第一個(gè)例子 切面 'META-INF/aop.xml' 相關(guān)類(lèi)庫(kù)(JARS) Spring配置 特定環(huán)境的配置 通用Java應(yīng)用 Tomcat WebLogic 更多資源 Spring AOP APIs 簡(jiǎn)介 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)的超類(lèi) 自定義切入點(diǎn) Spring的通知API 通知的生命周期 Spring里的通知類(lèi)型 攔截環(huán)繞通知 前置通知 異常通知 后置通知 引入通知 Spring里的Advisor API 使用ProxyFactoryBean創(chuàng)建AOP代理 基礎(chǔ) JavaBean屬性 基于JDK和CGLIB的代理 對(duì)接口進(jìn)行代理 對(duì)類(lèi)進(jìn)行代理 使用“全局”通知器 簡(jiǎn)化代理定義 使用ProxyFactory通過(guò)編程創(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類(lèi)型 更多資源 測(cè)試 簡(jiǎn)介 單元測(cè)試 Mock對(duì)象 JNDI Servlet API Portlet API 單元測(cè)試支持類(lèi) 通用工具類(lèi) Spring MVC 集成測(cè)試 概覽 使用哪個(gè)支持框架 通用目標(biāo) 上下文管理及緩存 測(cè)試fixtures依賴(lài)注入 事務(wù)管理 集成測(cè)試支持類(lèi) JDBC測(cè)試支持 常用注解 JUnit 3.8遺留支持 上下文管理及緩存 測(cè)試fixture依賴(lài)注入 字段級(jí)別(Field Level)注入 事務(wù)管理 JUnit 3.8 遺留支持類(lèi) Java 5+ 專(zhuān)有支持 使用注解的事務(wù)相關(guān)測(cè)試 JPA支持類(lèi) Spring TestContext Framework 主要的抽象 上下文管理和緩存 測(cè)試fixture的依賴(lài)注入 事務(wù)管理 TestContext支持類(lèi) JUnit 3.8支持類(lèi) JUnit 4.4支持類(lèi) 定制JUnit 4.4運(yùn)行器 TestNG支持類(lèi) TestContext框架注解支持 PetClinic示例 更多資源 中間層數(shù)據(jù)訪問(wèn) 事務(wù)管理 簡(jiǎn)介 動(dòng)機(jī) 關(guān)鍵抽象 使用資源同步的事務(wù) 高層次方案 低層次方案 TransactionAwareDataSourceProxy 聲明式事務(wù)管理 理解Spring的聲明式事務(wù)管理實(shí)現(xiàn) 第一個(gè)例子 回滾 為不同的bean配置不同的事務(wù)語(yǔ)義 <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 常見(jiàn)問(wèn)題的解決方法 對(duì)一個(gè)特定的 DataSource 使用了錯(cuò)誤的事務(wù)管理器 更多的資源 DAO支持 簡(jiǎn)介 一致的異常層次 一致的DAO支持抽象類(lèi) 使用JDBC進(jìn)行數(shù)據(jù)訪問(wèn) 簡(jiǎn)介 選擇一種工作模式 Spring JDBC包結(jié)構(gòu) 利用JDBC核心類(lèi)控制JDBC的基本操作和錯(cuò)誤處理 JdbcTemplate類(lèi) 一些示例 查詢(xún)(SELECT) 更新(INSERT/UPDATE/DELETE) 其他操作 JdbcTemplate 的最佳實(shí)踐 NamedParameterJdbcTemplate類(lèi) SimpleJdbcTemplate類(lèi) DataSource接口 SQLExceptionTranslator接口 執(zhí)行SQL語(yǔ)句 執(zhí)行查詢(xún) 更新數(shù)據(jù)庫(kù) 獲取自動(dòng)生成的主鍵 控制數(shù)據(jù)庫(kù)連接 DataSourceUtils類(lèi) SmartDataSource接口 AbstractDataSource類(lèi) SingleConnectionDataSource類(lèi) DriverManagerDataSource類(lèi) TransactionAwareDataSourceProxy類(lèi) DataSourceTransactionManager類(lèi) NativeJdbcExtractor JDBC批量操作 使用JdbcTemplate進(jìn)行批量操作 使用SimpleJdbcTemplate進(jìn)行批量操作 通過(guò)使用SimpleJdbc類(lèi)簡(jiǎn)化JDBC操作 使用SimpleJdbcInsert插入數(shù)據(jù) 使用SimpleJdbcInsert來(lái)獲取自動(dòng)生成的主鍵 指定SimpleJdbcInsert所使用的字段 使用SqlParameterSource提供參數(shù)值 使用SimpleJdbcCall調(diào)用存儲(chǔ)過(guò)程 聲明SimpleJdbcCall使用的參數(shù) 如何定義SqlParameters 使用SimpleJdbcCall調(diào)用內(nèi)置函數(shù) 使用SimpleJdbcCall返回的ResultSet/REF Cursor 用Java對(duì)象來(lái)表達(dá)JDBC操作 SqlQuery類(lèi) MappingSqlQuery類(lèi) SqlUpdate類(lèi) StoredProcedure類(lèi) SqlFunction類(lèi) 參數(shù)和數(shù)據(jù)處理的基本原則 為參數(shù)設(shè)置SQL類(lèi)型信息 處理BLOB 和 CLOB對(duì)象 在IN語(yǔ)句中傳入一組參數(shù)值 處理復(fù)雜類(lèi)型的存儲(chǔ)過(guò)程調(diào)用 使用ORM工具進(jìn)行數(shù)據(jù)訪問(wèn) 簡(jiǎn)介 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 其它的簡(jiǎn)單控制器 MultiActionController 命令控制器 處理器映射(handler mapping) BeanNameUrlHandlerMapping SimpleUrlHandlerMapping 攔截器(HandlerInterceptor) 視圖與視圖解析 視圖解析器(ViewResolver) 視圖解析鏈 重定向(Rediret)到另一個(gè)視圖 RedirectView redirect:前綴 forward:前綴 本地化解析器 AcceptHeaderLocaleResolver CookieLocaleResolver SessionLocaleResolver LocaleChangeInterceptor 使用主題 簡(jiǎn)介 如何定義主題 主題解析器 Spring對(duì)分段文件上傳(multipart file upload)的支持 介紹 使用MultipartResolver 在表單中處理分段文件上傳 使用Spring的表單標(biāo)簽庫(kù) 配置 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ù) 簡(jiǎn)介 JSP和JSTL 視圖解析器 'Plain-old' JSPs versus JSTL 'Plain-old' JSP與JSTL 幫助簡(jiǎn)化開(kāi)發(fā)的額外的標(biāo)簽 Tiles 需要的資源 如何集成Tiles UrlBasedViewResolver類(lèi) ResourceBundleViewResolver類(lèi) SimpleSpringPreparerFactory 和 SpringBeanPreparerFactory Velocity和FreeMarker 需要的資源 Context 配置 創(chuàng)建模板 高級(jí)配置 velocity.properties FreeMarker 綁定支持和表單處理 用于綁定的宏 簡(jiǎn)單綁定 表單輸入生成宏 輸入域 選擇輸入域 重載HTML轉(zhuǎn)碼行為并使你的標(biāo)簽符合XHTML XSLT 寫(xiě)在段首 Bean 定義 標(biāo)準(zhǔn)MVC控制器代碼 把模型數(shù)據(jù)轉(zhuǎn)化為XML 定義視圖屬性 文檔轉(zhuǎn)換 小結(jié) 文檔視圖(PDF/Excel) 簡(jiǎn)介 配置和安裝 文檔視圖定義 Controller 代碼 Excel視圖子類(lèi) PDF視圖子類(lèi) JasperReports 依賴(lài)的資源 配置 配置ViewResolver 配置View 關(guān)于報(bào)表文件 使用 JasperReportsMultiFormatView 構(gòu)造ModelAndView 使用子報(bào)表 配置子報(bào)表文件 配置子報(bào)表數(shù)據(jù)源 配置Exporter的參數(shù) 集成其它Web框架 簡(jiǎn)介 通用配置 JavaServer Faces DelegatingVariableResolver FacesContextUtils Struts ContextLoaderPlugin DelegatingRequestProcessor DelegatingActionProxy ActionSupport Classes Tapestry 注入 Spring 托管的 beans 將 Spring Beans 注入到 Tapestry 頁(yè)面中 組件定義文件 添加抽象訪問(wèn)方法 將 Spring Beans 注入到 Tapestry 頁(yè)面中 - Tapestry 4.0+ 風(fēng)格 WebWork 更多資源 Portlet MVC框架 介紹 控制器 - MVC中的C 視圖 - MVC中的V Web作用范圍的Bean DispatcherPortlet ViewRendererServlet 控制器 AbstractController 和 PortletContentGenerator 其它簡(jiǎn)單的控制器 Command控制器 PortletWrappingController 處理器映射 PortletModeHandlerMapping ParameterHandlerMapping PortletModeParameterHandlerMapping 增加 HandlerInterceptors HandlerInterceptorAdapter ParameterMappingInterceptor 視圖和它們的解析 Multipart文件上傳支持 使用 PortletMultipartResolver 處理表單里的文件上傳 異常處理 Portlet應(yīng)用的部署 整合 使用Spring進(jìn)行遠(yuǎn)程訪問(wèn)與Web服務(wù) 簡(jiǎn)介 使用RMI暴露服務(wù) 使用RmiServiceExporter暴露服務(wù) 在客戶端鏈接服務(wù) 使用Hessian或者Burlap通過(guò)HTTP遠(yuǎn)程調(diào)用服務(wù) 為Hessian和co.配置DispatcherServlet 使用HessianServiceExporter暴露你的bean 在客戶端連接服務(wù) 使用Burlap 對(duì)通過(guò)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訪問(wèn)web服務(wù) 注冊(cè)JAX-RPC Bean映射 注冊(cè)自己的JAX-RPC 處理器 使用JAX-WS暴露基于servlet的web服務(wù) 使用JAX-WS暴露單獨(dú)web服務(wù) 使用Spring支持的JAX-WS RI來(lái)暴露服務(wù) 使用JAX-WS訪問(wèn)web服務(wù) 使用XFire來(lái)暴露Web服務(wù) JMS 服務(wù)端配置 客戶端配置 對(duì)遠(yuǎn)程接口不提供自動(dòng)探測(cè)實(shí)現(xiàn) 在選擇這些技術(shù)時(shí)的一些考慮 Enterprise Java Beans (EJB) 集成 簡(jiǎn)介 訪問(wèn)EJB 概念 訪問(wèn)本地的無(wú)狀態(tài)Session Bean(SLSB) 訪問(wèn)遠(yuǎn)程SLSB Accessing EJB 2.x SLSBs versus EJB 3 SLSBs 使用Spring提供的輔助類(lèi)實(shí)現(xiàn)EJB組件 EJB 2.x base classes EJB 3 注入攔截 JMS (Java Message Service) 簡(jiǎn)介 使用Spring JMS JmsTemplate 連接工廠 目的地管理 消息偵聽(tīng)容器 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ù)類(lèi)型 AutodetectCapableMBeanInfoAssembler接口 用Java接口定義管理接口 使用MethodNameBasedMBeanInfoAssembler 控制Bean的ObjectName 從Properties讀取Properties 使用MetadataNamingStrategy <context:mbean-export/>元素 JSR-160連接器 服務(wù)器端連接器 客戶端連接器 基于Burlap/Hessian/SOAP的JMX 通過(guò)代理訪問(wèn)MBean 通知 為通知注冊(cè)監(jiān)聽(tīng)器 發(fā)布通知 更多資源 JCA CCI 簡(jiǎn)介 配置CCI 連接器配置 在Spring中配置ConnectionFactory 配置CCI連接 使用一個(gè) CCI 單連接 使用Spring的 CCI訪問(wèn)支持 記錄轉(zhuǎn)換 CciTemplate類(lèi) DAO支持 自動(dòng)輸出記錄生成 總結(jié) 直接使用一個(gè)CCI Connection接口和Interaction接口 CciTemplate 使用示例 建模CCI訪問(wèn)為操作對(duì)象 MappingRecordOperation MappingCommAreaOperation 自動(dòng)生成輸出記錄 總結(jié) MappingRecordOperation 使用示例 MappingCommAreaOperation 使用示例 事務(wù) Spring郵件抽象層 簡(jiǎn)介 使用Spring郵件抽象 MailSender 和 SimpleMailMessage 的基本用法 使用 JavaMailSender 和 MimeMessagePreparator 使用MimeMessageHelper 發(fā)送附件和嵌入式資源(inline resources) 附件 內(nèi)嵌資源 使用模板來(lái)創(chuàng)建郵件內(nèi)容 一個(gè)基于Velocity的示例 Spring中的定時(shí)調(diào)度(Scheduling)和線程池(Thread Pooling) 簡(jiǎn)介 使用OpenSymphony Quartz 調(diào)度器 使用JobDetailBean 使用 MethodInvokingJobDetailFactoryBean 使用triggers和SchedulerFactoryBean來(lái)包裝任務(wù) 使用JDK Timer支持類(lèi) 創(chuàng)建定制的timers 使用 MethodInvokingTimerTaskFactoryBean類(lèi) 最后:使用TimerFactoryBean來(lái)設(shè)置任務(wù) SpringTaskExecutor抽象 TaskExecutor接口 TaskExecutor類(lèi)型 使用TaskExecutor 動(dòng)態(tài)語(yǔ)言支持 介紹 第一個(gè)示例 定義動(dòng)態(tài)語(yǔ)言支持的bean 公共概念 <lang:language/> 元素 Refreshable bean 內(nèi)置動(dòng)態(tài)語(yǔ)言源文件 理解dynamic-language-backed bean上下文中的構(gòu)造器注入 JRuby beans Groovy beans 通過(guò)回調(diào)定制Groovy對(duì)象 BeanShell beans 場(chǎng)景 Spring MVC控制器的腳本化 Validator的腳本化 Bits and bobs AOP - 通知腳本化bean 作用域 更多的資源 注解和源代碼級(jí)的元數(shù)據(jù)支持 簡(jiǎn)介 Spring的元數(shù)據(jù)支持 注解 @Required Spring中的其它@Annotations Jakarta Commons Attributes集成 元數(shù)據(jù)和Spring AOP自動(dòng)代理 基本原理 聲明式事務(wù)管理 示例程序 演示案例 介紹 使用動(dòng)態(tài)語(yǔ)言實(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開(kāi)發(fā)手冊(cè)中文化項(xiàng)目 聲明 致謝 參與人員 項(xiàng)目歷程
??

7.5.?使用ProxyFactoryBean創(chuàng)建AOP代理

如果你正在使用Spring IoC容器(即ApplicationContext或BeanFactory)來(lái)管理你的業(yè)務(wù)對(duì)象--這正是你應(yīng)該做的--你也許會(huì)想要使用Spring中關(guān)于AOP的FactoryBean。 (記住使用工廠bean引入一個(gè)間接層之后,我們就可以創(chuàng)建不同類(lèi)型的對(duì)象了)。

注意

Spring 2.0的AOP支持也在底層使用工廠bean。

在Spring里創(chuàng)建一個(gè)AOP代理的基本方法是使用org.springframework.aop.framework.ProxyFactoryBean。 這個(gè)類(lèi)對(duì)應(yīng)用的切入點(diǎn)和通知提供了完整的控制能力(包括它們的應(yīng)用順序)。然而如果你不需要這種控制,你會(huì)喜歡更簡(jiǎn)單的方式。

7.5.1.?基礎(chǔ)

像其它的FactoryBean實(shí)現(xiàn)一樣,ProxyFactoryBean引入了一個(gè)間接層。如果你定義一個(gè)名為fooProxyFactoryBean, 引用foo的對(duì)象看到的將不是ProxyFactoryBean實(shí)例本身,而是一個(gè)ProxyFactoryBean實(shí)現(xiàn)里getObject() 方法所創(chuàng)建的對(duì)象。 這個(gè)方法將創(chuàng)建一個(gè)AOP代理,它包裝了一個(gè)目標(biāo)對(duì)象。

使用ProxyFactoryBean或者其它IoC相關(guān)類(lèi)帶來(lái)的最重要的好處之一就是創(chuàng)建AOP代理,這意味著通知和切入點(diǎn)也可以由IoC來(lái)管理。這是一個(gè)強(qiáng)大的功能并使得某些特定的解決方案成為可能, 而這些用其它AOP框架很難做到。例如,一個(gè)通知也許本身也要引用應(yīng)用程序?qū)ο螅ú粌H僅是其它AOP框架中也可以訪問(wèn)的目標(biāo)對(duì)象),這令你可以從依賴(lài)注射的可拔插特性中獲益。

7.5.2.?JavaBean屬性

通常情況下Spring提供了大多數(shù)的FactoryBean實(shí)現(xiàn),ProxyFactoryBean類(lèi)本身也是一個(gè)JavaBean。它的屬性被用來(lái):

  • 指定你希望代理的目標(biāo)對(duì)象

  • 指定是否使用CGLIB(查看下面叫做第?7.5.3?節(jié) “基于JDK和CGLIB的代理”的小節(jié))。

一些主要屬性從org.springframework.aop.framework.ProxyConfig里繼承下來(lái)(這個(gè)類(lèi)是Spring里所有AOP代理工廠的父類(lèi))。這些主要屬性包括:

  • proxyTargetClass:這個(gè)屬性為true時(shí),目標(biāo)類(lèi)本身被代理而不是目標(biāo)類(lèi)的接口。如果這個(gè)屬性值被設(shè)為true,CGLIB代理將被創(chuàng)建(可以參看下面名為第?7.5.3?節(jié) “基于JDK和CGLIB的代理”的章節(jié))。

  • optimize:用來(lái)控制通過(guò)CGLIB創(chuàng)建的代理是否使用激進(jìn)的優(yōu)化策略。 除非完全了解AOP代理如何處理優(yōu)化,否則不推薦用戶使用這個(gè)設(shè)置。目前這個(gè)屬性?xún)H用于CGLIB代理; 對(duì)于JDK動(dòng)態(tài)代理(缺省代理)無(wú)效。

  • frozen:如果一個(gè)代理配置是frozen的,就不允許對(duì)該配置進(jìn)行修改。 這在簡(jiǎn)單優(yōu)化和不希望調(diào)用者在代理創(chuàng)建后操作代理(通過(guò)Advised接口) 時(shí)很有用。缺省值為false,即可以進(jìn)行類(lèi)似添加附加通知的操作。

  • exposeProxy:決定當(dāng)前代理是否被暴露在一個(gè)ThreadLocal 中以便被目標(biāo)對(duì)象訪問(wèn)。如果目標(biāo)對(duì)象需要獲取代理而且exposeProxy屬性被設(shè)為 true,目標(biāo)對(duì)象可以使用AopContext.currentProxy()方法。

  • aopProxyFactory:使用AopProxyFactory的實(shí)現(xiàn)。這提供了一種方法來(lái)自定義是否使用動(dòng)態(tài)代理,CGLIB或其它代理策略。 缺省實(shí)現(xiàn)將根據(jù)情況選擇動(dòng)態(tài)代理或者CGLIB。一般情況下應(yīng)該沒(méi)有使用這個(gè)屬性的需要;它是被設(shè)計(jì)來(lái)在Spring 1.1中添加新的代理類(lèi)型的。

ProxyFactoryBean中需要說(shuō)明的其它屬性包括:

  • proxyInterfaces:需要代理的接口名的字符串?dāng)?shù)組。 如果沒(méi)有提供,將為目標(biāo)類(lèi)使用一個(gè)CGLIB代理(也可以查看下面名為第?7.5.3?節(jié) “基于JDK和CGLIB的代理”的章節(jié))。

  • interceptorNamesAdvisor的字符串?dāng)?shù)組,可以包括攔截器或其它通知的名字。 順序是很重要的,排在前面的將被優(yōu)先服務(wù)。就是說(shuō)列表里的第一個(gè)攔截器將能夠第一個(gè)攔截調(diào)用。

    這里的名字是當(dāng)前工廠中bean的名字,包括父工廠中bean的名字。這里你不能使用bean的引用因?yàn)檫@會(huì)導(dǎo)致ProxyFactoryBean忽略通知的單例設(shè)置。

    你可以把一個(gè)攔截器的名字加上一個(gè)星號(hào)作為后綴(*)。這將導(dǎo)致這個(gè)應(yīng)用程序里所有名字以星號(hào)之前部分開(kāi)頭的通知器都被應(yīng)用。 你可以在第?7.5.6?節(jié) “使用“全局”通知器” 發(fā)現(xiàn)一個(gè)使用這個(gè)特性的例子。

  • 單例:工廠是否應(yīng)該返回同一個(gè)對(duì)象,不論方法getObject()被調(diào)用的多頻繁。 多個(gè)FactoryBean實(shí)現(xiàn)都提供了這個(gè)方法。缺省值是true。 如果你希望使用有狀態(tài)的通知--例如,有狀態(tài)的mixin--可以把單例屬性的值設(shè)置為false來(lái)使用原型通知。

7.5.3.?基于JDK和CGLIB的代理

這個(gè)小節(jié)作為說(shuō)明性文檔,解釋了對(duì)于一個(gè)目標(biāo)對(duì)象(需要被代理的對(duì)象),ProxyFactryBean是如何決定究竟創(chuàng)建一個(gè)基于JDK還是CGLIB的代理的。

注意

ProxyFactoryBean需要?jiǎng)?chuàng)建基于JDK還是CGLIB代理的具體行為在版本1.2.x和2.0中有所不同。 現(xiàn)在ProxyFactoryBean在關(guān)于自動(dòng)檢測(cè)接口方面使用了與TransactionProxyFactoryBean相似的語(yǔ)義。

如果一個(gè)需要被代理的目標(biāo)對(duì)象的類(lèi)(后面將簡(jiǎn)單地稱(chēng)它為目標(biāo)類(lèi))沒(méi)有實(shí)現(xiàn)任何接口,那么一個(gè)基于CGLIB的代理將被創(chuàng)建。 這是最簡(jiǎn)單的場(chǎng)景,因?yàn)镴DK代理是基于接口的,沒(méi)有接口意味著沒(méi)有使用JDK進(jìn)行代理的可能。 在目標(biāo)bean里將被插入探測(cè)代碼,通過(guò)interceptorNames屬性給出了攔截器的列表。 注意一個(gè)基于CGLIB的代理將被創(chuàng)建即使ProxyFactoryBeanproxyTargetClass屬性被設(shè)置為false。 (很明顯這種情況下對(duì)這個(gè)屬性進(jìn)行設(shè)置是沒(méi)有意義的,最好把它從bean的定義中移除,因?yàn)殡m然這只是個(gè)多余的屬性,但在許多情況下會(huì)引起混淆。)

如果目標(biāo)類(lèi)實(shí)現(xiàn)了一個(gè)(或者更多)接口,那么創(chuàng)建代理的類(lèi)型將根據(jù)ProxyFactoryBean的配置來(lái)決定。

如果ProxyFactoryBeanproxyTargetClass屬性被設(shè)為true,那么一個(gè)基于CGLIB的代理將創(chuàng)建。 這樣的規(guī)定是有意義的,遵循了最小驚訝法則(保證了設(shè)定的一致性)。甚至當(dāng)ProxyFactoryBeanproxyInterfaces屬性被設(shè)置為一個(gè)或者多個(gè)全限定接口名, 而proxyTargetClass屬性被設(shè)置為true仍然實(shí)際使用基于CGLIB的代理。

如果ProxyFactoryBeanproxyInterfaces屬性被設(shè)置為一個(gè)或者多個(gè)全限定接口名,一個(gè)基于JDK的代理將被創(chuàng)建。 被創(chuàng)建的代理將實(shí)現(xiàn)所有在proxyInterfaces屬性里被說(shuō)明的接口; 如果目標(biāo)類(lèi)實(shí)現(xiàn)了全部在proxyInterfaces屬性里說(shuō)明的接口以及一些額外接口,返回的代理將只實(shí)現(xiàn)說(shuō)明的接口而不會(huì)實(shí)現(xiàn)那些額外接口。

如果ProxyFactoryBeanproxyInterfaces屬性沒(méi)有被設(shè)置, 但是目標(biāo)類(lèi)實(shí)現(xiàn)了一個(gè)(或者更多)接口,那么ProxyFactoryBean將自動(dòng)檢測(cè)到這個(gè)目標(biāo)類(lèi)已經(jīng)實(shí)現(xiàn)了至少一個(gè)接口, 一個(gè)基于JDK的代理將被創(chuàng)建。被實(shí)際代理的接口將是目標(biāo)類(lèi)所實(shí)現(xiàn)的全部接口; 實(shí)際上,這和在proxyInterfaces屬性中列出目標(biāo)類(lèi)實(shí)現(xiàn)的每個(gè)接口的情況是一樣的。 然而,這將顯著地減少工作量以及輸入錯(cuò)誤的可能性。

7.5.4.?對(duì)接口進(jìn)行代理

讓我們看一個(gè)關(guān)于ProxyFactoryBean的簡(jiǎn)單例子。這個(gè)例子涉及:

  • 一個(gè)將被代理的目標(biāo)bean。在下面的例子里這個(gè)bean是“personTarget”。

  • 被用來(lái)提供通知的一個(gè)通知器和一個(gè)攔截器。

  • 一個(gè)AOP代理bean的定義,它說(shuō)明了目標(biāo)對(duì)象(personTarget bean)以及需要代理的接口,還包括需要被應(yīng)用的通知。

<bean id="personTarget" class="com.mycompany.PersonImpl">
                <property name="name"><value>Tony</value></property>
                <property name="age"><value>51</value></property>
                </bean>
                
                <bean id="myAdvisor" class="com.mycompany.MyAdvisor">
                <property name="someProperty"><value>Custom string property value</value></property>
                </bean>
                
                <bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor">
                </bean>
                
                <bean id="person" 
                class="org.springframework.aop.framework.ProxyFactoryBean">
                <property name="proxyInterfaces"><value>com.mycompany.Person</value></property>
                
                <property name="target"><ref local="personTarget"/></property>
                <property name="interceptorNames">
                <list>
                <value>myAdvisor</value>
                <value>debugInterceptor</value>
                </list>
                </property>
            </bean>

注意interceptorNames屬性接受一組字符串:當(dāng)前工廠中攔截器或通知器bean的名字。 攔截器,通知器,前置, 后置和異常通知對(duì)象都可以在這里被使用。這里通知器的順序是很重要的。

注意

你也許很奇怪為什么這個(gè)列表不保存bean的引用。理由是如果ProxyFactoryBean的singleton屬性被設(shè)置為false,它必須返回獨(dú)立的代理實(shí)例。 如果任何通知器本身是一個(gè)原型,則每次都返回一個(gè)獨(dú)立實(shí)例,因此它必須能夠從工廠里獲得原型的一個(gè)實(shí)例;保存一個(gè)引用是不夠的。

上面“person” bean的定義可以被用來(lái)取代一個(gè)Person接口的實(shí)現(xiàn),就像下面這樣:

Person person = (Person) factory.getBean("person");

在同一個(gè)IoC上下文中其它的bean可以對(duì)這個(gè)bean有基于類(lèi)型的依賴(lài),就像對(duì)一個(gè)普通的Java對(duì)象那樣:

<bean id="personUser" class="com.mycompany.PersonUser">
                <property name="person"><ref local="person" /></property>
            </bean>

這個(gè)例子里的PersonUser類(lèi)將暴露一個(gè)類(lèi)型為Person的屬性。就像我們關(guān)心的那樣,AOP代理可以透明地取代一個(gè)“真實(shí)”的person接口實(shí)現(xiàn)。 然而,它的類(lèi)將是一個(gè)動(dòng)態(tài)代理類(lèi)。 它可以被轉(zhuǎn)型成Advised接口(將在下面討論)。

就像下面這樣,你可以使用一個(gè)匿名內(nèi)部bean來(lái)隱藏目標(biāo)和代理之間的區(qū)別。 僅僅ProxyFactoryBean的定義有所不同;通知的定義只是由于完整性的原因而被包括進(jìn)來(lái):

<bean id="myAdvisor" class="com.mycompany.MyAdvisor">
                <property name="someProperty"><value>Custom string property value</value></property>
                </bean>
                
                <bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor"/>
                
                <bean id="person" class="org.springframework.aop.framework.ProxyFactoryBean">
                <property name="proxyInterfaces"><value>com.mycompany.Person</value></property>
                <!-- Use inner bean, not local reference to target -->
                <property name="target">
                <bean class="com.mycompany.PersonImpl">
                <property name="name"><value>Tony</value></property>
                <property name="age"><value>51</value></property>
                </bean>
                </property>
                <property name="interceptorNames">
                <list>
                <value>myAdvisor</value>
                <value>debugInterceptor</value>
                </list>
                </property>
            </bean>

對(duì)于只需要一個(gè)Person類(lèi)型對(duì)象的情況,這是有好處的:如果你希望阻止應(yīng)用程序上下文的用戶獲取一個(gè)指向未通知對(duì)象的引用或者希望避免使用Spring IoC 自動(dòng)織入 時(shí)的混淆。 按理說(shuō)ProxyFactoryBean定義還有一個(gè)優(yōu)點(diǎn)是它是自包含的。然而,有時(shí)能夠從工廠里獲取未通知的目標(biāo)也是一個(gè)優(yōu)點(diǎn):例如,在某些測(cè)試場(chǎng)景里。

7.5.5.?對(duì)類(lèi)進(jìn)行代理

如果你需要代理一個(gè)類(lèi)而不是代理一個(gè)或是更多接口,那么情況將是怎樣?

想象在我們上面的例子里,不存在Person接口:我們需要通知一個(gè)叫做Person的類(lèi),它沒(méi)有實(shí)現(xiàn)任何業(yè)務(wù)接口。 在這種情況下,你可以配置Spring使用CGLIB代理,而不是動(dòng)態(tài)代理。這只需簡(jiǎn)單地把上面ProxyFactoryBean的proxyTargetClass屬性設(shè)為true。 雖然最佳方案是面向接口編程而不是類(lèi),但在與遺留代碼一起工作時(shí),通知沒(méi)有實(shí)現(xiàn)接口的類(lèi)的能力是非常有用的。 (通常情況下,Spring沒(méi)有任何規(guī)定。它只是讓你很容易根據(jù)實(shí)際情況選擇最好的解決方案,避免強(qiáng)迫使用特定方式)。

也許你希望你能夠在任何情況下都強(qiáng)制使用CGLIB,甚至在你使用接口的時(shí)候也這樣做。

CGLIB通過(guò)在運(yùn)行時(shí)生成一個(gè)目標(biāo)類(lèi)的子類(lèi)來(lái)進(jìn)行代理工作。 Spring配置這個(gè)生成的子類(lèi)對(duì)原始目標(biāo)對(duì)象的方法調(diào)用進(jìn)行托管:子類(lèi)實(shí)現(xiàn)了裝飾器(Decorator)模式,把通知織入。

CGLIB的代理活動(dòng)應(yīng)當(dāng)對(duì)用戶是透明的。然而,有一些問(wèn)題需要被考慮:

  • Final方法不可以被通知,因?yàn)樗鼈儾荒鼙桓采w。

  • 你需要在你的類(lèi)路徑里有CGLIB 2的庫(kù);使用動(dòng)態(tài)代理的話只需要JDK。

在CGLIB代理和動(dòng)態(tài)代理之間的速度差別是很小的。在Spring 1.0中,動(dòng)態(tài)代理會(huì)快一點(diǎn)點(diǎn)。但這點(diǎn)可能在將來(lái)被改變。 這種情況下,選擇使用何種代理時(shí)速度不應(yīng)該成為決定性的理由。

7.5.6.?使用“全局”通知器

通過(guò)在一個(gè)攔截器名后添加一個(gè)星號(hào),所有bean名字與星號(hào)之前部分相匹配的通知都將被加入到通知器鏈中。這讓你很容易添加一組標(biāo)準(zhǔn)的“全局”通知器:

                <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
                <property name="target" ref="service"/>
                <property name="interceptorNames">
                <list>
                <value>globa *</value>
                </list>
                </property>
                </bean>
                
                <bean id="global_debug" class="org.springframework.aop.interceptor.DebugInterceptor"/>
                <bean id="global_performance" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>
        
?? ??: ?? ??: