﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-雪杉</title><link>http://www.blogjava.net/JDeodar/</link><description>Java Tips</description><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 21:09:46 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 21:09:46 GMT</pubDate><ttl>60</ttl><item><title>Appfuse1.9安装部署</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/20/28805.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Fri, 20 Jan 2006 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/20/28805.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/28805.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/20/28805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/28805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/28805.html</trackback:ping><description><![CDATA[1：下载appfuse（https://appfuse.dev.java.net/servlets/ProjectDocumentList?folderID=0&amp;expandFolder=0&amp;folderID=2351），本次安装appfuse-springmvc<br><br>2：因为此前已经部署了appfuse，更改目录；源代码放到appfuse_springmvc而不是默认的appfuse目录。<br>刚进去，就有一个错误，就是antlr.jar找不到，确实没有。<br>在classpath中去掉，或者在.classpath中去掉此行<br>&lt;classpathentry kind="lib" path="lib/struts-1.2.8/antlr.jar"/&gt;<br>这个可是老问题了。原来的版本就有了，怎么会一直没有解决呢？<br><br>现在把项目中名称和数据库名称相关的名称appfuse都修正为appfuse_springmvc（以免和前面部署的appfuse冲突）：<br>a: .project <br><u><i>&lt;name&gt;appfuse&lt;/name&gt;</i></u><br><br>b: web.xml <br><u><i>&lt;display-name&gt;appfuse&lt;/display-name&gt;</i></u><br><br>c: build.xml <br><u><i>&lt;project name="appfuse" basedir="." default="package-web"&gt;</i></u><br><br>d: build.properties <br><u><i>webapp.name=appfuse</i></u><br><br>e: properties.xml &nbsp;<br><u><i>&lt;property name="database.name" value="appfuse"/&gt;<br>&lt;property name="database.url" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="jdbc:${database.type}://${database.host}/${database.name}?<br><br>useUnicode=true&amp;amp;amp;characterEncoding=utf-8"/&gt;</i></u><br><br>f: database.properties <br><i><u>hibernate.connection.url=jdbc\:mysql\://localhost/appfuse?useUnicode\=true&amp;characterEncoding\=utf-8</u></i><br><br>g: metadata\conf\tomcat-context.xml 我使用的是tomcat5.0.19。下面的部分<br><i><u>&lt;Context path="/appfuse" docBase="appfuse" debug="99" reloadable="true"&gt;<br>&nbsp; &lt;Logger className="org.apache.catalina.logger.FileLogger" prefix="appfuse_log." suffix=".txt" <br><br>timestamp="true" /&gt; <br>- &lt;!-- Resource name="jdbc/appfuse" auth="Container" type="javax.sql.DataSource"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;ResourceParams name="jdbc/appfuse"&gt;</u></i><br><br>h: web/common/taglibs.jsp<br><u><i>&lt;%@ taglib uri="/WEB-INF/appfuse.tld"</i></u><br><br>3：一切就绪，按照readme.txt上说的来做（测试就不必要了）。<br>A：首先运行 ant setup-db （我在eclipse中运ant执行此target，提示必须把junit.jar拷贝到D:\eclipse\plugins\org.apache.ant_1.6.5\lib下，拷贝进去，执行，提示同样的错误；原来还要把junit.jar加入classpath,如下：在Preferences-&gt;Ant-&gt;runtime中的classpath栏中的Ant Home Entries(default) Add External JARs..把刚拷贝进去的junit.jar加入即可；再次运行OK。<br><br>B：运行 ant setup-tomcat deploy；首先必须确认几个环境变量的设置如CATALINA_HOME执行你的tomcat目录。<br><br>C：终于运行起来了，此时此刻却冒出来了，另外一个大问题，就是中文的问题，存放在mysql5中的数据怎么显示都不对，我和前面装的那个appfuse比较起来，数据库链接一样都使用[?<i>useUnicode\=true&amp;characterEncoding\=utf-8</i>]，前面的appfuse没有中文问题。<br><br><font color="#008000"><b>奇怪，至今没有解决。望大侠们帮助呀？--所有的地方都是使用utf8字符集,包括mysql。</b></font><br><img src ="http://www.blogjava.net/JDeodar/aggbug/28805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-20 16:39 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/20/28805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《J2EE Development without EJB》 笔记七</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/18/28538.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Wed, 18 Jan 2006 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/18/28538.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/28538.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/18/28538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/28538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/28538.html</trackback:ping><description><![CDATA[<b>Web Tier Design -- Web层设计</b><br><br><u><i><b>1、设计目标</b></i></u><br>A：一个清晰的Web层。<br>用MVC达到：控制器（Controller）对象，接受用户输入的信息，并调用业务逻辑去创建和更新模型对象。模型（Model）对象，提供要显示的数据，提供控制器和视图之间的契约。视图（View）对象，显示由控制器提供的模型对象。<br>B：Web层应该尽可能地薄。<br><br><u><b><i>2、请求驱动的Web MVC框架</i></b></u><br>一个HTTP请求过来，被一个通用的分发器servlet（dispatcher servlet）分析，再被分发到一个对应的应用处理器。处理器依次处理UI特有的控制逻辑，调用业务对象和管理会话状态（如果需要），准备一个模型，再转发到一个视图。每个UI动作对应一个处理器，后者通常被称为动作（action）或控制器（controller），具体的名称虽框架而定。<br>控制器可能被建模为可重用、线程安全的处理器，类似Servlet（例如Struts和Spring）；也可能实现为“只使用一次”的command实例（例如WebWork）。<br>请求驱动的Web MVC框架的设计模型通常包括六种类型的对象。在一些框架中有些对象同时扮演了几个角色：<br>A：控制器（controller）：它是由框架调用的组件，负责处理HTTP请求，并确定一个要呈现的视图。<br>B：拦截器（interceptor）：它是由框架调用的组件......<br>C：command或form：它是根据请求参数组装的JavaBean，<br>可用作中间层业务对象的方法参数。如果是只使用一次（只在一次请求范围内有效）的对象，则通常称为command对象；如果表示可重复提交的表单，则称为form对象。<br>D：验证器（validator）：用于验证command/form对象，如果发现错误，则生成验证错误对象，交给视图显示。验证可以针对整个对象，也可以针对特定的字段。<br>E：验证错误收集器（validation errors holder）：收集验证错误，并将其暴露给视图去显示。验证过程可能是编程实现的，也可能是由框架特有的JSP标签进行的。<br>F：模型（Model）：由控制器曝露给视图的一个或多个JavaBean，表示控制器和视图之间的数据约定。<br>G：视图引用（view reference）：可能是一个符号名称、一个资源URL、或一个真实的视图对象。控制器返回视图引用，由框架进行渲染。<br><b><i><u><br>3、事件驱动（event-driven）的Web MVC框架</u></i></b><br>Tapestry和JSF<img src ="http://www.blogjava.net/JDeodar/aggbug/28538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-18 17:42 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/18/28538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《J2EE Development without EJB》 笔记六</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/17/28311.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Tue, 17 Jan 2006 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/17/28311.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/28311.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/17/28311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/28311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/28311.html</trackback:ping><description><![CDATA[<b>Remoting -- 远程调用</b><br><br>分布式计算第一法则：不要分布你的对象--Martin Fowler《企业应用架构模式》<br><br>经典的Java远程方案的根源，RMI（Remote Method Invocation）是JDK1.1中引入的。基于Java的序列化机制通信协议时可接插的。<br>所有的RMI服务必须要实现某个继承自java.rmi.Remote的接口。<br>保持远程通信无状态——这也是任何远程调用应该谨记的法则。如果真需要有状态的会话，可以考虑用EJB的有状态的Session Beans，或是具备HttpSession功能的web service。<br><i><u><br><b>一、经典的J2SE远程方案：RMI</b></u></i><br>A、访问和曝露RMI服务<br>访问RMI服务，只需通过java.rmi.Naming查找一个RMI的URL地址即可。每次查找都将返回一个服务器端RMI服务实例的一个代理：和EJB不同，没有组件池的概念。<br><br>Spring环境中的设置<br>在Spring的bean工厂或应用上下文中，可以用RmiProxyFactoryBean类来定义RMI服务的客户端代理。<br>也可以借助RmiServiceExporter类曝露为RMI服务，不过被曝露的bean组件必须遵循RMI服务的实现要求。<br>为了避免让客户端直接针对RMI接口编程，RMI服务的实现类在实现RMI服务接口之外，也可以实现与RMI无关的业务接口（business interface）[同样方法的业务接口]。这样，客户端只需要依赖普通的业务接口，不需要依赖RMI接口。<br>坏处：必须时刻保持“业务接口”与“远程接口”之间的同步。<br><br>B、用RMI调用器实现透明远程调用<br>借助Java反射机制，通过RMI调用器（RMI invoker）发送方法调用。<br><br><u><i><b>二、经典的J2EE远程机制：EJB</b></i></u><br><br><i><u><b>三、基于WSDL的web Services：JAX-RPC</b></u></i><br>J2EE1.4版本最大的进步就在于对web services的支持，其下的基础规则是WSDL（Web Service Description Lanuage，web service描述语言）和SOAP（Simple Object Access Protocol，简单对象访问协议）。<br><br>WSDL是一种XML格式，用于将网络服务描述为一组对消息的端点操作，消息中包含面向文档或者面向过程的信息。操作和消息都将被抽象地描述，并随后被绑定到具体的网络协议和消息格式，用于定义一个端点。彼此连接的具体端点就可以组合为抽象端点（服务）。<br>--WSDL就是对远程服务的平台无关的描述。<br><br>A、访问web service<br>每个基于WSDL的web service都由一个服务（service）构成，其中定义了一个或者多个端口（port）。每个端口对应服务器上的一个服务端点（service endpoint），一个由WSDL定义的web service中可以汇聚多个端点。这与经典的远程服务（EJB）不同，后者不支持这样的分隔。<br>为了访问一个服务，JAX-RPC需要下列参数：<br>1、WSDL文档的URL<br>2、WSDL服务的命名空间URL<br>3、WSDL服务的名称<br>JAX-RPC提供了三种访问服务端点的途径：<br>1、静态存根：--不推荐<br>2、动态代理：--一种通过Java接口访问远程服务的有效途径，并且是可配置的。<br>3、动态调用接口（DII）：--提供了最大限度的解耦。<br><br>B、Spring环境中的配置<br>曝露一个JAX-RPC服务<br><br>C、Servlet和EJB端点<br>JAX-RPC规范描述了两种服务端点的实现：servlet端点（Servlet endpoint）模型和EJB端点（EJB endpoint）模型。<br><b><br><i><u>四、轻量级远程方案：Hessian和Burlap</u></i></b><br>RMI环境的配置相当麻烦，并且使用的网络端口常常被防火墙禁止。基于WSDL和SOAP的web service又很难以一种可移植的方式导出，并且由于它们的协议臃肿冗长，会浪费大量的带宽。基于HTTP的轻量级远程调用协议解决了上述两个问题：它们可以在任何标准的servlet容器之上运行，并且可以穿越任何防火墙。<br>1、访问和曝露Hessian和Burlap服务<br>2、在Spring环境中的配置<br>--JPetStore展示Spring环境中使用Hessian和Burlap、RMI和JAX-RPC（借助Apache Axis）来曝露远程服务，同时提供远程服务客户端的示例。<br><br><b>Replacing Other EJB Services -- 替换其他的EJB服务</b><br><br>1、持久化<br>2、远程调用机制<br>3、CMT<br>4、线程管理<br>5、SLSB实例池<br>6、声明性、基于角色的安全性<br><br><img src ="http://www.blogjava.net/JDeodar/aggbug/28311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-17 16:05 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/17/28311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《J2EE Development without EJB》 笔记五</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/13/27976.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Fri, 13 Jan 2006 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/13/27976.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/27976.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/13/27976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/27976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/27976.html</trackback:ping><description><![CDATA[<b>Tansation Management -- 事务管理</b><br><br>应用程序可以用于以下两种手段来管理容器事务，从而控制应用服务器的事务管理服务<br>1、编程式事务管理：使用JTA UserTransaction对象，通过JNDI获取<br>2、声明式事务管理：通过使用组建模型（即EJB CMT），这是一种建立在JTA基础设施之上的高层的服务<br>这两种方法通常都被命名为“受控的事务”（EJB CMT）。<br><br>容器管理事务（Container-Managed Transaction）<br>优点：把事务管理从Java代码中挪到了EJB部署描述符中。因此事务编程了一个无需硬编码的横切面。<br>缺点：<br>1、只有EJB才能够使用声明式事务管理<br>2、声明式事务实际上也符合80-20原则<br>3、EJB CMT必须使用全局事务管理，如果仅需要单事务的资源，大材小用。<br><br>Spring的声明式事务管理建立在Spring的AOP框架之上，所以Spring的事务管理需要带有AOP功能的Spring Bean工厂。<br>事物的传播类型：（6种）<br>1、“required”运行在当前的事务范围内，如果当前没有启动事务，那么创建一个新的事物<br>2、“supports”运行在当前的事务范围内，如果当前没有启动事务，那么就不在事务范围内执行<br>3、“mandatory”运行在当前的事务范围内，如果当前没有启动事务，那么抛出异常<br>4、“requires new”创建一个新的事务，如果当前启动了事务，那么挂起当前事务<br>5、“not supported”不在事务范围内执行，如果当前启动了事务，那么挂起当前事务<br>6、“never”不在事务范围内执行，如果当前启动了事物，那么抛出异常<br>默认的事务类型是“required”，适用于绝大多数的情况。<br><br>编程式事务管理通常有以下两种使用方式：一是通常的使用方式，在一个catch代码块中对任何异常进行回滚处理；二是通过一个“控制反转（IoC）”模版类和一个回调实现。<br>事物管理最适合使用AOP。<br><br>Spring的事务处理最重要的好处是，在不需要任何部署步骤和特定的需要的情况下，可以让POJO具备事务处理能力。<br><br>YAGNI（You Arent Gonna Need It，不要为不必要的需求埋单）<br><b><br>Persistence -- 持久化</b><br>Patterns of Enterprise Application Architecture（2002 Martin Fowler），常简称POEAA -- 一定要读<br><br>处理批量存取和批量更新时，O/R映射会有问题，不知道什么时候才能解决优化呢？<br><br>下面的征兆，可以考虑使用O/R映射：<br>1、针对领域对象的“加载/编辑/存储”流程，例如先加载一条产品记录，对其进行修改，然后更新会数据库。<br>2、对象以批量查询的方式取出，但更新和删除则是单独进行。<br>3、大量对象需要积极地缓存（通常出现在“读操作远多于写操作”的情况下，如web应用。）<br>4、在领域对象与数据库表/字段之间有一个相当自然的对应关系。<br>5、不需要对SQL进行特别的优化。<br><br>细粒度的领域模型不应该用重量级的EJB组件来建模，而应该用简单的Java对象——POJO（Plain Old Java Object）——来建模。<br>所有的持久化技术必然会涉及对资源的管理：<br>1、连接工厂<br>2、连接<br><br>DAO模式的用途是将“与持久化相关的代码”从业务逻辑中分离出来，换句话说，把业务流程和规则放在一边，与持久化相关的问题放在另一边。DAO模式需要一个DAO接口，以便将特定的数据访问实现细节隐藏起来。<br><br>使用Spring框架进行数据访问<br>1、Spring的bean工厂和应用上下文容器使得应用程序中的各种对象能够轻松地装配起来。<br>2、Spring有一个清晰的事务模型<br>3、Spring提供了一个通用的数据库访问异常体系。<br>4、对于各种持久化方式，Spring用形式统一的模版机制解决了关闭连接、处理异常等问题。<br><br>JdbcTemplate实例（以及别的Spring模版）都是线程安全的，允许多线程复用。因此只需要在DAO初始化将一个JdbcTemplate实例提供给它，所有的DAO方法都可以使用这同一个模版实例，不必担心任何同步问题。<br><br>Spring框架提供了另一个层次较高的JDBC抽象：可询操作、更新操作或是存储过程。<br><img src ="http://www.blogjava.net/JDeodar/aggbug/27976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-13 22:24 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/13/27976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork 2.2: Released -&gt;StrutsTi !</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/13/27865.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Fri, 13 Jan 2006 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/13/27865.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/27865.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/13/27865.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/27865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/27865.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 前一段时间研究了WebWork2.1.7 ，感觉非常不错，现在2.2出现了，增加了很多特性，有待研究，也许几个月之后，就又要转向Struts Ti了，
感觉现在学习是被“<b>拖</b>”着走，什么时候才能“<b>跟</b>”着走呢？什么时候才能“<b>一起</b>”走？不管怎么说，必须前进，才能跟上发展的潮流，原地不动，总会有一天会淡出在IT技术的圈圈。前一段时间有个韩剧
《加油，金顺！》，虽然没看过，来个引用吧，加油，需要努力的人们。<img src ="http://www.blogjava.net/JDeodar/aggbug/27865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-13 10:46 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/13/27865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《J2EE Development without EJB》 笔记四</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/11/27644.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Wed, 11 Jan 2006 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/11/27644.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/27644.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/11/27644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/27644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/27644.html</trackback:ping><description><![CDATA[<b>Declarative Middleware Using AOP Concepts -- 基于AOP概念的声明性中间件</b><br><br>&nbsp;&nbsp;&nbsp; AOP的全称是面向方面编程(Aspect-Oriented Programming)，这是Gregor Kiczales于1996年在PARC提出的一个术语。AOP是一种与OOP截然不同的看待应用程序结构的方式，按照AOP的观念，系统被分解为方面(aspect)或者关注点(concern),而不是对象。<br><font color="#008000"><i>&nbsp;&nbsp;&nbsp; 曾经有一位同行把他理解为面向切面编程，更具有几何学的味道，也很容易理解。</i></font><br><br>&nbsp;&nbsp;&nbsp; <b>AOP的目标</b>是将横切性(crosscutting)的问题以一种更加通用的方式模块化，从而提升程序的模块化程度。<br><br>&nbsp;&nbsp;&nbsp; <font color="#008000"><i>AOP应该看作是OOP的补充，而不是竞争对手、替代者，AOP不仅可以减少重复代码的麻烦，而且为系统的领域模型的设计上带来一种更加完善的理念。<br></i></font><br>&nbsp;&nbsp;&nbsp; 几个关于AOP术语定义：<br>1、关注点(concern)：一个关注点可以是一个特定的问题、概念、或是应用程序的兴趣区间--总而言之，应用程序必须达到的一个目标。<br>2、横切关注点(crosscutting concern)：如果一个关注点的实现代码散落在很多个类或方法之中，就称之为“横切关注点”。<br>3、方面(aspect)：一个方面是对一个横切关注点的模块化，它将那些原本散落在各处的、用于实现这个关注点的代码规整到一处。<br>4、连接点(join point)：程序执行过程中的一点，例如：<br>&nbsp;&nbsp;&nbsp; 方法调用(method invocation)：对方法（可能包括构造子）的调用。<br>&nbsp;&nbsp; &nbsp;字段访问(field access)：读或写实例变量。<br>&nbsp;&nbsp; &nbsp;异常抛出(throws)：特定的异常被抛出。<br>5、增强(advice)：在特定连接点执行的动作。--很多AOP框架都以拦截器(interceptor)的形式来表现增强---所谓拦截器是这样的一个对象：当连接点被调用到时，它会收到一个回调信息。<br>6、切入点(pointcut)：一组连接点的总称，用于指定某个增强应该在何时被调用。切入点常用正则表达式或别的通配符语法来描述。<br>7、引介(introduction)：为一个现有的Java类或接口添加方法或字段。<br>8、混入继承(mixin inheritance)：一个“混入类”封装了一组功能，这组功能可以被“混入”到现有的类当中，并且无须求助于传统的继承手段。<br>9、织入(weaving)：将方面整合到完整的执行流程（或完整的类，此时被植入的便是引介）中。<br>10、前增强(before,pre)：在连接点调用之前，首先调用增强。<br>11、后增强(after,post)：在连接点调用之后，再调用增强。<br>12、环绕增强(around)：这类增强可以完全控制执行流程。<br>13、拦截器(interceptor)：一种AOP的实现策略。<br>14、AOP代理(AOP proxy)：即被增强(advice)的对象引用---也就是说，AOP增强将在其上执行的这样一个对象引用。<br>15、目标对象(target object)]<br>16、增强器(advisor)Spring引入的概念，由两个部分组成：一个增强，以及一个用于说明“在何处进行增强”的切入点。增强器完整地模块化了一个方面。这样，切入点和增强也可以各自独立地复用。<br><br>&nbsp;&nbsp;&nbsp; Decorator模式，需要针对每个目标类单独编写一个定制的装饰器。<br>&nbsp;&nbsp;&nbsp; Observer模式，必须插入一些与业务逻辑无关的代码。<br>&nbsp;&nbsp;&nbsp; Chain of Responsibility（责任链）模式,允许将一个请求在一条对象链上传播，直到其中的某一个对象负责处理请求为止。<br><br>&nbsp;&nbsp;&nbsp; Servlet2.3规范引入的servlet拦截器会在处理web请求的前后被调用。<br><br>&nbsp;&nbsp;&nbsp; AOP技术的主要策略：J2SE动态代理、动态字节码生成、Java代码生成、使用定制的类加载器、语言扩展。<br><br>&nbsp;&nbsp;&nbsp; 动态代理(dynamic proxies)，是一种强大的语言结构。<br>&nbsp;&nbsp;&nbsp; 动态代理最大的好处在于：这是一种标准的Java语言特性。除了AOP框架之外不需要第三方库，也不会受到应用服务器的任何影响。<br>&nbsp;&nbsp;&nbsp; 动态代理的最大局限性在于：它只能针对接口进行代理，不能针对类。不是坏事--因为AOP主要针对业务对象，而业务对象通常应该是放在业务接口之后的。<br><br>&nbsp;&nbsp;&nbsp; 动态字节码生成(dynamic byte code generation)，为了针对Java类提供代理，我们需要动态代理之外的工具，那就是动态字节码生成。Java的反射和类装载机制都非常开放。--最流行的工具CGLIB(Code Generation Library)。CGLIB是通过继承来实现代理的，所以无法为final方法提供代理。<br><br>&nbsp;&nbsp;&nbsp; Java代码生成，由于前两者的出现，其正在退出流行。<br><br>&nbsp;&nbsp;&nbsp; 使用定制的类加载器--？<br><br>&nbsp;&nbsp;&nbsp; 语言扩展<br><br>&nbsp;&nbsp;&nbsp; AOP实现：AspectJ、AspectWerkz、JBoss4、Spring<br>&nbsp;&nbsp;&nbsp; AspectJ可以对任何方法调用、字段访问、对象构造、异常抛出进行增强。<br>&nbsp;&nbsp;&nbsp; AspectWerkz和AspectJ已合并。<br>&nbsp;&nbsp;&nbsp; JBoss4的AOP框架和JBoss应用服务器的邦定，损害了J2EE“可移植性”的优点。<br><br>&nbsp;&nbsp;&nbsp; <font color="#008000">AOP在J2EE应用中的价值大多体现在方法拦截上--过几年，还会是这样么？</font><br><br>&nbsp;&nbsp;&nbsp; 通常AOP用于业务对象提供增强，在这种情况下，拦截的性能开销根本不成问题。关键：什么粒度夏使用AOP。<br>&nbsp;&nbsp;&nbsp; 一次涉及凡是的方法调用需要耗费的时间是毫秒级的--在服务器环境下通常在几毫秒至十几毫秒的范围。从比较来看，一次数据库只读访问的时间开销通常是数十毫秒，通过浏览器访问web页面的网络延迟则是百毫秒级的。也就是说，对于一个由远程客户端发起、需要涉及一到两次数据库访问的业务操作来说，“通过反射调用业务方法”的时间开销完全可以忽略不计。<br><br>&nbsp;&nbsp;&nbsp; <b>AOP最有价值的用途</b>就是在业务方法的粒度上提供通用的企业级服务，譬如声明性事物管理和声明性安全检查等。<br><br>&nbsp;&nbsp;&nbsp; AOP和IoC之间有特别紧密地合作关系。<br><br>&nbsp;&nbsp;&nbsp; Spring中的AOP实践<br>&nbsp;&nbsp;&nbsp; 1、使用ProxyFactoryBean：创建AOP代理的基本途径。<br>&nbsp;&nbsp;&nbsp; 2、便利的FactoryBean：例如TransactionProxyFactoryBean（声明性的事物管理）。<br>&nbsp;&nbsp;&nbsp; 3、自动代理<br><br>&nbsp;&nbsp;&nbsp; <b>AOP使我们开始在领域模型的层面上分析和识别横切关注点，就像分析和识别对象一样。</b><img src ="http://www.blogjava.net/JDeodar/aggbug/27644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-11 21:55 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/11/27644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《J2EE Development without EJB》 笔记三</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/09/27284.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Mon, 09 Jan 2006 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/09/27284.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/27284.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/09/27284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/27284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/27284.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 自己虽然研究过一点Spring,也写过一点利用Spring的代码，但是从来没有认真的从头到尾的研究过Spring，导致其中细节概念混乱，再看到第7章，Spring框架简介时，又体会到了这一点，希望能够尽快抽出时间，能够详细阅读有关Spring的文章和书籍，从中体会和理解<b>IoC的“精神”和Spring的“细节”</b>。<br><b>1、核心bean工厂</b><br>&nbsp;&nbsp;&nbsp; 1.1 基础接口：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanFactory<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListableBeanFactory（只可用于当前的工厂实例，而不能进入工厂的层级体系）<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beanFacoryUtils（可以遍历整个工厂体系）<br>&nbsp;&nbsp;&nbsp; 1.2 通过XML组装bean：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义bean组件（借助标准的java.beans.PropertyEditor机制，bean工厂可以自动把String类型的值转换为适当的类型）<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  访问bean组件（<b>a:</b>XmlBeanFactory、<b>b:</b>DefaultlistableBeanFactory和XmlBeanDefinitionReader）<br>&nbsp;&nbsp;&nbsp; 1.3 非XML格式的Bean声明<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  读取属性文件或资源包（PropertiesBeanDefinitionReader）<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 编程方式注册（RootBeanDefinition和MutablePropertyValues）<br>&nbsp;&nbsp;&nbsp; 1.4 组装应用对象<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; bean工厂可以根据bean属性中描述的对象依赖来组装（wire）bean实例，使得Spring容器能够对受管对象进行依赖决议（dependency resolving）<br>&nbsp;&nbsp;&nbsp; 1.5 自动装配（autowire）<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  byType、byName，推荐byType(出错可能小)<br>&nbsp;&nbsp;&nbsp; 1.6 依赖检查（dependency checking）<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">bean&nbsp;</span><span style="color: rgb(255, 0, 0);">id&nbsp;</span><span style="color: rgb(0, 0, 255);">="****"</span><span style="color: rgb(255, 0, 0);">&nbsp;class</span><span style="color: rgb(0, 0, 255);">=""</span><span style="color: rgb(255, 0, 0);">&nbsp;autowire</span><span style="color: rgb(0, 0, 255);">="byType"</span><span style="color: rgb(255, 0, 0);">&nbsp;dependency-check</span><span style="color: rgb(0, 0, 255);">="objects"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><img src="http://www.blogjava.net/images/dot.gif"><img src="http://www.blogjava.net/images/dot.gif">.</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; 值为“object”时，表示只做对象间关联的检查；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  值为“simple”时，表示只检查基本类型的属性（原始类型或者String）；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  值为“all”时，表示检查所有的类型；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  值为“none”，表示不进行依赖检查；<br>&nbsp;&nbsp;&nbsp; 1.7 生命周期回调<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  在bean组件声明中指定回调方法<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);"> &lt;</span><span style="color: rgb(128, 0, 0);">bean&nbsp;</span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="*****"</span><span style="color: rgb(255, 0, 0);">&nbsp;class</span><span style="color: rgb(0, 0, 255);">="****"</span><span style="color: rgb(255, 0, 0);">&nbsp;init-method</span><span style="color: rgb(0, 0, 255);">="initialize"</span><span style="color: rgb(255, 0, 0);">&nbsp;destory-method</span><span style="color: rgb(0, 0, 255);">="shutdown"</span><span style="color: rgb(0, 0, 255);">/&gt;</span></div><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  ***类只需提供无参数、访问级别为public的initialize和shutdown两个方法即可，不必实现任何Spring特有的接口（不依赖Spring）。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  只要有可能，应该尽量使用JavaBean的属性或者构造子参数，而不是实现Spring生命周期方法。<br>&nbsp;&nbsp;&nbsp; 1.8 复杂的属性值<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  数组和List组装方式一样；<br> <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="myArrayList"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref&nbsp;</span><span style="color: rgb(255, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">="ABean"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref&nbsp;</span><span style="color: rgb(255, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">="BBean"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">myArrayValue</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">myListValue</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">8</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Map和Properties都一个Key值,但是不一样（废话一句）；<br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="myMap"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">map</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">entry&nbsp;</span><span style="color: rgb(255, 0, 0);">key</span><span style="color: rgb(0, 0, 255);">="myMapKey"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref&nbsp;</span><span style="color: rgb(255, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">="myBean"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">entry</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">entry&nbsp;</span><span style="color: rgb(255, 0, 0);">key</span><span style="color: rgb(0, 0, 255);">="yourMapKey"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">yourMapValue</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">entry</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">map</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="myProperties"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">props</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">prop&nbsp;</span><span style="color: rgb(255, 0, 0);">key</span><span style="color: rgb(0, 0, 255);">="myPropKey"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myPropValue<br></span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">prop</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">prop&nbsp;</span><span style="color: rgb(255, 0, 0);">key</span><span style="color: rgb(0, 0, 255);">="yourPropKey"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yourPropValue<br></span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">prop</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">props</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br><b>2、工厂bean</b><br>&nbsp;&nbsp;&nbsp; 2.1 工厂bean（factory bean）-- 它们实现了org.springframework.beans.factory.FactoryBean接口；<br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);">&nbsp;FactoryBean{<br>&nbsp;&nbsp;&nbsp;&nbsp;object&nbsp;getObject()&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;Exception;<br>&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;getObjectType();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;isSingleton();<br>}</span></div>&nbsp;&nbsp;&nbsp; 2.2 Spring内建的资源工厂，包括：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; 2.2.1 org.springframework.jndi.JndiObjectFactoryBean:一个通用的工厂bean，通过JNDI查找而获得的对象。JNDI查找由Spring--而不是应用代码--来执行；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  2.2.2 org.springframework.orm.hibernate.LocalSessionFactoryBean:用于在本地装配Hibernate SessionFactory的工厂bean；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  2.2.3 org.springframework.aop.framework.ProxyFactoryBean:一个通用的工厂bean，用于获得AOP代理。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  2.2.4 org.springframework.transaction.interceptor.TransactionProxyFactoryBean:用于为对象创建事务代理，用于实现简捷易用的声明性食物管理；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  2.2.5 org.springframework.remoting.rmi.RmiProxyFactoryBean:这个工厂bean可以为通过RMI访问的远程对象创建一个代理；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; 以上为常用的，不常用的不列了......<br><b>3、Spring 应用上下文<br></b>&nbsp;&nbsp;&nbsp; 应用上下文是应用程序的中心注册机构。 &nbsp;  <br>&nbsp;&nbsp;&nbsp; 3.1 除了支持bean工厂的全部功能之外，应用上下文还具备了下列功能：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <b>*支持不同信息源</b>。可以用统一的方式根据键获得本地化的信息，而不依赖地称的信息来源。默认的实现是从资源绑定中读取信息。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <b>*访问文件资源。</b>不依赖于实际资源环境（例如文件系统或ServletContext）的情况下，根据相对路径载入资源。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <b>*支持应用事件</b>。监听器（Spring AOP框架可以作为“事件-监听”机制的替代品）。<br>&nbsp;&nbsp;&nbsp; 3.2 访问信息源以及访问文件资源，引用对象依赖更专用的接口--org.springframework.context.ResourceLoaderAware接口--即可。<br>&nbsp;&nbsp;&nbsp; 3.3 信息源，在应用上下文声明一个名为messageSource的MessageSourc对象，默认实现是ResourceBundleMessageSource,它对标准的java.util.ResourceBundle进行了封装，它唯一需要的参数是basename,也就是资源包的文件名--只读取一次，放入缓存；也提供了“ReloadableResourceBundleMessageSource”(可重新加载)。<br>&nbsp;&nbsp;&nbsp; 3.4 文件资源<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  实现ResourceLoadAware接口。<br>&nbsp;&nbsp;&nbsp; 3.5 Bean Factory 后处理<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  ----------<br><img src ="http://www.blogjava.net/JDeodar/aggbug/27284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-09 17:40 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/09/27284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 Jakart Commons Lang 学习一</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/07/27007.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Sat, 07 Jan 2006 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/07/27007.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/27007.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/07/27007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/27007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/27007.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 今天看了《<b>Jakarta Commons Cookbook</b>》关于利用 commons 包来实现（生成）toString()、hashCode()、equals()、compareTo()的几个方法，其中感觉利用其在编程中能够带来一些便利，好像在网上某一篇文章中说到利用生成的toString()不能输出List、Map等对象，经过试验，List和Map中的对象值是可以输出的。<br><img src ="http://www.blogjava.net/JDeodar/aggbug/27007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-07 18:21 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/07/27007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《J2EE Development without EJB》 笔记二</title><link>http://www.blogjava.net/JDeodar/archive/2006/01/05/26766.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Thu, 05 Jan 2006 11:01:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/05/26766.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/26766.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/05/26766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/26766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/26766.html</trackback:ping><description><![CDATA[1、IOC的实现策略<ul><li>依赖查找（Dependency Lookup）</li></ul>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#008000"><i>EJB和其他一些J2EE API（例如 servlet）都提供了依赖查找形式的IOC：容器管理对象的生命周期，受管对象则负责查找自己的依赖关系。</i></font><br><ul><li>依赖注入（Dependency Injection）</li></ul>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <i><font color="#008000">让容器去全权负责依赖查询，受管对象只需暴露JavaBean的Setter方法或者带参数的构造子，使容器可以在初始化时组装对象的依赖关系。由于这种方式不依赖于特定的容器API或接口，称之为“基于语言的IoC（language-base IoC）”。</font><br><br></i>2、代码风格<br><ul><li>针对接口编程、而非针对类编程，从而在可接插性方面获得最大限度好处。</li></ul>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#008000"><i>接口编程何等重要。</i></font><br><ul><li>确保每个业务对象有自己的明确责任，通过对象之间的协作将责任区分明确。</li></ul>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#008000"><i>良好的设计和高素质的程序员才能得以保证。</i></font><br><ul><li>优先考虑使用Strategy设计模式，而不是具体继承。</li></ul>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#008000"><i>Strategy设计模式还需要多加学习和实践。</i></font><br><ul><li>但凡容器可以解决的问题（比如JNDI查询），就不要自己编写代码来解决。</li></ul>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#008000"><i>容器的发展，给我们带来了很大的便利。<br><br>下图为书中的一张图，又重新划了一边，理解方便。<br><img src="http://www.blogjava.net/images/blogjava_net/jdeodar/J2EE/IoC.gif" alt="IoC.gif" title="IoC实现策略" border="0" height="262" width="477"><br></i></font><img src ="http://www.blogjava.net/JDeodar/aggbug/26766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-05 19:01 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/05/26766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《J2EE Development without EJB》 笔记一 </title><link>http://www.blogjava.net/JDeodar/archive/2006/01/04/26614.html</link><dc:creator>JDeodar</dc:creator><author>JDeodar</author><pubDate>Wed, 04 Jan 2006 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/JDeodar/archive/2006/01/04/26614.html</guid><wfw:comment>http://www.blogjava.net/JDeodar/comments/26614.html</wfw:comment><comments>http://www.blogjava.net/JDeodar/archive/2006/01/04/26614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JDeodar/comments/commentRss/26614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JDeodar/services/trackbacks/26614.html</trackback:ping><description><![CDATA[<DIV class=postbody>
<H5>阅读《J2EE Development without EJB》中文版 </H5>
<HR>

