??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人亚洲综合网站不卡,国产午夜亚洲精品午夜鲁丝片,亚洲一区二区三区在线观看蜜桃http://www.tkk7.com/chaocai/category/19716.htmlzh-cnSun, 09 Oct 2011 03:41:21 GMTSun, 09 Oct 2011 03:41:21 GMT60Spring AOP on Annotationhttp://www.tkk7.com/chaocai/archive/2011/06/07/351844.html越巅峰越巅峰Tue, 07 Jun 2011 03:34:00 GMThttp://www.tkk7.com/chaocai/archive/2011/06/07/351844.htmlhttp://www.tkk7.com/chaocai/comments/351844.htmlhttp://www.tkk7.com/chaocai/archive/2011/06/07/351844.html#Feedback2http://www.tkk7.com/chaocai/comments/commentRss/351844.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/351844.html1 The annotation:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface NeedToRetry {
    Class<?>[] recoverableExceptions();
    int retryTime();
    int intervalIncrementalFactor() default 0;
    long retryInterval() default 0L;
}

2 The Aspect
@Aspect
public class InvokingRetryInterceptor {
    private static Logger log = Logger.getLogger(InvokingRetryInterceptor.class);
    private boolean isNeedToRetry(Throwable t,Class<?>[] recoverableExceptions){
        String exceptionName= t.getClass().getName();
        for (Class<?> exp:recoverableExceptions){            
            if (exp.isInstance(t)){
                return true;
            }
        }
        log.warn("The exception doesn't need recover!"+exceptionName);
        return false;
    }

    private long getRetryInterval(int tryTimes,long interval,int incrementalFactor){
        return interval+(tryTimes*incrementalFactor);
    }
    
    @Around(value="@annotation(amazon.internal.dropship.common.NeedToRetry)&&@annotation(retryParam)",argNames="retryParam")
    public Object process(ProceedingJoinPoint pjp,NeedToRetry retryParam ) throws Throwable{
        boolean isNeedTry=true;
        int count=0;
        Throwable fault;            
        Class<?>[] recoverableExceptions=retryParam.recoverableExceptions();
        int retryTime=retryParam.retryTime();
        long retryInterval=retryParam.retryInterval();
        int incrementalFactor=retryParam.intervalIncrementalFactor();
        do{
            try{                
                return pjp.proceed();            
            }catch(Throwable t){
                fault=t;
                if (!isNeedToRetry(t,recoverableExceptions)){
                    break;
                }
                Thread.sleep(getRetryInterval(retryTime,retryInterval,incrementalFactor));
            }
            count++;
        }while(count<(retryTime+1));
        throw fault;
        
    }
}

越巅峰 2011-06-07 11:34 发表评论
]]>
JBehave in practicehttp://www.tkk7.com/chaocai/archive/2011/02/26/345233.html越巅峰越巅峰Sat, 26 Feb 2011 05:34:00 GMThttp://www.tkk7.com/chaocai/archive/2011/02/26/345233.htmlhttp://www.tkk7.com/chaocai/comments/345233.htmlhttp://www.tkk7.com/chaocai/archive/2011/02/26/345233.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/345233.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/345233.htmlATDD (Acceptance Test Driven Development) is the extension of TDD, which helps us deliver exactly what the customer wants. Now ATDD has already been the hot spot in the software development world. There are several variations of ATDD including BDD, EDD and etc, also more and more frameworks have been created to help us develop with ATDD, for example  FIT and JBehave.
The followings will introduce how to use the JBehave in your real project effectively.

 

Figure 1 Test Code Structure

Each test implementation could be divided into four layers, this structure could help us improve the codes reusability and maintainability, So, it will make us implement the tests quickly and easily.

Specification/Scenario layer:

This layer describes system’s behaviors and functionalities by the scenarios.  For using JBehave, we can use the natural language describe the scenarios and just need to follow the JBehave ‘Given-When-Then’ rule.

Parser layer:

We don’t need to implement this layer , this layer has been implemented by JBehave. What exactly JBehave do is to relate the steps of the scenario to the methods of the test codes.

Step Logic Layer:

The layer implements test logics associating with every step of the scenarios. Every step are implemented by a Java method.

Action/Utils layer

This the very important layer to improve the reusability of our codes. This layer provides the utility methods to help you implement step logics. These utility methods usually involved the system state checking, mock requests sending and so on.

For example, we can provide the methods to check the data in database/file or check the state of the middleware, also so frameworks are very useful to implement the logic simulating the client browser’s requests.

 


Chao Cai

Working for Amazon.com

chaocai2001@yahoo.com.cn

 



越巅峰 2011-02-26 13:34 发表评论
]]>
在Weblogic中部|CXF的技?/title><link>http://www.tkk7.com/chaocai/archive/2010/01/15/309709.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Fri, 15 Jan 2010 13:11:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2010/01/15/309709.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/309709.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2010/01/15/309709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/309709.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/309709.html</trackback:ping><description><![CDATA[  <p><span style="font-family: 宋体">׃</span>Weblogic<span style="font-family: 宋体">中包含的相关</span>JWS<span style="font-family: 宋体">?/span>JAX-RPC<span style="font-family: 宋体">实现的媄响得我们在其中部v相关</span>CXF<span style="font-family: 宋体">应用时L会遇C些棘手的问题Q本人根据自q实践l验其中一些注意事作了一下ȝ?/span></p> <p>1 <span style="font-family: 宋体">?/span>EAR<span style="font-family: 宋体">形式部v</span></p> <p><span style="font-family: 宋体">?/span>CXF<span style="font-family: 宋体">的应用以</span>WAR<span style="font-family: 宋体">的Ş式包含在</span>EAR<span style="font-family: 宋体">中,?/span>EAR<span style="font-family: 宋体">?/span>META-INF<span style="font-family: 宋体">中的配置文g</span>application.xml<span style="font-family: 宋体">中声明你?/span>WAR<span style="font-family: 宋体">Qƈ?/span>weblogic-application.xml<span style="font-family: 宋体">中加入以下内容:</span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><?</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">xml </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">version</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"1.0" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">encoding</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"UTF-8"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">?></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">weblogic-application </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">xmlns</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"http://www.bea.com/ns/weblogic/90"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">      </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">application-param</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">param-name</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">webapp.encoding.default</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"></</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">param-name</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">param-value</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">UTF-8</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"></</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">param-value</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">      </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"></</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">application-param</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">      </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">prefer-application-packages</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">package-name</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">javax.jws.*</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"></</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">package-name</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">      </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"></</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">prefer-application-packages</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">></span></p> <p><span style="font-size: 10pt; color: teal; line-height: 115%; font-family: 'Courier New'"></</span><span style="font-size: 10pt; color: #3f7f7f; line-height: 115%; font-family: 'Courier New'">weblogic-application</span><span style="font-size: 10pt; color: teal; line-height: 115%; font-family: 'Courier New'">></span></p> <p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">q个配置是告诉应用服务器的类装蝲器对于该</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">EAR</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">而言优先使用?/span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">EAR</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">javax.jws.*</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">的实现?/span></p> <p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">2 </span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">在应用服务器启动时加?/span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">Java VM</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">参数</span></p> <p><span style="color: black">-Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl</span></p> <p><span style="color: black; font-family: 宋体">好了现在一切搞定!<br /> <br /> (蔡超 <a href="mailto:chaocai2001@yahoo.com.cn">chaocai2001@yahoo.com.cn</a>)</span></p> <img src ="http://www.tkk7.com/chaocai/aggbug/309709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2010-01-15 21:11 <a href="http://www.tkk7.com/chaocai/archive/2010/01/15/309709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ҏ编E原?1)http://www.tkk7.com/chaocai/archive/2009/09/14/295064.html越巅峰越巅峰Mon, 14 Sep 2009 12:28:00 GMThttp://www.tkk7.com/chaocai/archive/2009/09/14/295064.htmlhttp://www.tkk7.com/chaocai/comments/295064.htmlhttp://www.tkk7.com/chaocai/archive/2009/09/14/295064.html#Feedback1http://www.tkk7.com/chaocai/comments/commentRss/295064.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/295064.html1 SRP

