亚洲国产日韩欧美一区二区三区,精品亚洲国产成人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)目歷程
文字

24.3.?定義動(dòng)態(tài)語言支持的bean

這一節(jié)描述了如何針對(duì)Spring所支持的動(dòng)態(tài)語言定義受Spring所管理的bean。

請(qǐng)注意本章不會(huì)解釋這些支持的動(dòng)態(tài)語言的語法和用法。例如,如果你想在你的某個(gè)應(yīng)用中使用Groovy來編寫類,我們假設(shè)你已經(jīng)了解Groovy這門語言。如果你需要了解和動(dòng)態(tài)語言本身有關(guān)的更多細(xì)節(jié),請(qǐng)參考本章末尾第?24.6?節(jié) “更多的資源”一節(jié)。

24.3.1.?公共概念

使用dynamic-language-backed bean要經(jīng)過以下步驟:

  1. 編寫針對(duì)動(dòng)態(tài)語言源碼的測試代碼(這是理所應(yīng)當(dāng)?shù)氖虑椋?/p>

  2. 然后編寫動(dòng)態(tài)語言源碼 :)

  3. 在XML配置文件中使用相應(yīng)的<lang:language/>元素定義dynamic-language-backed bean。當(dāng)然你也可以使用Spring API,以編程的方式來定義---本章并不會(huì)涉及到這種高級(jí)的配置方式,你可以直接閱讀源碼來獲得相應(yīng)的指示)。注意這是一個(gè)迭代的步驟。每一個(gè)動(dòng)態(tài)語言的源文件至少對(duì)應(yīng)一個(gè)bean定義(同一個(gè)動(dòng)態(tài)語言的源文件當(dāng)然可以在多個(gè)bean定義中引用)。

前面兩步(測試并編寫動(dòng)態(tài)語言源文件)超出了本章的范疇。請(qǐng)參考你所選動(dòng)態(tài)語言相關(guān)的語言規(guī)范或者參考手冊(cè),并繼續(xù)開發(fā)你的動(dòng)態(tài)語言的源文件。不過你應(yīng)該首先閱讀本章的剩下部分,因?yàn)镾pring(動(dòng)態(tài)語言支持)對(duì)動(dòng)態(tài)語言源文件的內(nèi)容有一些(小小的)要求。

24.3.1.1.?<lang:language/> 元素

最后一步包括如何定義dynamic-language-backed bean定義,每一個(gè)要配置的bean對(duì)應(yīng)一個(gè)定義(這和普通的Javabean配置沒有什么區(qū)別)。但是,對(duì)于容器中每一個(gè)需要實(shí)例化和配置的類,普通的Javabean配置需要指定全限定名,對(duì)于dynamic language-backed bean則使用<lang:language/>元素取而代之。

每一種支持的語言都有對(duì)應(yīng)的<lang:language/>元素

  • <lang:jruby/>(JRuby)

  • <lang:groovy/>(Groovy)

  • <lang:bsh/>(BeanShell)

對(duì)于配置中可用的確切的屬性和子元素取決于具體定義bean的語言(后面和特定語言有關(guān)的章節(jié)會(huì)揭示全部內(nèi)幕)。

24.3.1.2.?Refreshable bean

Spring對(duì)動(dòng)態(tài)語言支持中最引人注目的價(jià)值在于增加了對(duì) 'refreshable bean' 特征的支持。

refreshable bean是一種只有少量配置的dynamic-language-backed bean。dynamic-language-backed bean 可以監(jiān)控底層源文件的變化,一旦源文件發(fā)生改變就可以自動(dòng)重新加載(例如開發(fā)者編輯文件并保存修改)。

這樣就允許開發(fā)者在應(yīng)用程序中部署任意數(shù)量的動(dòng)態(tài)語言源文件,并通過配置Spring容器來創(chuàng)建動(dòng)態(tài)語言源文件所支持的bean(使用本章所描述的機(jī)制)。以后如果需求發(fā)生改變,或者一些外部因素起了作用,這樣就可以簡單的編輯動(dòng)態(tài)語言源文件,而這些文件中的變化會(huì)反射為bean的變化。而這些工作不需要關(guān)閉正在運(yùn)行的應(yīng)用(或者重新部署web應(yīng)用)。dynamic-language-backed bean能夠自我修正,從已改變的動(dòng)態(tài)語言源文件中提取新的狀態(tài)和邏輯。