<P><FONT face="Courier New"><STRONG><FONT size=2>第二章（目标）、第三章（各种架构）</FONT><BR></STRONG>1、提升生产率更好的办法<BR></FONT><FONT face="Courier New" size=2>&nbsp;A:架构<BR>&nbsp;&nbsp;1）、避免不必要的架构复杂性；<BR>&nbsp;&nbsp;2）、避免不必要地使用EJB；<FONT color=#008000><EM>（简化架构及编程复杂度）<BR></EM></FONT>&nbsp;&nbsp;3）、使用抽象层将J2EE或J2SE核心API的复杂性隐藏起来；<EM><FONT color=#008000>（降低程序员编程难度）<BR></FONT></EM>&nbsp;&nbsp;4）、尽量使用O/R映射工具简化持久层；<FONT color=#008000><EM>（Hibernate或者iBATIS）<BR></EM></FONT>&nbsp;&nbsp;5）、使用一个好的应用框架。<EM><FONT color=#008000>（Spring或者PicoContainer）<BR></FONT></EM>&nbsp;B：关注，以及方法学<BR>&nbsp;&nbsp;1）、专注！弄清自己要解决什么问题，专心把这个问题解决好。<FONT color=#008000><EM>（“方法论”需要好好学习实践）<BR></EM></FONT>&nbsp;&nbsp;2）、选择一个合适的参考架构，从一个模板应用开始。<FONT color=#008000><EM>（AppFuse在代码上有很多值得借鉴的地方）<BR></EM></FONT>&nbsp;&nbsp;3）、使用敏捷的开发过程。<FONT color=#008000><EM>（敏捷开发需要深入了解学习，值得借鉴的地方很多）<BR></EM></FONT>&nbsp;C：使用合适的工具。<BR>&nbsp;&nbsp;1）、好的IDE：Eclipse或者IntelliJ；<FONT color=#008000><EM>（个人喜欢Eclipse）<BR></EM></FONT>&nbsp;&nbsp;2）、一个单元测试工具：JUnit；<BR>&nbsp;&nbsp;3）、一个标准构建工具：Ant；<BR>&nbsp;&nbsp;4）、一个好的XML编辑器或者IDE插件；<BR>&nbsp;&nbsp;5）、一个有效的源码控制系统，并且与IDE良好集成。</FONT></P>
<P><FONT face="Courier New"></FONT></P>
<P><FONT face="Courier New" size=2><FONT size=3>2、OO比J2EE重要</FONT><BR>&nbsp;1）优雅的封装领域概念，隐藏实现细节；<BR>&nbsp;2）借助多态描述实现各不相同的对象之间的共通性；<BR>&nbsp;3）达到代码复用；<BR>&nbsp;4）在无须修改现有代码的前提下获得扩展性。<BR><BR><FONT size=3>3、针对接口编程</FONT><BR>&nbsp;1）好处：方面测试、方便使用动态代理；<EM><FONT color=#008000>（还有更多的好处，需要亲自体会）</FONT></EM><BR>&nbsp;2）针对接口编程，不要针对类编程。这是一个最基本的OO原则。<EM><FONT color=#008000>（Gang of Four，GoF）设计模式值得仔细阅读</FONT></EM></FONT></P>
<P><FONT face="Courier New" size=2><FONT size=3>4、J2EE应用系统最佳方案的目标 </FONT><BR>&nbsp;最简单、最容易测试、符合OO原则、便于维护、便于扩展。&nbsp;<EM><FONT color=#008000>（业务系统达到最佳是我们的目标，这就需要更多的付出）</FONT></EM></FONT></P></DIV>
<STYLE>
TD { FONT-SIZE: 12px }
.commentTextBox { FONT-SIZE: 12px }
</STYLE>
<!--Beging Temp Save-->
<STYLE>.userData { BEHAVIOR: url(#default#userdata) }
	</STYLE><img src ="http://www.blogjava.net/JDeodar/aggbug/26614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JDeodar/" target="_blank">JDeodar</a> 2006-01-04 22:24 <a href="http://www.blogjava.net/JDeodar/archive/2006/01/04/26614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>