SRP(Single Responsible Principle), 单一职责原则Q这是面对的最基本原则Q也是实现弹性设计的最基本原则?/font>

每个cL接口定义应该只包含一U明的职责Q同时仅有一U原因会Dq种定义的修攏V一个复杂的cL接口的定义包含多个责任,很容易你的设计失去Ҏ,很多因素都会Dq个cL接口的变_׃它含有多U职责,q就意味着它是多种服务的提供者,会有多种依赖于它的客LQ他的变更可能会D大范围的变更?/span>

在作者看来,优先U最高的是你首先要保证接口的单一职责及方法的单一职责Q接口通常意味可以更换不同的实玎ͼZ个接口定义过多的职责意味着每个实现都会涉及多个职责Q这导致无法实现更粒度的实现的复用?/span>

面向抽象~成

如果你已l读q?font face="Times New Roman">GOF的《设计模式》,你便知道其中每一个模式都是基于此原则的,抽象Q或接口Q有效的解除了服务调用者和服务提供者间的耦合?/font>

使用配置

通过修改配置文g便可以改变系l的某些Ҏ,q种修改的区别于修改代码Q对?font face="Times New Roman">Java,C++而言q种修改是不需要编译,有的修改甚至可以在运行时生效?/font>DSL地运用可以配置更加h可读性及更强的描q能力。在设计时将实现分ؓ配置及框枉分是非常灉|的结构?/font>


蔡超
HP 软g架构?br /> 软g架构N
SCEA
IBM Certified Solution Designer for OOA&D vUML2
Chaocai2001@yahoo.com.cn




越巅峰 2009-09-14 20:28 发表评论
]]>
Spring DM快速入门中文教E?/title><link>http://www.tkk7.com/chaocai/archive/2009/08/25/292531.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Tue, 25 Aug 2009 09:11:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2009/08/25/292531.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/292531.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2009/08/25/292531.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/292531.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/292531.html</trackback:ping><description><![CDATA[<p>厌倦了那些厚书Q特别是那些Z赚钱而特意写厚的书)Q很多时候这些书让我们找不到技术要点,甚至丧失了学习的兴趣Q而最l变成那些拒l新技术的“固z?#8221;?br /> 其实掌握技术的最x式是实践Q在实践中不断的深入学习?br /> 本教E旨在帮助哪些已l掌握了OSGi和Spring技术基的开发h员,q速将Spring DM应用于实际开发,q是一份入门教E,不求全面Q但求简单?br /> q请配合本教E的实例代码一同学习?/p> <p>下蝲教程和示?<br /> http://www.tkk7.com/Files/chaocai/spring-osgi.rar</p> <img src ="http://www.tkk7.com/chaocai/aggbug/292531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2009-08-25 17:11 <a href="http://www.tkk7.com/chaocai/archive/2009/08/25/292531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mini-Container 在已发布在SourceForge?/title><link>http://www.tkk7.com/chaocai/archive/2009/06/10/281210.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Wed, 10 Jun 2009 12:48:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2009/06/10/281210.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/281210.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2009/06/10/281210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/281210.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/281210.html</trackback:ping><description><![CDATA[Mini-Container 在已发布在SourceForge?br /> 相关链接Qhttp://www.tkk7.com/chaocai/archive/2008/05/26/203020.html<br /> 目地址Q?a >http://sourceforge.net/projects/mini-container</a> <img src ="http://www.tkk7.com/chaocai/aggbug/281210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2009-06-10 20:48 <a href="http://www.tkk7.com/chaocai/archive/2009/06/10/281210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式工作流引擎(SWF ver0.94)新版发布http://www.tkk7.com/chaocai/archive/2008/09/17/229500.html越巅峰越巅峰Wed, 17 Sep 2008 09:58:00 GMThttp://www.tkk7.com/chaocai/archive/2008/09/17/229500.htmlhttp://www.tkk7.com/chaocai/comments/229500.htmlhttp://www.tkk7.com/chaocai/archive/2008/09/17/229500.html#Feedback2http://www.tkk7.com/chaocai/comments/commentRss/229500.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/229500.html 2 增加了对用户的支持,可以制定与Node相关的用?br /> 3 修改了Spring整合部分
4 新增了基于Struts2的WEBE序CZ

下蝲地址Q?br /> http://www.tkk7.com/Files/chaocai/swf-0.94.rar
参见
SWF一个简单工作流引擎



越巅峰 2008-09-17 17:58 发表评论
]]>
DAO模式最佛_?/title><link>http://www.tkk7.com/chaocai/archive/2008/06/25/210685.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Wed, 25 Jun 2008 13:49:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2008/06/25/210685.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/210685.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2008/06/25/210685.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/210685.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/210685.html</trackback:ping><description><![CDATA[<p> </p> DAO看似是一个非常简单的模式Q但q个模式却十分重要,它可以帮助我们实现持久化逻辑和业务逻辑的分;它可以帮助我们实现对多种持久化实现的支持?br /> 同时QDAO模式q没有看hq么单,要真正发挥它的威力需注意的方面很多,而这些方面常常被大家忽略Q以下是本hȝ的一些最佛_c?br /> 1 不要在DAO上控制事务的边界<br /> 应该在Façade层控制事务的边界Q这样可以提高DAO的复用性,使它适用于不同的事务{略?br /> 2 不要q分使用Checked Exception<br /> 开发者常怼DAO中的各种异常通通捕捉ƈ通过Checked Exception抛出Q其实这是中不好的习惯,因ؓDAO中发生的异常常常是不可恢复的Q如Q数据库q接问题{)Q既然如此就应该使用RuntimeException异常抛出Q用这U异常还有一个好处就是在CMP的情况下可以自动引发事务的回滚?br /> 3 不要在DAO中处理懒加蝲问题<br /> 使用Hibernate׃l常遇到懒加载问题,但是q个问题不应该在DAO中解冻Iq样会媄响DAO的复用性,应ؓ要加载那些对象域往往是和界面相关的,q个问题应该在Façade层中解决Q应是离表现层较q的一层?br />  <br /> <br /> http://dev2dev.bea.com.cn/blog/chaocai/200806/dao_24_1070.html<br />  <br /> 蔡超<br /> 软g架构?br /> 软g架构N<br /> SCEA<br /> IBM Certified Solution Designer for OOA&D vUML2<br /> Chaocai2001@yahoo.com.cn<br /> <img src ="http://www.tkk7.com/chaocai/aggbug/210685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2008-06-25 21:49 <a href="http://www.tkk7.com/chaocai/archive/2008/06/25/210685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现IoC,AOP容器-下蝲问题http://www.tkk7.com/chaocai/archive/2008/06/19/209046.html越巅峰越巅峰Thu, 19 Jun 2008 00:29:00 GMThttp://www.tkk7.com/chaocai/archive/2008/06/19/209046.htmlhttp://www.tkk7.com/chaocai/comments/209046.htmlhttp://www.tkk7.com/chaocai/archive/2008/06/19/209046.html#Feedback2http://www.tkk7.com/chaocai/comments/commentRss/209046.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/209046.html
http://www.tkk7.com/Files/chaocai/mini-container-beta-0.9-a.rar
源码下蝲没有问题可以l箋下蝲?br />