注意

注意,該特征默認(rèn)值為off(關(guān)閉)。

下面讓我們看一個(gè)例子,體驗(yàn)一下使用refreshable bean是多么容易的事情。首先要啟用refreshable bean特征,只需要在bean定義的 <lang:language/>元素中指定一個(gè)附加屬性。假設(shè)我們繼續(xù)使用前文中的 例子,那么只需要在Spring的XML配置文件中進(jìn)行如下修改以啟用refreshable bean:

<beans>

    <!-- this bean is now 'refreshable' due to the presence of the 'refresh-check-delay' attribute -->
    <lang:groovy id="messenger"
          refresh-check-delay="5000" <!-- switches refreshing on with 5 seconds between checks -->
          script-source="classpath:Messenger.groovy">
        <lang:property name="message" value="I Can Do The Frug" />
    </lang:groovy>

    <bean id="bookingService" class="x.y.DefaultBookingService">
        <property name="messenger" ref="messenger" />
    </bean>

</beans>

這就是所有你需要做的事情。 'messenger' bean定義中的'refresh-check-delay'屬性指定了刷新bean的時(shí)間間隔,在這個(gè)時(shí)間段內(nèi)的底層動(dòng)態(tài)語言源文件的任何變化都會(huì)刷新到對(duì)應(yīng)的bean上。通過給該屬性賦一個(gè)負(fù)值即可關(guān)閉該刷新行為。注意在默認(rèn)情況下,該刷新行為是關(guān)閉的。如果你不需要該刷新行為,最簡單的辦法就是不要定義該屬性。

運(yùn)行以下應(yīng)用程序可以體驗(yàn)refreshable特征:請(qǐng)執(zhí)行接下來這段代碼中的'jumping-through-hoops-to-pause-the-execution'小把戲。System.in.read()的作用是暫停程序的執(zhí)行,這個(gè)時(shí)候去修改底層的動(dòng)態(tài)語言源文件,然后程序恢復(fù)執(zhí)行的時(shí)候觸發(fā)dynamic-language-backed bean的刷新。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scripting.Messenger;

public final class Boot {

    public static void main(final String[] args) throws Exception {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        Messenger messenger = (Messenger) ctx.getBean("messenger");
        System.out.println(messenger.getMessage());
        // pause execution while I go off and make changes to the source file...
        System.in.read();
        System.out.println(messenger.getMessage());
    }
}

假設(shè)對(duì)于這個(gè)例子,所有調(diào)用Messenger實(shí)現(xiàn)中getMessage()方法的地方都被修改:比如將message用引號(hào)括起來。下面是我在程序執(zhí)行暫停的時(shí)候?qū)?code class="filename">Messenger.groovy源文件所做的修改:

package org.springframework.scripting

class GroovyMessenger implements Messenger {

    private String message = "Bingo"

    public String getMessage() {
        // change the implementation to surround the message in quotes
        return "'" + this.message + "'"
    }

    public void setMessage(String message) {
        this.message = message
    }
}

在這段程序執(zhí)行的時(shí)候,在輸入暫停之前的輸出是I Can Do The Frug。在修改并保存了源文件之后,程序恢復(fù)執(zhí)行,再次調(diào)用dynamic-language-backed MessengergetMessage()方法的結(jié)果為'I Can Do The Frug' (注意新增的引號(hào))。

有一點(diǎn)很重要,如果上述對(duì)腳本的修改發(fā)生在'refresh-check-delay'值的時(shí)間范圍內(nèi)并不會(huì)觸發(fā)刷新動(dòng)作。同樣重要的是,修改腳本并不會(huì)馬上起作用,而是要到該動(dòng)態(tài)語言實(shí)現(xiàn)的bean的相應(yīng)的方法被調(diào)用時(shí)才有效。只有動(dòng)態(tài)語言實(shí)現(xiàn)的bean的方法被調(diào)用的時(shí)候才會(huì)檢查底層源文件是否修改了。刷新腳本產(chǎn)生的任何異常(例如發(fā)生編譯錯(cuò)誤,或者腳本文件被刪除了)都會(huì)在調(diào)用的代碼中拋出一個(gè)致命異常。