越巅峰 2008-06-19 08:29 发表评论
]]>
自己实现IoC,AOP容器 源码下蝲http://www.tkk7.com/chaocai/archive/2008/05/27/203261.html越巅峰越巅峰Tue, 27 May 2008 08:54:00 GMThttp://www.tkk7.com/chaocai/archive/2008/05/27/203261.htmlhttp://www.tkk7.com/chaocai/comments/203261.htmlhttp://www.tkk7.com/chaocai/archive/2008/05/27/203261.html#Feedback5http://www.tkk7.com/chaocai/comments/commentRss/203261.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/203261.html http://www.tkk7.com/chaocai/archive/2008/05/26/203020.html
源码下蝲
http://www.tkk7.com/Files/chaocai/mini-container-beta0.9-src.rar
希望对大家有帮zQ也期待大家的反馈!

越巅峰 2008-05-27 16:54 发表评论
]]>
自己实现IoC,AOP容器http://www.tkk7.com/chaocai/archive/2008/05/26/203020.html越巅峰越巅峰Mon, 26 May 2008 12:21:00 GMThttp://www.tkk7.com/chaocai/archive/2008/05/26/203020.htmlhttp://www.tkk7.com/chaocai/comments/203020.htmlhttp://www.tkk7.com/chaocai/archive/2008/05/26/203020.html#Feedback8http://www.tkk7.com/chaocai/comments/commentRss/203020.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/203020.html阅读全文

越巅峰 2008-05-26 20:21 发表评论
]]>
q细_度的Bundle是成功实现OSGi应用的大?/title><link>http://www.tkk7.com/chaocai/archive/2008/04/15/193219.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Tue, 15 Apr 2008 13:43:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2008/04/15/193219.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/193219.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2008/04/15/193219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/193219.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/193219.html</trackback:ping><description><![CDATA[  <p><span style="font-family: 宋体">q期做了几个使用</span>OSGi<span style="font-family: 宋体">开发的应用Q发C用过l粒度的</span>Bundle<span style="font-family: 宋体">不会l项目带来Q何好处,而很多设计h员实际都会在使用</span>OSGi<span style="font-family: 宋体">q_旉入这个陷阱?/span></p> <p><span style="font-family: 宋体">首先我们分析</span>OSGi<span style="font-family: 宋体">的特点及可以l我们应用带来的好处</span></p> <p>1 <span style="font-family: 宋体">良好的动态特?/span></p> <p>2 <span style="font-family: 宋体">更细_度的类装蝲控制Q多个版本组件在同一q行环境中共同运?/span></p> <p>3 <span style="font-family: 宋体">?/span>JVM<span style="font-family: 宋体">内部实现</span>SOA<span style="font-family: 宋体">Q我个h倒是认ؓ</span>OSGi<span style="font-family: 宋体">所涉及的仅仅是</span>SOA<span style="font-family: 宋体">思想的一部分)</span></p> <p>4 DS<span style="font-family: 宋体">提供?/span>IoC<span style="font-family: 宋体">支持</span></p> <p><span style="font-family: 宋体">h考你的应用程序真的需要这些吗Q?/span></p> <p><span style="font-family: 宋体">很多设计和开发h员都会在设计和实现时忽略应用的真正需要和</span>OSGi<span style="font-family: 宋体">的复杂性,应用的所有内部细划分都采用</span>Bundle<span style="font-family: 宋体">实现?/span></p> <p><span style="font-family: 宋体">而我们除了应该注意采?/span>OSGi<span style="font-family: 宋体">开发和调试带来的复杂性;同时也要明白动态特性的支持q不是仅仅采?/span>OSGi<span style="font-family: 宋体">q_可以搞定的Q要真正实现动态特性必L意模块的启动序无关性及对其所依赖服务的监听等Q这些都会大大增加系l实现和调试的复杂性?/span></p> <p><span style="font-family: 宋体">其实我们应该认真分析应用是否需要这?/span>OSGi<span style="font-family: 宋体">的特性及q些Ҏ应该在应用的那些部分体玎ͼ例如我们可以在扩展方面采?/span>Bundle<span style="font-family: 宋体">实现扩展插gQ至于其它部分则不必采用q多?/span>Bundles<span style="font-family: 宋体">Q甚臛_以采用一个大?/span>Bundle<span style="font-family: 宋体">Q而其内部则可以采用如</span>Spring<span style="font-family: 宋体">来帮助我们实现模块化Q?/span></p> <p><span style="font-family: 宋体">同时Q不要忘记其他的</span>framework<span style="font-family: 宋体">同样提供了很好的lg化的基础架构?/span>Spring<span style="font-family: 宋体">Q?/span>Pico-Container<span style="font-family: 宋体">Q在</span>OSGi<span style="font-family: 宋体">与其它技术؜合时</span>SCA<span style="font-family: 宋体">同样是很好的选择?/span></p> <p><span style="font-family: 宋体">保持应用的简单性,不要针对特定技术进行设计,而要计选择适合的技术?/span></p> <p style="background: white; line-height: 200%"><span style="font-size: 10.5pt; line-height: 200%">蔡超<br /> </span><span style="font-size: 10.5pt; line-height: 200%; font-family: 'MS Shell Dlg'">Chaocai2001@yahoo.com.cn</span></p> <span style="font-size: 10.5pt; font-family: 'MS Shell Dlg'">JEE</span><span style="font-size: 10.5pt; font-family: 宋体">咨询N</span><span style="font-size: 10.5pt; font-family: 'MS Shell Dlg'"><br clear="all" /> SCEA(1.2&5)<br clear="all" /> IBM Certified OOA&D Solution Designer vUML2</span> <img src ="http://www.tkk7.com/chaocai/aggbug/193219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2008-04-15 21:43 <a href="http://www.tkk7.com/chaocai/archive/2008/04/15/193219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring OSGI 快速入门中文教E?/title><link>http://www.tkk7.com/chaocai/archive/2008/04/06/191105.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Sun, 06 Apr 2008 12:41:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2008/04/06/191105.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/191105.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2008/04/06/191105.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/191105.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/191105.html</trackback:ping><description><![CDATA[<p>厌倦了那些厚书Q特别是那些Z赚钱而特意写厚的书)Q很多时候这些书让我们找不到技术要点,甚至丧失了学习的兴趣Q而最l变成那些拒l新技术的“固z?#8221;?br /> 其实掌握技术的最x式是实践Q在实践中不断的深入学习?br /> 本教E旨在帮助哪些已l掌握了OSGi和Spring技术基的开发h员,q速将Spring DM应用于实际开发,q是一份入门教E,不求全面Q但求简单?br /> q请配合本教E的实例代码一同学习?/p> <p>下蝲教程和示?<br /> http://www.tkk7.com/Files/chaocai/spring-osgi.rar<br /> <br /> <br /> <br /> <br /> <br /> 蔡超</p> <p>JEE咨询N<br /> SCEA(1.2&5)<br /> IBM Certified OOA&D Solution Designer vUML2</p> <img src ="http://www.tkk7.com/chaocai/aggbug/191105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2008-04-06 20:41 <a href="http://www.tkk7.com/chaocai/archive/2008/04/06/191105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分层模式中的常见问题http://www.tkk7.com/chaocai/archive/2008/03/19/187361.html越巅峰越巅峰Wed, 19 Mar 2008 13:48:00 GMThttp://www.tkk7.com/chaocai/archive/2008/03/19/187361.htmlhttp://www.tkk7.com/chaocai/comments/187361.htmlhttp://www.tkk7.com/chaocai/archive/2008/03/19/187361.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/187361.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/187361.html
引言
分层l构是目前复杂应用系l开发时普遍使用的模式,软g中层之间的依赖关pȝ束是比较宽松的,q不要求上层仅可以依赖于直接下层Q而是上层可以依赖于它的所有下层?/div>
设计中我们会把各U系l的各种lg映射至不同层中,而在我所接触的一些实际项目中设计人员在映这U组件和层间的关pLl常无意中破坏了层结构的依赖关系U束?/div>

 