前面描述的refreshable bean的行為并會(huì)作用于使用<lang:inline-script/>元素定義的動(dòng)態(tài)語言源文件(請(qǐng)參考第?24.3.1.3?節(jié) “內(nèi)置動(dòng)態(tài)語言源文件”這一節(jié))。而且它作用于那些可以檢測到底層源文件發(fā)生改變的bean。例如,檢查文件系統(tǒng)中的動(dòng)態(tài)語言源文件的最后修改日期。

24.3.1.3.?內(nèi)置動(dòng)態(tài)語言源文件

Spring動(dòng)態(tài)語言支持還提供了直接在bean定義中直接嵌入動(dòng)態(tài)語言源碼的功能。通過<lang:inline-script/>元素,可以在Spring的配置文件中直接定義動(dòng)態(tài)語言源文件。下面的例子或許可以將嵌入腳本特征表達(dá)的更清楚:

<lang:groovy id="messenger">
    <lang:inline-script>
package org.springframework.scripting.groovy;

import org.springframework.scripting.Messenger

class GroovyMessenger implements Messenger {

    String message
}
    </lang:inline-script>
    <lang:property name="message" value="I Can Do The Frug" />
</lang:groovy>

直接在Spring的配置文件中定義動(dòng)態(tài)語言源碼的是否是最佳實(shí)踐這個(gè)問題先放在一邊,<lang:inline-script/>元素在某些場景下還是相當(dāng)有用的。例如,給Spring MVC的Controller快速添加一個(gè)Spring Validator實(shí)現(xiàn)。如果采用內(nèi)置源碼的方式只需要片刻時(shí)間就可以搞定(請(qǐng)參見第?24.4.2?節(jié) “Validator的腳本化”這一節(jié)的示例)。

下面這個(gè)例子是一個(gè)基于JRuby的bean,這個(gè)例子直接在Spring的XML配置文件中定義了源碼,并使用了inline: 符號(hào)。(注意其中使用 &lt;符號(hào)來表示'<'字符。這個(gè)例子中如果在內(nèi)置源碼周圍定義一個(gè)<![CDATA[]]>就更好了。)

<lang:jruby id="messenger" script-interfaces="org.springframework.scripting.Messenger">
    <lang:inline-script>
require 'java'

include_class 'org.springframework.scripting.Messenger'

class RubyMessenger &lt; Messenger

 def setMessage(message)
  @@message = message
 end

 def getMessage
  @@message
 end
 
end
    </lang:inline-script>
    <lang:property name="message" value="Hello World!" />
</lang:jruby>

24.3.1.4.?理解dynamic-language-backed bean上下文中的構(gòu)造器注入

關(guān)于Spring動(dòng)態(tài)語言支持有一個(gè)要點(diǎn)必須引起注意:目前對(duì)dynamic-language-backed bean還不可能提供構(gòu)造器參數(shù)的支持(也就是說對(duì)于dynamic-language-backed bean的構(gòu)造器注入無效)。 只是為了將構(gòu)造器和屬性的特殊處理100%說清楚,下面混合了代碼和配置的例子是無法運(yùn)作的。

// from the file 'Messenger.groovy'
package org.springframework.scripting.groovy;

import org.springframework.scripting.Messenger

class GroovyMessenger implements Messenger {

    GroovyMessenger() {}

    // this constructor is not available for Constructor Injection
    GroovyMessenger(String message) {
        this.message = message;
    }

    String message

    String anotherMessage
}
<lang:groovy id="badMessenger"
    script-source="classpath:Messenger.groovy">

    <!-- this next constructor argument will *not* be injected into the GroovyMessenger -->
    <!--     in fact, this isn't even allowed according to the schema -->
    <constructor-arg value="This will *not* work" />
    
    <!-- only property values are injected into the dynamic-language-backed object -->
    <lang:property name="anotherMessage" value="Passed straight through to the dynamic-language-backed object" />