图表 1 典型分层l构

设计中的常见问题
问题一:数据传输对象QDTOQ是否应该属于业务层Q?/font>
在J2EE开发的l典著作《Core J2EE Patterns》中数据传输对象被划分在业务层模式中Q那么是否数据传输对象应该被映射C务层呢?
数据讉K对象QDAOQ在该著作中是被映射到整合层的,q样׃出现一个违反层依赖U束的问题,因ؓ数据讉K对象是要依赖于数据传输对象的Q因此下层就会出现对上层的依赖了?/div>
所以本为DTO是在各层中传输数据的Q我们可以不必强求的把他们映到上述层次中,可以把他们放|在一个公共包中?/div>
 
问题?使用POJO作业务对象的轻量U架构与上述层模型的映射
在用POJO的轻量l构中我们通常会用持久化框架Q如Hibernate/JPAQ同时会在架构中引入仓库对象(Repository Object)Q负责业务对象的获取和保存。(注意Q他的功能和DAO是有区别的,仓库对象中通常只应包括业务对象的获取和保存逻辑Q?/div>
通常设计人员会把业务对象映射至业务层Q而将仓库对象映射x合层。由于仓库对象对于业务对象的依赖关系׃破坏依赖关系U束Q所以这U映方式显然不正确?/div>
下图是作者推荐的映射方式

 

图表 2 轻量U架构参考模?/font>

 
可以看到业务对象和仓库对象都被映至业务层,而持久化框架被映到了整合层?/div>
 
ȝ

因此大家在设计过E中不要仅仅分层结构留于Ş式,而要时刻注意设计是否W合q种架构模式Q这h能真正发挥这U架构模式的优势?/span>

 

JavaEE 咨询N
SCEA (1.2&5.0)
IBM Certified Solution Designer for OOA&D UML2


越巅峰 2008-03-19 21:48 发表评论
]]>l于通过了SCEA5 Beta版的考试http://www.tkk7.com/chaocai/archive/2008/02/20/180768.html越巅峰越巅峰Wed, 20 Feb 2008 01:25:00 GMThttp://www.tkk7.com/chaocai/archive/2008/02/20/180768.htmlhttp://www.tkk7.com/chaocai/comments/180768.htmlhttp://www.tkk7.com/chaocai/archive/2008/02/20/180768.html#Feedback2http://www.tkk7.com/chaocai/comments/commentRss/180768.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/180768.html 1 选择Q基知识
2 设计Q?br /> 3 {?br /> 感觉Beta版比正式版难度大多了Q题目数量特别多。而且设计题难度也大?br />


越巅峰 2008-02-20 09:25 发表评论
]]>
如何在程序中直接使用Spring的工Lhttp://www.tkk7.com/chaocai/archive/2007/12/26/Spring.html越巅峰越巅峰Wed, 26 Dec 2007 09:38:00 GMThttp://www.tkk7.com/chaocai/archive/2007/12/26/Spring.htmlhttp://www.tkk7.com/chaocai/comments/170651.htmlhttp://www.tkk7.com/chaocai/archive/2007/12/26/Spring.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/170651.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/170651.html
Spring中存在大量的工具c,如:RMI相关的。Spring所提供?RMI的支持大大简化了RMI的开发难度,不过通常我们都是采用配置的方式,通过标准的spring bean来用它们,q样虽然化了开发,但是也限制了一些灵zL。因为bean的属性都是在配置时设定的Q如RMI客户端中的服务的URLQ,而有时我 们需要在q行时生成这些属性,q时其实只要我们直接使用q些工具cd可以了?/div>
要在E序中直接用RmiProxyFactoryBeanQ我们就必须了解spring是如何用这个类为我们生成客L代理的,然后在程序中使用与spring相同的调用方式?/div>
RmiProxyFactoryBean是一个工厂类Q^时我们通过spring获得的ƈ不是q个工厂cȝ实例Q而是用这个工厂类创徏的proxy的实例,q个cdCspring中标准的FactoryBean接口。FactoryBean接口中定义了三个ҎQ?/div>
getObject()
           Return an instance (possibly shared or independent) of the object managed by this factory.
getObjectType()
           Return the type of object that this FactoryBean creates, or
null if not known in advance.
boolean
isSingleton()
           Is the bean managed by this factory a singleton or a prototype?
我们通过getBean获取q类工厂BeanQ实CFactoryBean接口的BeanQ时Qspringq不会返回工厂类的实例,而是调用工厂cȝgetObjectҎq把Ҏ的返回D回给我们?/div>
q样你就明白了原来我们获得的RMI的Proxy是通过RmiProxyFactoryBean的getObjectҎ生成的?/div>
q时你一定认Z面的E序可以搞定了Q?/div>
              …
RmiProxyFactoryBean proxy=new RmiProxyFactoryBean();           
              proxy.setServiceInterface(Calculator.class);
              proxy.setServiceUrl(url);
              Calculator client=(Calculator)proxy.getObject();         
              System.out.println(client.add(1,1));
              …
q行E序你会发现上面q段E序q不成功Q程序会抛出java.lang.NullPointerException异常?/span>
问题在哪里呢Q研I一下你会发?/span>RmiProxyFactoryBeanq实Cspring?span style="font-size: 10pt;">InitializingBean接口Q接口中包含一个方?code>afterPropertiesSet()Q在所有属性注入完成后spring会调用这个方法,因此上面的程序ƈ没有完全正确的模拟spring的调用过E?/span>
修改代码Q?/span>
RmiProxyFactoryBean proxy=new RmiProxyFactoryBean();           
              proxy.setServiceInterface(Calculator.class);
              proxy.setServiceUrl(url);
              proxy.afterPropertiesSet();
              Calculator client=(Calculator)proxy.getObject();         
              System.out.println(client.add(1,1));
              …
q次l于成功了!

最后,此例告诉大家有时我们可以直接调用spring中的工具c,来完成我们的Ҏ需求,此时要注意的是正模?/span>spring的对bean创徏和调用过E?/span>



越巅峰 2007-12-26 17:38 发表评论
]]>Spring2.5的组件自动搜?/title><link>http://www.tkk7.com/chaocai/archive/2007/12/04/165134.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Tue, 04 Dec 2007 04:50:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2007/12/04/165134.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/165134.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2007/12/04/165134.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/165134.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/165134.html</trackback:ping><description><![CDATA[http://dev2dev.bea.com.cn/blog/chaocai/200712/spring_osgi_04_719.html <img src ="http://www.tkk7.com/chaocai/aggbug/165134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2007-12-04 12:50 <a href="http://www.tkk7.com/chaocai/archive/2007/12/04/165134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade与边界控?/title><link>http://www.tkk7.com/chaocai/archive/2007/10/26/156030.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Fri, 26 Oct 2007 02:00:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2007/10/26/156030.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/156030.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2007/10/26/156030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/156030.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/156030.html</trackback:ping><description><![CDATA[<p>多层l构是J2EE应用开发的基本模式Q很多开发者都会按照多层结构来l织自己的应用(通常分ؓFacadeQApplication Service,DAO{层Q,但是他们往往会选择在不同层上去控制事务和Hibernate Session的边界,可千万不要小看这L选择它会大大影响E序的可l护性和可复用性?br /> 其实在Facade层来控制事务的边界通常都是最佳选择。我们知道Facade层的_粒度接口是直接为用戯求提供相应服务的Q在典型的J2EE环境中通常使用Session Bean来实现Facade层,q且使用CMT。这时如果有的开发h员在其他层次控制了事务如DAOQ由于这些层ơ通常不会采用EJB实现Q所以所使用的事务ؓ容器提供的用L理事务,ҎEJB的事务规范CMT是无法把事务上下文传递到用户理事务的边界中的,׃J2EEq不支持事务的嵌套,所以当来自Facade的CMT事务遇见DAO的事务时Q内部事务将被挂Pq样整个事务的情况,׃和设想的业务逻辑产生很大的差异?br /> q且有时不同业务逻辑的实C复用DAO提供多个ҎQ所以很难控制事务的边界Q导致这些方法难以被复用?br /> 对于Hibernate SessionQ由于存在懒加蝲的问题,所以开发h员常会预见这L异常LazyInitializationException。避免这个问题就要求在关闭session前要装蝲好要使用的对象关pd。而这U逻辑通常只与界面昄内容相关Q如果把session的边界控制放|在DAO或者Application Service中就会业务逻辑的实现要和界面显C逻辑混合在一P我们必须在这些方法中加蝲那些界面昄需要的对象关系域。而界面显C是l常变化的,q且业务逻辑会被多个不同的界面所复用Q如果这样Application ServiceQDAO中方法的复用性就会大大降低?br /> 把这些工作放在离表现层最q的Facade中便可以避免q些问题?br /> 注意在其他层ơ中我们不需要控制session的边界,我们通常采用getCurrentSession()来获得当前事务中的session,Cq个Ҏ必须在事务上下文存在的情况下才可以调用,q且在事务被提交的时候Hibernate会在自动关闭session,所以我们不要显C的关闭session.</p> <img src ="http://www.tkk7.com/chaocai/aggbug/156030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2007-10-26 10:00 <a href="http://www.tkk7.com/chaocai/archive/2007/10/26/156030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWF一个简单工作流引擎[支持spring的版?.3]http://www.tkk7.com/chaocai/archive/2007/10/08/151106.html越巅峰越巅峰Mon, 08 Oct 2007 09:03:00 GMThttp://www.tkk7.com/chaocai/archive/2007/10/08/151106.htmlhttp://www.tkk7.com/chaocai/comments/151106.htmlhttp://www.tkk7.com/chaocai/archive/2007/10/08/151106.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/151106.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/151106.htmlSWF一个简单工作流引擎 你是否已l被像JBPM,XFLow{那L复杂~程和配|搞头昏脑胀Q被他们所依赖的大量jar和容器搞得不知所措?br /> 如果q样p试笔者开发的q个单工作流引擎吧,配置和编E都很简单,也不依赖M容器。支持spring的版本?br /> 下蝲地址Q?br /> http://www.tkk7.com/Files/chaocai/swf-beta-1[1].3-bin.zip
内附用户手册
QSWF开发设计:蔡超Q北京天融信Q?a href="mailto:chaocai2001@yahoo.com.cn">chaocai2001@yahoo.com.cn)
 

?/span>

SWF是一U嵌入式的工作流引擎Q它不需要Q何应用服务器的支持?/span>SWF使用十分单,但却可以满多数程驱动应用的需求。ƈ且支持和Lj2ee框架整合(spring).

本文介绍如何ZSWF开发流E驱动的应用?/span>



越巅峰 2007-10-08 17:03 发表评论
]]>
SWF一个简单工作流引擎http://www.tkk7.com/chaocai/archive/2007/10/08/150983.html越巅峰越巅峰Mon, 08 Oct 2007 02:44:00 GMThttp://www.tkk7.com/chaocai/archive/2007/10/08/150983.htmlhttp://www.tkk7.com/chaocai/comments/150983.htmlhttp://www.tkk7.com/chaocai/archive/2007/10/08/150983.html#Feedback10http://www.tkk7.com/chaocai/comments/commentRss/150983.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/150983.html 如果q样p试笔者开发的q个单工作流引擎吧,配置和编E都很简单,也不依赖M容器。马上会推出支持spring的版本?br /> 下蝲地址Q?br /> http://www.tkk7.com/Files/chaocai/swf-beta-1-bin.zip
内附用户手册
QSWF开发设计:蔡超Q北京天融信Q?a href="mailto:chaocai2001@yahoo.com.cn">chaocai2001@yahoo.com.cn)
 

?/span>

SWF是一U嵌入式的工作流引擎Q它不需要Q何应用服务器的支持?/span>SWF使用十分单,但却可以满多数程驱动应用的需求?/span>

本文介绍如何ZSWF开发流E驱动的应用?/span>



越巅峰 2007-10-08 10:44 发表评论
]]>
Spring集成XFire开发WebServicehttp://www.tkk7.com/chaocai/archive/2007/09/17/145932.html越巅峰越巅峰Mon, 17 Sep 2007 10:01:00 GMThttp://www.tkk7.com/chaocai/archive/2007/09/17/145932.htmlhttp://www.tkk7.com/chaocai/comments/145932.htmlhttp://www.tkk7.com/chaocai/archive/2007/09/17/145932.html#Feedback4http://www.tkk7.com/chaocai/comments/commentRss/145932.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/145932.htmlSpring是目前最行?/span>JavaEE FrameworkQ但是?/span>Spring?/span>Spring-WS开?/span>WebService却十分繁琐?/span>XFire是一个简?/span>WebService开发的开源项目,通过Spring?/span>XFire的结合可以大大简化基?/span>Spring Framework的应用中?/span>WebService开发?/span>