</lang>

實(shí)際上這種局限性并沒有表現(xiàn)的那么明顯,因?yàn)閟etter注入的方式是開發(fā)人員更青睞的方式(至于哪種注入方式更好,這個(gè)話題我們還是留到以后再討論吧)。

24.3.2.?JRuby beans

來自JRuby官方網(wǎng)頁...

JRuby是Ruby語言的純Java實(shí)現(xiàn)。

Spring一直以來的崇尚的哲學(xué)是提供選擇性,因此Spring動(dòng)態(tài)語言支持特征也支持使用JRuby語言定義的bean。JRuby語言當(dāng)然基于Ruby語言,支持內(nèi)置正則表達(dá)式,塊(閉包),以及其他很多特征,這些特征對(duì)于某些域問題提供了解決方案,可以讓開發(fā)變的更容易。

Spring對(duì)JRuby動(dòng)態(tài)語言支持的有趣的地方在于:對(duì)于<lang:ruby>元素'script-interfaces'屬性指定的接口,Spring為它們創(chuàng)建了JDK動(dòng)態(tài)代理實(shí)現(xiàn)(這也是你使用JRuby實(shí)現(xiàn)的bean,必須為該屬性指定至少一個(gè)接口并編程實(shí)現(xiàn)的原因)。

首先我們看一個(gè)使用基于JRuby的bean的可工作的完整示例。下面是使用JRuby實(shí)現(xiàn)的Messenger接口(本章之前定義過了,為了方便你閱讀,下面重復(fù)定義該接口)。

package org.springframework.scripting;

public interface Messenger {

    String getMessage();
}
require 'java'

class RubyMessenger
    include org.springframework.scripting.Messenger

    def setMessage(message)
        @@message = message
    end

    def getMessage
        @@message
    end
end

# this last line is not essential (but see below)
RubyMessenger.new

下面是Spring的XML配置,其內(nèi)容定義了RubyMessenger(JRuby bean)的實(shí)例。

<lang:jruby id="messageService"
            script-interfaces="org.springframework.scripting.Messenger"
            script-source="classpath:RubyMessenger.rb">
    
    <lang:property name="message" value="Hello World!" />

</lang:jruby>

注意JRuby源碼的最后一行('RubyMessenger.new')。在Spring動(dòng)態(tài)語言支持的上下文之下使用JRuby的時(shí)候,我們鼓勵(lì)你實(shí)例化并返回一個(gè)JRuby類的實(shí)例。如果你打算將其作為你的JRuby源碼的執(zhí)行結(jié)果,并將其作為dynamic-language-backed bean,只需要簡單的實(shí)例化你的JRuby類就可以達(dá)到這樣的效果,如下面源文件的最后一行:

require 'java'

include_class 'org.springframework.scripting.Messenger'

# class definition same as above...

# instantiate and return a new instance of the RubyMessenger class
RubyMessenger.new

如果你忘記了這點(diǎn),并不代表以前所有的努力白費(fèi)了,不過Spring會(huì)以反射的方式掃描你的JRuby的類型表示,并找出一個(gè)類,然后進(jìn)行實(shí)例化。這個(gè)過程的速度是相當(dāng)快的,可能你永遠(yuǎn)都不會(huì)感覺到延遲,但是只需要象前面的例子那樣在你的JRuby的腳本最后添加一行就可以避免這樣的事情,何樂而不為呢?如果不提供這一行,或者如果Spring在你的JRuby腳本中無法找到可以實(shí)例化的類,JRuby的解釋器執(zhí)行源碼結(jié)束后會(huì)立刻拋出ScriptCompilationException異常。下面的代碼中可以立刻發(fā)現(xiàn)一些關(guān)鍵的文本信息,這些文本信息標(biāo)識(shí)了導(dǎo)致異常的根本原因(如果Spring容器在創(chuàng)建的 dynamic-language-backed bean的時(shí)候拋出以下異常, 在相應(yīng)的異常堆棧中會(huì)包括以下文本信息,希望這些信息能夠幫助你更容易定位并矯正問題):