Spring?/span>XFire可以通过多种方式l合Q下文介l的是笔者常用的一U简单而实用的Ҏ。所用的Spring版本?/span>2.0,XFire版本?/span>1.2.6?/span>

1 配置XFire Servlet

?/span>web.xml中加入如下配|:

<servlet>

    <servlet-name>XFireServlet</servlet-name>

  

    <servlet-class>

        org.codehaus.xfire.spring.XFireSpringServlet

    </servlet-class>

 </servlet>

 <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/servlet/XFireServlet/*</url-pattern>

 </servlet-mapping>

 <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

 </servlet-mapping>

2 配置Spring的监听器Q同Zspring?/span>Web目一?/span>Spring的监听器是必不可的?/span>

    <context-param>

        <param-name>contextConfigLocation</param-name>

       <param-value>

            classpath:org/codehaus/xfire/spring/xfire.xml,

            /WEB-INF/applicationContext.xml

       </param-value>

    </context-param>

<listener>

 <listener-class>

    org.springframework.web.context.ContextLoaderListener

 </listener-class>

</listener>  

以下是完整的web.xml配置文g

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

    xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   

    <context-param>

        <param-name>contextConfigLocation</param-name>

       <param-value>

            classpath:org/codehaus/xfire/spring/xfire.xml,

            /WEB-INF/applicationContext.xml

       </param-value>

    </context-param>

<listener>

 <listener-class>

    org.springframework.web.context.ContextLoaderListener

 </listener-class>

</listener>  

 <servlet>

    <servlet-name>XFireServlet</servlet-name>

  

    <servlet-class>

        org.codehaus.xfire.spring.XFireSpringServlet

    </servlet-class>

 </servlet>

 <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/servlet/XFireServlet/*</url-pattern>

 </servlet-mapping>

 <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

 </servlet-mapping>

</web-app>

3 定义接口及实现服?/span>

定义接口Q这个接口中定义要通过WebService暴露的方?/span>

package org.ccsoft;

publicinterface HelloWS {

    public String sayHello(String sb);

}

实现服务

package org.ccsoft;

publicclass HelloWSImp implements HelloWS {

    public String sayHello(String sb) {

       // TODO Auto-generated method stub

       return"Hello "+sb;

    }

}

4 配置服务

上文中实现的服务,加入?/span>spring的配|文件中?/span>

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="helloWS" class="org.ccsoft.HelloWSImp"/>

    <bean name="helloService" class="org.codehaus.xfire.spring.ServiceBean">

    <property name="serviceBean" ref="helloWS"/>

    <property name="serviceClass" value="org.ccsoft.HelloWS"/>

    <property name="inHandlers">

      <list>

        <ref bean="addressingHandler"/>

      </list>

    </property>

</bean>

       <bean id="addressingHandler" class="org.codehaus.xfire.addressing.AddressingInHandler"/>

</beans>

好了现在你可以通过http://127.0.0.1:8080/XFireWS1/services/HelloWS?wsdl来验证是否部|成功了?/span>

————————————————————————————————————?/span>

?/span> ?/span>
SCEA Q?/span> SCBCD Q?/span> MCSD
IBM Certified Specialist RUP
IBM Certified Solution Designer OOA&D UML v2
北京天融信Y件架构师
SUN,Microsoft培训中心牚w高端教师
常年提供架构咨询服务
chaocai2001@yahoo.com.cn Q?/span> 010-82776427



越巅峰 2007-09-17 18:01 发表评论
]]>
EJB中用Hibernate的几个问题L?http://www.tkk7.com/chaocai/archive/2007/08/19/137973.html越巅峰越巅峰Sun, 19 Aug 2007 11:44:00 GMThttp://www.tkk7.com/chaocai/archive/2007/08/19/137973.htmlhttp://www.tkk7.com/chaocai/comments/137973.htmlhttp://www.tkk7.com/chaocai/archive/2007/08/19/137973.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/137973.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/137973.html    SessionContext sessionContext;
    SessionFactory sf;
    public void setSessionContext(SessionContext sessionContext) {
        this.sessionContext = sessionContext;
        try {
            InitialContext ctx = new InitialContext();
            sf=(SessionFactory) ctx.lookup("java:/hibernate/SessionFactory");
        } catch (NamingException ex) {
            ex.printStackTrace();
        }
    }
    public void tran(){
        tran1();
        tran2();
       
    }
    public void tran1() {
        Session session=sf.getCurrentSession();
        Message msg=new Message();
        msg.setCreateTime(new Date());
        msg.setDetail("trans1");
        session.save(msg);
        System.out.println("Session:"+session.hashCode());
        session.flush();
        session.close();
    }
    public void tran2() {
      Session session=sf.getCurrentSession();
      Message msg=new Message();
      msg.setCreateTime(new Date());
      msg.setDetail("trans2");
      session.save(msg);
       System.out.println("Session:"+session.hashCode());
    //  throw new RuntimeException("wrong");
  }
……
}
注:EJB采用CMTQ各Ҏ的事务属性是required
客户端调用tran以上代码可以正确q行吗?
如果把tran1中的sf.getCurrentSession();改ؓsf.openSession()可以正确q行吗?
辨析Q?br>1 上述代码是不能正运行的Q运行tran2时会抛出异常Q告诉你session is closed.
其实q是应ؓgetCurrentSession()会用环境已有的SessionQ同时注意getCurrentSession()要在事务的环境中使用?br>q是也许你一定会问,那么什么时候关闭Session呢?{案是事务完成的时候(提交或是回滚Q?br>
2 如果上述代码tran1中的sf.getCurrentSession();改ؓsf.openSession()代码可以正运行。这是因为openSession()每次都会q回一个新的Session。而在tran2U的sf.getCurrentSession()q不会用tran1中的session,而是会用当前事务环境中的默认的session.
也许你会问如果tran2U的调用抛出RuntimeExceptionQtran1所作的操作q可以回滚吗Q?br>{案是仍然可以回滚的.


蔡超
北京天融?软g架构?br>SCEAQSCBCDQMCSD
IBM Certified Specialist RUP v2003
IBM Certified Solution Designer OOA&D UMLv2


越巅峰 2007-08-19 19:44 发表评论
]]>
Spring构徏应用pȝ的最x构与模式实践Q?Q?http://www.tkk7.com/chaocai/archive/2007/05/08/115937.html越巅峰越巅峰Tue, 08 May 2007 06:25:00 GMThttp://www.tkk7.com/chaocai/archive/2007/05/08/115937.htmlhttp://www.tkk7.com/chaocai/comments/115937.htmlhttp://www.tkk7.com/chaocai/archive/2007/05/08/115937.html#Feedback1http://www.tkk7.com/chaocai/comments/commentRss/115937.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/115937.htmlSCEAQSCBCDQMCSDQIBM RUP Specilist
北京天融信Y件架构师
SUN,Microsoft培训中心牚w高端教师
常年提供架构咨询服务
chaocai2001@yahoo.com.cn Q?10-82776427

引言
在用Spring构徏应用时和采用EJB构徏应用一样同样也存在不少常用模式和最佛_践,当然很多Core J2EE Pattern仍然是我们构建spring应用中的优秀模式Q不q有的也不再适用了(如:IoC的应用得Service Locator不再适用QHibernate取代Entity Bean使得DTO不再适用{)?br>下文是一些在以Spring为核心的架构中的常见模式和架构最佛_c?br>



图表 1 Spring应用常见架构模式列表
DAO模式
虽然采用了诸如Hibernateq样的O/R Mapping工具或是iBatesq样的SQL Mapping工具但是采用DAO模式仍有相当好处?br>在实际应用中我们怼遇到如下问题Q?br>1 性能问题Q由于性能问题我们可能要改变数据访问方式,如采用JDBC替换Hibernateq时Q这时如果采用了DAO模式Q数据访问被有效的封装和业务逻辑完全分离Q易于实现替换?br>2 UL问题Q需要支持多U数据库QDAO模式仍然是一U稳妥的选择。虽然诸如Hibernate及iBates也提供很好的数据库无x,但如果用某些数据库的特D功能时Q就会出现问题?br>当然Q对于是否采用DAO模式也不可一概而论Q应Z毕竟会增加应用的开发复杂性。个为很关键的一个判定条件是业务逻辑是否会和持久化逻辑混合?br>
Application Service模式
装一定的业务逻辑和功能,提高复用性,即防止Fa&ccedil;ade和业务对象的臃肿。注意在此可以应用Command模式及Strategy模式提供pȝ可维护性和可扩展性?br>q个模式很重要,但常常被大家忽略Q这时应为我们常会把逻辑攑֜Fa&ccedil;ade中,其实q是很错误的。例如:我们可能会提供多U不同Fa&ccedil;ade以适应不同的访问方式,q样׃出现大量重复的业务逻辑代码?br>
Fa&ccedil;ade模式
为客L提供讉K业务lg的统一模式。便于实现对不同讉K方式的支持(如:q程或本圎ͼ。特别在q程调用旉过暴露_粒度的接口Q提高系l的性能?br>同时Q可以根据客L不同Q通过不同Fa&ccedil;ade来控制客L操作?

越巅峰 2007-05-08 14:25 发表评论
]]>
Spring POJO真的比无状体的会话EJBQSLSBQ快吗?http://www.tkk7.com/chaocai/archive/2007/03/29/107140.html越巅峰越巅峰Thu, 29 Mar 2007 02:29:00 GMThttp://www.tkk7.com/chaocai/archive/2007/03/29/107140.htmlhttp://www.tkk7.com/chaocai/comments/107140.htmlhttp://www.tkk7.com/chaocai/archive/2007/03/29/107140.html#Feedback5http://www.tkk7.com/chaocai/comments/commentRss/107140.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/107140.html 目前Q很多h都认?/span> spring 不论在那个方面都会比 SLSB 有更高的效率Q真的是q样吗?

spring 中的 POJO 的生命周期可以是 Singlton 或每h创徏Q或?/span> 2.0 支持?/span> session ?/span> application,request {范_Q?/span> SLSB 是通过实例池经心管理的。如?/span> spring POJO 不采?/span> singlton 的Ş式那么就需要承受创建和销?/span> POJO 的消耗,当然 SLSB 的出池和入池同样会有同步的消耗,׃现在的虚拟机对象的创建和消耗速度大幅提高所以不一定比 SLSB 获取的速度慢,但是如果每个对象构徏的资源消耗很大如L需要构建或初始化复杂对象,那么 SLSB 的速度昄有优ѝ如?/span> spring 采用 singleton 模式Q那么其中如果需要同步,则虽然省M创徏和销毁的消耗,但是大量的同步会使性能的杀手。ƈ且在?/span> CPU 的服务器上没有同步的多线Eƈ行效果更好(可以在不同的处理器上单独q行Q?/span>



越巅峰 2007-03-29 10:29 发表评论
]]>
EJB3使用注意Q?Q?http://www.tkk7.com/chaocai/archive/2007/03/27/106770.html越巅峰越巅峰Tue, 27 Mar 2007 13:33:00 GMThttp://www.tkk7.com/chaocai/archive/2007/03/27/106770.htmlhttp://www.tkk7.com/chaocai/comments/106770.htmlhttp://www.tkk7.com/chaocai/archive/2007/03/27/106770.html#Feedback0http://www.tkk7.com/chaocai/comments/commentRss/106770.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/106770.html 1 MDB可以通过@Timeout或实?/span>java.ejb.TimedObject 来实现定时回?/span>

2 EJB3 规范要求在部|?/span> EJB 时必ȝ定到各业务接口的全限定名上,最l可?/span> JNDI 查找

如: ctx.lookup(TaxRate.class.getName());

3  @Remove 表示 SFSB 中的删除ҎQ如果存?/span> @PreDestory 则在其后执行

4 会话 Bean 不实?/span> SessionBean 接口Q?/span> MDB 不必实现 MessageDerivenBean Q只要通过 @Annotation 标明或在部v文g中说明?/span>

5 EJBContext 中加入了 lookup ҎQ用于查扑֒ Bean l带?/span> JNDI ?/span>



越巅峰 2007-03-27 21:33 发表评论
]]>
Spring2 AOP在用XML配置时如何获得target及JoinPointhttp://www.tkk7.com/chaocai/archive/2007/02/26/100790.html越巅峰越巅峰Mon, 26 Feb 2007 09:57:00 GMThttp://www.tkk7.com/chaocai/archive/2007/02/26/100790.htmlhttp://www.tkk7.com/chaocai/comments/100790.htmlhttp://www.tkk7.com/chaocai/archive/2007/02/26/100790.html#Feedback1http://www.tkk7.com/chaocai/comments/commentRss/100790.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/100790.html 蔡超

Q?/span> SCEA Q?/span> MCSD Q?/span> IBM RUP Specialist Q?/span>

Spring Reference 中介l如何在采用 @AspectJ 方式在剖面中如何获取 target ?/span> JoinPoint q给ZCZQ但q没有给出采?/span> XML 配置方式时介l及CZQ下面附上一个简单的例子供大家参考?/span>

package aop;

 

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

 

/**

 * @author Administrator

 *

 * TODO To change the template for this generated type comment go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

public class LogAdvice1 {

       public void log(JoinPoint jp,MathImp imp){

 

              System.out.println("log:"+imp+" "+jp.toLongString());

             

       }

}

 

/*

 * Created on 2006-11-1

 *

 * TODO To change the template for this generated file go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

package aop;

 

/**

 * @author Administrator

 *

 * TODO To change the template for this generated type comment go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

public class MathImp /*implements Math*/{

 