org.springframework.scripting.ScriptCompilationException: Compilation of JRuby script returned ''

為了避免這種錯(cuò)誤,將你打算用作JRuby-dynamic-language-backed bean(如前文所示)的類進(jìn)行實(shí)例化,并將其返回。請(qǐng)注意在JRuby腳本中實(shí)際上可以定義任意數(shù)目的類和對(duì)象,重要的是整個(gè)源文件應(yīng)該返回一個(gè)對(duì)象(用于Spring的配置)。

第?24.4?節(jié) “場景” 這一節(jié)提供了一些場景,在這些場景下也許你會(huì)打算采用基于JRuby的bean.

24.3.3.?Groovy beans

來自Groovy官方網(wǎng)頁...

Groovy是一門針對(duì)Java 2平臺(tái)的敏捷的動(dòng)態(tài)語言,Python、Ruby、Smalltalk這類語言中不少受人喜愛的特征都被囊括其中,并以Java風(fēng)格的語法展現(xiàn)給Java開發(fā)者。

如果你是以從上到下的方式一直讀到這一章,你應(yīng)該已經(jīng)看到了一個(gè)Groovy-dynamic-language-backed bean的示例。接下來我們來看另外一個(gè)例子(還是選自Spring的測試套件)。

注意

Groovy需要1.4以上的JDK。

package org.springframework.scripting;

public interface Calculator {

    int add(int x, int y);
}

下面是使用Groovy實(shí)現(xiàn)的Calculator接口。

// from the file 'calculator.groovy'
package org.springframework.scripting.groovy

class GroovyCalculator implements Calculator {

    int add(int x, int y) {
        x + y
    }
}
<-- from the file 'beans.xml' -->
<beans>
    <lang:groovy id="calculator" script-source="classpath:calculator.groovy"/>
</beans>

最后是一個(gè)小應(yīng)用程序,用于測試上面的配置。

package org.springframework.scripting;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void Main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        Calculator calc = (Calculator) ctx.getBean("calculator");
        System.out.println(calc.add(2, 8));
    }
}

運(yùn)行上面的程序最終輸出結(jié)果(毫無疑問)為10。(令人激動(dòng)的例子,是吧?記住我們的目的是為了闡述概念。更復(fù)雜的例子請(qǐng)參考動(dòng)態(tài)語言的示例項(xiàng)目,或者參考本章最后列出的第?24.4?節(jié) “場景”)。

有一點(diǎn)很重要,那就是你不要 在一個(gè)Groovy源文件中定義兩個(gè)以上的class。雖然Groovy允許這樣做,但是是一個(gè)很不好的實(shí)踐,為了保持一致性,你應(yīng)該尊重標(biāo)準(zhǔn)的Java規(guī)范(至少作者是這樣認(rèn)為的):一個(gè)源文件只定義一個(gè)(public)類。

24.3.3.1.?通過回調(diào)定制Groovy對(duì)象

GroovyObjectCustomizer接口實(shí)際上是一個(gè)回調(diào), 它允許你將附屬的創(chuàng)建邏輯添加到創(chuàng)建Groovy bean的過程中。 例如,該接口的實(shí)現(xiàn)能夠調(diào)用任何需要的初始化方法, 或者設(shè)置一些缺省的屬性值,或者指定自定義的MetaClass。

public interface GroovyObjectCustomizer {

   void customize(GroovyObject goo);
}

Spring框架將會(huì)初始化Groovy bean示例,然后將已經(jīng)創(chuàng)建的GroovyObject 對(duì)象傳到到指定的GroovyObjectCustomizer接口。 通過GroovyObject你可以做任意想做的事情。大部分 人也許都想通過該回調(diào)傳入一個(gè)定制的MetaClass,下面你將看到一個(gè)這樣的例子。

public final class SimpleMethodTracingCustomizer implements GroovyObjectCustomizer {