       /* (non-Javadoc)

        * @see aop.Math#add(int, int)

         */

       public void add(int op1, int op2) {

              // TODO Auto-generated method stub

             

       }

 

       /* (non-Javadoc)

        * @see aop.Math#addtest(int, int)

        */

       public void addtest(int op1, int op2) {

              // TODO Auto-generated method stub

             

       }

 

       /* (non-Javadoc)

        * @see aop.Math#sub(int, int)

         */

       public void sub(int op1, int op2) {

              // TODO Auto-generated method stub

             

       }

 

}

 

配置Q?/span>

<beans xmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:aop="http://www.springframework.org/schema/aop"

      xsi:schemaLocation="

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

 

   <!-- this is the object that will be proxied by Spring's AOP infrastructure -->

   <bean id="mathImp" class="aop.MathImp"/>

 

   <!-- this is the actual advice itself -->

   <bean id="logger" class="aop.LogAdvice1"/>

 

   <aop:config>

      <aop:aspect ref="logger">

 

         <aop:pointcut id="addLog"

                    expression="execution(* aop.MathImp.*(..)) and target(imp) and JoinPoint(jp)"  />

 

         <aop:before pointcut-ref="addLog"

                  method="log" arg-names="jp,imp" />

 

      </aop:aspect>

   </aop:config>

 

</beans>

package aop;

 

import org.springframework.context.support.AbstractApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

 

/**

 * @author Administrator

 *

 * TODO To change the template for this generated type comment go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

public class Test {

 

       public static void main(String[] args) {

              AbstractApplicationContext context=new FileSystemXmlApplicationContext("aop2.xml");

              //Math math=(Math) context.getBean("math");

              MathImp math=(MathImp) context.getBean("mathImp");

              math.add(1,2);

              math.addtest(3,4);

              math.sub(5,6);

       }

}



越巅峰 2007-02-26 17:57 发表评论
]]>
Spring2.0与Hibernate3整合http://www.tkk7.com/chaocai/archive/2007/02/05/98070.html越巅峰越巅峰Mon, 05 Feb 2007 09:15:00 GMThttp://www.tkk7.com/chaocai/archive/2007/02/05/98070.htmlhttp://www.tkk7.com/chaocai/comments/98070.htmlhttp://www.tkk7.com/chaocai/archive/2007/02/05/98070.html#Feedback5http://www.tkk7.com/chaocai/comments/commentRss/98070.htmlhttp://www.tkk7.com/chaocai/services/trackbacks/98070.html阅读全文

越巅峰 2007-02-05 17:15 发表评论
]]>
EJB3使用注意Q?Q?/title><link>http://www.tkk7.com/chaocai/archive/2007/02/03/97807.html</link><dc:creator>越巅峰</dc:creator><author>越巅峰</author><pubDate>Sat, 03 Feb 2007 15:20:00 GMT</pubDate><guid>http://www.tkk7.com/chaocai/archive/2007/02/03/97807.html</guid><wfw:comment>http://www.tkk7.com/chaocai/comments/97807.html</wfw:comment><comments>http://www.tkk7.com/chaocai/archive/2007/02/03/97807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/chaocai/comments/commentRss/97807.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/chaocai/services/trackbacks/97807.html</trackback:ping><description><![CDATA[ <p>1 java.rmi.RemoteException<br />׃EJB3中的q程接口没有间接或直接的基础Remote接口Q也不需要抛出RemoteException异常Q所以客L所接受到的都是EjbException?/p> <p>2 ServiceLocator模式<br />׃EJB3中省MHome接口Q所以如果用ServiceLocator模式会出现异常,同一JNDI每次获得都会是同一对象即便是有状态的Bean<br /><br />3 Stateful Session Bean<br />׃EJB3中省MHome接口QJNDI lookupq回的是一个Session Bean的对象,而不是HomeQ所以EJB3的Spec中规定每ơJNDI lookup<br />都应该返回一个新的实例。(注意以上q点在一些版本的JBOSS EJB3的实C都存在BUGQ?br /><br /> <br /><br /></p> <img src ="http://www.tkk7.com/chaocai/aggbug/97807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/chaocai/" target="_blank">越巅峰</a> 2007-02-03 23:20 <a href="http://www.tkk7.com/chaocai/archive/2007/02/03/97807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www-15706.com" target="_blank">gayˬˬƵ</a>| <a href="http://imfever.com" target="_blank">avպavվ</a>| <a href="http://cqtchtwq.com" target="_blank">ѾƷԲ߹ۿ</a>| <a href="http://miliwo.com" target="_blank">Ů18ëƬˮѹۿ</a>| <a href="http://hn-hshb.com" target="_blank">ĻAVһ</a>| <a href="http://shyangpuks.com" target="_blank">ϣӰԺѹۿƵ</a>| <a href="http://phlinhng.com" target="_blank">˾þô߽</a>| <a href="http://www44xixi.com" target="_blank">һӰ߿Ƭ</a>| <a href="http://mysb123.com" target="_blank">AV뾫Ʒ</a>| <a href="http://yy1288.com" target="_blank">aëƬƵۿ</a>| <a href="http://kssijia.com" target="_blank">AVһһ </a>| <a href="http://25gh.com" target="_blank">99ƷƵۿ</a>| <a href="http://pencilinside.com" target="_blank">AVר4SE </a>| <a href="http://zhaosifuwang.com" target="_blank">޻ɫ߹ۿ</a>| <a href="http://oupur.com" target="_blank">޵һҳ߲</a>| <a href="http://gwcyy.com" target="_blank">ëƬѹۿվ</a>| <a href="http://dqmovie.com" target="_blank">ۺŷ㻨</a>| <a href="http://3x79.com" target="_blank"></a>| <a href="http://woaisouluo.com" target="_blank">ҹƷţӰ </a>| <a href="http://cn-taoqigui.com" target="_blank">˾Ʒҹapp</a>| <a href="http://yy6653.com" target="_blank">þþƷAVDz18</a>| <a href="http://438266.com" target="_blank">ҹ˽ӰԺ</a>| <a href="http://woaisouluo.com" target="_blank">ŮƵһ</a>| <a href="http://zdmaid.com" target="_blank">޺Ʒһ </a>| <a href="http://slotvip24.com" target="_blank">ѾƷþþþþĻ </a>| <a href="http://sdsupuchem.com" target="_blank">ҹӰ߹ۿ</a>| <a href="http://szjmlr.com" target="_blank">ĻӰԺַ</a>| <a href="http://xsdin.com" target="_blank">һaƬػ߹ۿѿ</a>| <a href="http://fns92.com" target="_blank">޳ɫۺվ</a>| <a href="http://dsdkg.com" target="_blank">Ʒһ</a>| <a href="http://xixidhw.com" target="_blank">˾޾ƷӰԺ߹ۿ</a>| <a href="http://ccc321.com" target="_blank">޹ƷƷ </a>| <a href="http://5656ys.com" target="_blank">ðѹۿվ</a>| <a href="http://556228.com" target="_blank">޹++ۺ</a>| <a href="http://manghuo365.com" target="_blank">ɬɬɬƵ߹ۿ </a>| <a href="http://ivr69.com" target="_blank">ԻȫƵվ</a>| <a href="http://by22877.com" target="_blank">պ޹ۺϸ</a>| <a href="http://carsmp.com" target="_blank">Ļպ</a>| <a href="http://xuanzhicity.com" target="_blank">91㽹߹ۿ</a>| <a href="http://77tok.com" target="_blank">ɫۺ</a>| <a href="http://xxxxnii.com" target="_blank">պAvҹҹˬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>