   public void customize(GroovyObject goo) {
      DelegatingMetaClass metaClass = new DelegatingMetaClass(goo.getMetaClass()) {

         public Object invokeMethod(Object object, String methodName, Object[] arguments) {
            System.out.println("Invoking '" + methodName + "'.");
            return super.invokeMethod(object, methodName, arguments);
         }
      };
      metaClass.initialize();
      goo.setMetaClass(metaClass);
   }
}

完整討論Groovy的元編程已經(jīng)超出了本參考手冊(cè)的范疇。建議直接查閱Groovy參考手冊(cè)的有關(guān)章節(jié), 或者通過在線查詢:目前有大量的關(guān)于這方面的文章。 如果你使用Spring 2.0的命名空間支持功能,使用GroovyObjectCustomizer將會(huì)變得非常簡單。

<!-- define the GroovyObjectCustomizer just like any other bean -->
<bean id="tracingCustomizer" class="example.SimpleMethodTracingCustomizer" />

   <!-- ... and plug it into the desired Groovy bean via the 'customizer-ref' attribute -->
   <lang:groovy id="calculator"
      script-source="classpath:org/springframework/scripting/groovy/Calculator.groovy"
      customizer-ref="tracingCustomizer" />

如果你沒有使用Spring 2.0的命名空間支持,你仍然可以使用GroovyObjectCustomizer的功能。

<bean id="calculator" class="org.springframework.scripting.groovy.GroovyScriptFactory">
      <constructor-arg value="classpath:org/springframework/scripting/groovy/Calculator.groovy"/>
      <!-- define the GroovyObjectCustomizer (as an inner bean) -->
      <constructor-arg>
         <bean id="tracingCustomizer" class="example.SimpleMethodTracingCustomizer" />
      </constructor-arg>
</bean>

<bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/>

24.3.4.?BeanShell beans

來自BeanShell官方網(wǎng)頁...

BeanShell是一個(gè)用Java實(shí)現(xiàn)的小型免費(fèi)嵌入式Java源碼解釋器,支持動(dòng)態(tài)語言特征。BeanShell動(dòng)態(tài)執(zhí)行標(biāo)準(zhǔn)的Java語法,并進(jìn)行了擴(kuò)展,帶來一些常見的腳本的便利,如在Perl和JavaScript中的寬松類型、命令、方法閉包等等。

和Groovy相比,基于BeanShell的bean定義需要的配置要多一些。Spring對(duì)BeanShell動(dòng)態(tài)語言支持的有趣的地方在于:對(duì)于<lang:bsh>元素的'script-interfaces'屬性指定的接口,Spring為它們創(chuàng)建了JDK動(dòng)態(tài)代理實(shí)現(xiàn)(這也是你使用BeanShell實(shí)現(xiàn)的bean,必須為該屬性指定至少一個(gè)接口并編程實(shí)現(xiàn)的原因)。這意味著所有調(diào)用 BeanShell-backed對(duì)象的方法,都要通過JDK動(dòng)態(tài)代理調(diào)用機(jī)制。

首先我們看一個(gè)使用基于BeanShell的bean的可工作的完整示例。它實(shí)現(xiàn)了本章之前定義的Messenger接口(為了方便閱讀,下面重復(fù)定義該接口)。

package org.springframework.scripting;

public interface Messenger {

    String getMessage();
}

Here is the BeanShell 'implementation' (the term is used loosely here) of the Messenger interface.

下面是BeanShell的實(shí)現(xiàn)的Messenger 接口。

String message;

String getMessage() {
    return message;
}

void setMessage(String aMessage) {
    message = aMessage;
}

下面的Spring XML定義了上述“類”的一個(gè)“實(shí)例”(這里對(duì)術(shù)語的使用非常的隨意)。

<lang:bsh id="messageService" script-source="classpath:BshMessenger.bsh"
    script-interfaces="org.springframework.scripting.Messenger">

    <lang:property name="message" value="Hello World!" />
</lang:bsh>

第?24.4?節(jié) “場景”一節(jié)中提供了一些場景,在這樣的場景下你也許打算采用基于BeanShell的bean。

上一篇: 下一篇: