??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲精品网站,在线天堂av,亚洲一级二级三级http://www.aygfsteel.com/calvin/category/2823.html之射杀钢琴?/description>zh-cnTue, 17 Apr 2007 14:05:55 GMTTue, 17 Apr 2007 14:05:55 GMT60ActiveMQ4.1+Spring2.0的POJO JMSҎQ上Q?http://www.aygfsteel.com/calvin/archive/2006/12/01/84801.html江南白衣江南白衣Fri, 01 Dec 2006 04:28:00 GMThttp://www.aygfsteel.com/calvin/archive/2006/12/01/84801.htmlhttp://www.aygfsteel.com/calvin/comments/84801.htmlhttp://www.aygfsteel.com/calvin/archive/2006/12/01/84801.html#Feedback4http://www.aygfsteel.com/calvin/comments/commentRss/84801.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/84801.html[摘要]SpringSide 2.0采用了ActiveMQ 4.1-incubator-SNAPSHOT 与Spring 2.0 集成Q比SS1.0M3版本有三个值得留意的特点,使得代码中几乎不见一丝JMS的R入代码?br />
全文地址Q?a >http://blog.csdn.net/calvinxiu/archive/2006/12/01/1423943.aspx



江南白衣 2006-12-01 12:28 发表评论
]]>
XFire 最新生火指南(上)http://www.aygfsteel.com/calvin/archive/2006/11/24/83233.html江南白衣江南白衣Fri, 24 Nov 2006 05:23:00 GMThttp://www.aygfsteel.com/calvin/archive/2006/11/24/83233.htmlhttp://www.aygfsteel.com/calvin/comments/83233.htmlhttp://www.aygfsteel.com/calvin/archive/2006/11/24/83233.html#Feedback3http://www.aygfsteel.com/calvin/comments/commentRss/83233.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/83233.html  [摘要]    XFire 是全球众多牛人在与axispdҎ后一致投的选择。,但网上的文档与例子L不新Q大家抛开所有的文档Q所有的Axis习惯Q单看这份代表XFire1.2.2最U做法的文档?a href="/calvin/" _fcksavedurl="http://www.aygfsteel.com/calvin/">

全文地址Q?a >http://blog.csdn.net/calvinxiu/archive/2006/11/24/1411678.aspx



江南白衣 2006-11-24 13:23 发表评论
]]>
q学琼林--Spring下的单元试要点http://www.aygfsteel.com/calvin/archive/2006/10/23/76685.html江南白衣江南白衣Mon, 23 Oct 2006 01:23:00 GMThttp://www.aygfsteel.com/calvin/archive/2006/10/23/76685.htmlhttp://www.aygfsteel.com/calvin/comments/76685.htmlhttp://www.aygfsteel.com/calvin/archive/2006/10/23/76685.html#Feedback4http://www.aygfsteel.com/calvin/comments/commentRss/76685.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/76685.html    今天复习了一?造福无数人Spring2.0 参考手册翻?-W??试Q浓~即_֍的更CSpringSide wiki中的--Spring下的单元试要点?br>
    全文地址Q?a >http://blog.csdn.net/calvinxiu/archive/2006/10/23/1346178.aspx



江南白衣 2006-10-23 09:23 发表评论
]]>
当Spring遇到Rubyhttp://www.aygfsteel.com/calvin/archive/2006/04/08/40009.html江南白衣江南白衣Sat, 08 Apr 2006 09:17:00 GMThttp://www.aygfsteel.com/calvin/archive/2006/04/08/40009.htmlhttp://www.aygfsteel.com/calvin/comments/40009.htmlhttp://www.aygfsteel.com/calvin/archive/2006/04/08/40009.html#Feedback0http://www.aygfsteel.com/calvin/comments/commentRss/40009.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/40009.html阅读全文

江南白衣 2006-04-08 17:17 发表评论
]]>
Message Driven POJOhttp://www.aygfsteel.com/calvin/archive/2006/03/25/37356.html江南白衣江南白衣Sat, 25 Mar 2006 09:04:00 GMThttp://www.aygfsteel.com/calvin/archive/2006/03/25/37356.htmlhttp://www.aygfsteel.com/calvin/comments/37356.htmlhttp://www.aygfsteel.com/calvin/archive/2006/03/25/37356.html#Feedback2http://www.aygfsteel.com/calvin/comments/commentRss/37356.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/37356.html阅读全文

江南白衣 2006-03-25 17:04 发表评论
]]>
启动SpringSide--Promatic Enterprise Application KickStart目http://www.aygfsteel.com/calvin/archive/2006/01/02/26347.html江南白衣江南白衣Mon, 02 Jan 2006 09:47:00 GMThttp://www.aygfsteel.com/calvin/archive/2006/01/02/26347.htmlhttp://www.aygfsteel.com/calvin/comments/26347.htmlhttp://www.aygfsteel.com/calvin/archive/2006/01/02/26347.html#Feedback74http://www.aygfsteel.com/calvin/comments/commentRss/26347.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/26347.html作者:江南白衣   

    SpringSide--Pragmatic Enterprise Application KickStart and Common Library StackQ这么长的一个名字下来,不用解释大家都知道是做什么的?---以Spring Framework为coreQ提供一个Pragmatic的企业应用开发基和最佛_践展C?br />
   定位Q?/strong>Z用Spring框架的开发者提供一个非Demo版的复杂、正式而体现最佳用实늚参照pȝ?

   目标Q?/strong>囊括JavaEE必须面­对的所有问题的合理的、合乎实跉|准的解决ҎQ采用Plugins形式l织Q开发者可快速定位所需的参考方案ƈ做加法到自己的系l?br /> 
    目|站Q?a >http://www.springside.org.cn 
    or http://springside.sourceforge.net
  
    1. Featrue List   


  •  
        2. SpringSide与Appfuse有什么不同?
        1.SpringSide较完整的演示了企业应用的各个主题Q而Appfuse只有单的登陆界面和用L理?br />
        2.SpringSide是深受Ruby on Rails影响的Pragmatic型的Ҏ?br />
        3.Appfuse主要目的是展C各式mvc、ormҎ与Spring的结合,有些技术属于高手玩P?a >SpringSide展示的是一个国内项目的实际形态,q带中文手册与大量中文代码注?br />
        4. 脚本l节
      SpringSide的基本结构是JDK1.4 + Spring 2.0 + hibernate3 + Spring MVC multi-action + JSP2.0?br designtimesp="10590" />
        使用 XFire提供WebService订书的服务端接口?Java?.Net版的客户端示范代码?br designtimesp="10593" />
        店员是个D的学生,所以系l会为每张订单发一通知邮gl店员。ؓ了不影响֮下单的速度Q发信的动作由jms异步q行?br designtimesp="10595" />   
        pȝq会?a designtimesp="10597"> Quartz定时扫描~的图书,用邮仉知店员?br designtimesp="10598" />    
        老板只负责看一些色彩丰富,带图的报表。Eclipse Birt2.0提供日常报表 Q?a designtimesp="10600"> Openi提供BI OLAP的?br designtimesp="10601" />
        ZLucene?a designtimesp="10604"> Compass做的图书全文搜烦?br designtimesp="10605" />
        Z Drools规则引擎的订单满100元免q费Q会员积分制{。     ?br designtimesp="10608" />
        店面演示Ajax效果?a designtimesp="10610"> OSCache的Web CacheQ?a target="_blank" designtimesp="10611">SiteMesh的渲染效果用?

        一些非关键业务Q用 Groovy动态语a来快速开发?br designtimesp="10615" />
        log4jpȝ重要操作员日志异步写入数据库,使它们可理?br designtimesp="10618" />
        l合?a target="_blank" designtimesp="10620">Acegi i安全权限理?br designtimesp="10621" />
        utf-8, i18n的国际化目?

       ServiceMix QWorkFlow的故事设计中?br />
        5. RoadMap
        Road Map in  JIRA Issue Checker ,Ƣ迎大家提出更多Topic
        .
        6. 团队成员列表 (排名按加入顺?
       
         Ƣ迎朋友们加入。h多速度快是很重要的事情?br />
       参加方式?U?br />   1.帮忙codereview提意?br />   2.?u>JIRA里面领Q?br />   3.?font color="#0000ff">JIRA 提出CQ务?br />
      真正贡献了力量的同志自然会成为开发h?

       
        Team WorkerQ?br />     江南白衣QcacQ@_@QwuyuQcharlse, efaQyimlin  
         ContributorQ?/strong>
         water ye QtotodoQdavid.turingQpesomeQoofrank
      
         长老供奉:
          庄表伟,Robbin

         (排名按加入时_

    7. 交流?/strong>

  • 演示站点
  • 开发RoadMap
  • Spring中文论坛专区
  • 团队开发日?

    开发者QQ:15690287 (only for Springside developer)
    用户QQ? 21601442


  • 江南白衣 2006-01-02 17:47 发表评论
    ]]>
    在厨房,车顶Q草C使用Springhttp://www.aygfsteel.com/calvin/archive/2005/12/30/26015.html江南白衣江南白衣Fri, 30 Dec 2005 02:40:00 GMThttp://www.aygfsteel.com/calvin/archive/2005/12/30/26015.htmlhttp://www.aygfsteel.com/calvin/comments/26015.htmlhttp://www.aygfsteel.com/calvin/archive/2005/12/30/26015.html#Feedback7http://www.aygfsteel.com/calvin/comments/commentRss/26015.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/26015.html   作者:江南白衣    

        Spring再强大,也要面对降的问?-因ؓSpring不是Weblogic、Tomcat般的层容器QServlet和EJB对象不由它创建,所以它必须要降临到Weblogic、Tomcat所在的位面?BR>     初学者一般不用管那么多,照着Spring+hibernate+Struts之类的Sample做了,但慢慢的Q也许就要开始在jsp+javabean体系Q土制框Ӟsingletoncȝ环境下用Spring了?BR>     《Professional Java Development with the Spring Framework》第3章有"Managing the Containe"一节讲q个问题。一般可以分为直接召唤系与IoC fashion两类?BR>
         1.直接召唤p?-Singleton的Application Context
          最单的Q就像在UnitTest里那P直接构造Application ContextQ?/P>
    ApplicationContext ctx = new ClasspathXmlApplicationContext("ApplicationContext.xml");

        
          在Web环境里,会用ContextLoader构造ApplicationContext后,压进Servlet Context?BR>      由ContextLoaderListener或ContextLoaderServletQ在Web应用启动时完成?BR>      然后在Jsp/Servelet中,可以通过Servlet Context取得ApplicationContextQ?
    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(application);

         
          但像singletoncL者EJB中,没有Servlet Context可用了?BR>      如果全部像UnitTest那样直接构造,速度׃很不堪。自然的Q就惛_把ApplicationContext做成单例?nbsp;
          Spring提供?SPAN class=fixed>ContextSingletonBeanFactoryLocatorq样的物体?BR>      先搞一个beanRefFactory.xmlQ里面写上所有的applcationContext-*.xml文g名,q把Context命名?default-context"Q?
    <beans>
      
    <bean id="default-context"  class="org.springframework.context.support.ClassPathXmlApplicationContext">
        
    <constructor-arg>
          
    <list> <value>applicationContext.xml</value></list>
        
    </constructor-arg>
      
    </bean>
    </beans>

      然后让loactorL它,但代码有炚wQ?
    BeanFactoryReference bfr =  DefaultLocatorFactory.getInstance().useBeanFactory("default-context");
    BeanFactory factory = bfr.getFactory();
    MyService myService 
    = factory.getBean("myService");
    bfr.release();
    // now use myService


        上面的代码实在是太灵z,太麻烦了?BR>    q不如自己实C个简单的SingletonQ扩展ContextLoaderListenerc,在Webpȝ启动时压入Singleton?BR>
       
    新的ContextLoaderListenerc重载如下,ContextUtil中包含一个静态的ApplicationContext变量Q?BR>
        public void contextInitialized(ServletContextEvent event)
        {
            
    super.contextInitialized(event);

            ServletContext context 
    = event.getServletContext();
            ApplicationContext ctx 
    = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
            ContextUtil.setContext(ctx);
        }

       用家可直接取用:
     ApplicationContext context = ContextUtil.getContext();


    2.IoC fashion
        如果所有地斚w使用直接召唤p,那就反而是在打Rod的耛_了。因Z一直都反对代码与框架深耦合的?BR>    所以,更好的方法是写一些glue code、base class来完成Spring的降_而不让应用代码察觉Spring Application Context的存在?BR>    不过Q因为各个框架的l构不同QRod也没办法讲出一个通用的整合方法,所以徏议大家尽量学习已整合的各U框Ӟ如Spring MVC、Struts的种U方式,写出自己的简单整合代码来?BR>
        只有不确定的调用某些Singletonc,不适合q早ioc的情况,可以使用直接召唤pR?BR>

    江南白衣 2005-12-30 10:40 发表评论
    ]]>
    Spring下的Unit TestW记http://www.aygfsteel.com/calvin/archive/2005/09/21/13628.html江南白衣江南白衣Wed, 21 Sep 2005 04:09:00 GMThttp://www.aygfsteel.com/calvin/archive/2005/09/21/13628.htmlhttp://www.aygfsteel.com/calvin/comments/13628.htmlhttp://www.aygfsteel.com/calvin/archive/2005/09/21/13628.html#Feedback5http://www.aygfsteel.com/calvin/comments/commentRss/13628.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/13628.html     作者:江南白衣  

         注重实效的TDD的确能加快,而不是拖慢开发的q度Q片面的q求覆盖率的全面UnitTest不在此列Q?BR>      一Q可以实现真正分层开发?BR>      二,不需要依赖和频繁重启Web Container?BR>      三,手工试M免改动数据库Q如何把数据库恢复到试前的状态是件伤脑筋的事情。而Unit Test可以使用自动Rollback机制Qy妙的解决了这件事情?BR>
          Spring 下的Unit Test主要x三个斚wQ?BR>       1. bean的依赖注?BR>       2. 事务控制QOpen Session in Test 及默认回?BR>       3. qWebContainerҎ制层的测?BR>      

       1.bean的依赖注?nbsp;
      能不依靠WebContainer来完成ApplicationContext的徏立与POJO的依赖注入一向是Spring的得意之处?/FONT>

    String[] paths = { "classpath:applicationContext*.xml" };
    ApplicationContext ctx 
    =new ClassPathXmlApplicationContext(paths);
    UserDAO dao 
    = (UserDAO) ctx.getBean("userDAO");

        如果你连q也觉得ȝQ那么只要你的testCasel承于Spring-mock.jar里的AbstractDependencyInjectionSpringContextTestsQ实现public String[] getConfigLocations()函数Q?q显式写一些需要注入的变量的setter函数?BR>    注:因ؓ是AutoWire的,变量名必ȝ于Spring  context文g里bean的id?/P>

    2.Open Session in Test 及自动Rollback
       
    又是来自Springq个奇国度的东西,加入下面几句Q就可以做到Open Session in Test Q解决Hibernate的lazy-load问题Q而且接管原来的DAO里的事务控制定义Q随意定义测试结束时是提交还是回滚,如果默认为回滚,则测试生数据变动不会媄响数据库内数据?BR>     你可以让testCasel承?STRONG>AbstractTransactionalDataSourceSpringContextTests
    Q通过setDefaultRollback(boolean)Ҏ控制最后回滚还是提交?/FONT>
     
        如果自己~写Q代码是q样的:

       protected PlatformTransactionManager transactionManager;
       
    protected TransactionStatus transactionStatus;
       
    protected boolean defaultRollback = true;
       
    public void setUp()
       {
            transactionManager 
    = (PlatformTransactionManager) ctx.getBean("transactionManager");
            transactionStatus 
    = transactionManager.getTransaction(new DefaultTransactionDefinition());
       }
       
    public void tearDown()
       {
            
    if (defaultRollback)
                transactionManager.rollback(
    this.transactionStatus);
            
    else
               transactionManager.commit(
    this.transactionStatus);
        }

      (注,hibernate太奸诈了Q如果全部默认回滚,只会在session里干z,一点不写数据库Q达不到完全的测试效果?

    3.Controller层的Unit Test

    controller层靠Spring提供的MockHttpServletRequest和Response来模拟真实的servlet环境Qƈ且spring 2.0了加了一个AbstractModelAndViewTestsQ提供一些检返回值的utils函数?/P>

        protected XmlWebApplicationContext ctx;
        
    protected MockHttpServletRequest request = new MockHttpServletRequest("GET""");
        
    protected MockHttpServletResponse response = new MockHttpServletResponse();
        
    protected Controller controller = null;
        
    protected ModelAndView mv = null;
       
    public void setUp()
       {
            String[] paths 
    = {"applicationContext*.xml","myappfuse-servlet.xml"};
            ctx 
    = new XmlWebApplicationContext();
            ctx.setConfigLocations(paths);
            ctx.setServletContext(
    new MockServletContext(""));        ctx.refresh();
            controller 
    = (CustomerController) ctx.getBean("customerController");
            
    //再加上前文的事务控制的代?/SPAN>
       }
        
    public void testCustomerList() throws Exception
        {
            request.setRequestURI(
    "/customer.do");
            request.addParameter(
    "action""listView");
            mv 
    = controller.handleRequest(request, response);
            assertModelAttributeAvailable(mv, "customers");

        }

      
    4.q一步简?
    一来这两个基类的名字都太长了?BR>二来有一些公qcontext文g的定义?BR>
    所以可以再抽象了几?STRONG>基类Q?/STRONG>分别是DAOTestCaseQControllerTestCase?BR>
    5. EasyMock
       MockObject是一样彻底分层开发的好东西,而且使用上没什么难度。而且已不再存在只支持接口不支持Class的限制?BR>  

    //讑֮BookManager MockObject
            bookManagerMockControl = MockClassControl.createControl(BookManager.class);
            bookManagerMock 
    = (BookManager) bookManagerMockControl.getMock();
            controller.setBookManager(bookManagerMock);
            
    //录制getAllBook()和getCategorysҎ的期望?/SPAN>
            bookManagerMock.getAllBook();
            bookManagerMockControl.setReturnValue(
    new ArrayList());
            bookManagerMockControl.replay();
             
    //执行操作
            mv = controller.handleRequest(request, response);
    //验证l果          
            assertModelAttributeAvailable(mv, "books");

       Easy Mock VS JMock:

        JMock 要求TestCasel承于MockObjectTestCase太霸道了。妨了我承于Spring2.0的ModelAndViewTestCase和用MockDao,RealDaoq行的承体pR因此采用没那么霔R的easyMock?/P>

       另外QeasyMock的脚本录制虽不如jmock那么优美Q但胜在短易诅Rjmock那句太长??BR>

    6. 昄层测?/STRONG>
    q有Q显C层至今没有什么好的UnitTestҎQ无论是不成才的httpUnit们还是笨重的GUI test工具。Appfuse一直用的那个ThoughtWork那个Selenium?A >J3Unit的效果不知如何, 其中J3UnitL支持prototype?/P>

    江南白衣 2005-09-21 12:09 发表评论
    ]]>
    Spring 的微内核与FactoryBean扩展机制http://www.aygfsteel.com/calvin/archive/2005/08/30/11099.html江南白衣江南白衣Tue, 30 Aug 2005 14:12:00 GMThttp://www.aygfsteel.com/calvin/archive/2005/08/30/11099.htmlhttp://www.aygfsteel.com/calvin/comments/11099.htmlhttp://www.aygfsteel.com/calvin/archive/2005/08/30/11099.html#Feedback12http://www.aygfsteel.com/calvin/comments/commentRss/11099.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/11099.html江南白衣 

                  扩展Springpd(1)--Spring 的微内核与FactoryBean扩展机制

    DreamHead?A >《思考微内核?/FONT>十分Ȁ?Spring的微内核与扩展机Ӟ
    “Spring的微内核在哪里呢Q便是DI容器。而通过FactoryBeanQ我们可以定制自qlgl装q程Q对一个普通的JavaBean做手脚,像Spring AOP中常用的ProxyFactoryBean做的那样。如此,我们׃必把所有功能都做到Spring的DI容器中去Q而是以一个FactoryBean来对DI容器的功能进行扩展。除了Spring自n之外Q现在已l有一些项目开始利用这个特性扩展SpringQ比如,Acegi Security和Spring Modules。?BR>
     q确是框架容器界应该贯彻的范式,微内核提供最的功能Q而由扩展接口d强框架的能力。下面看看Spring怎么设计Q明白之后就可以开始ؓSpring捐献_֊?)

    1、微内核的功?/FONT>
    1.1 DI(依赖注入)与Singleton理
          利用POJO setter的DI机制Q估计每位同学随手都能写一个简单版本,不多说了?BR>      Singleton理说白了就是先C个map中按id找找看有没有已存在的实例?BR>
    1.2 BeanName与BeanFactory注入
          除了DI注入的属性,微内核还有什么能卖给POJO呢?是Bean在xml 定义里的id和BeanFactory自己了?BR>      卖的机制是让POJO 实现 BeanNameAware和BeanFactoryAware接口。BeanFactory?if(pojo instance of BeanFactoryAware)判断到POJO需要注入BeanFactory,p用setBeanFactory(this)自己注入?BR>
          q种框架?STRONG>Z接口的注入和调用机制
    在Java下挺标准的,Spring的功能多是基于这U模式提供。遗憑ְ是Java不支持多重承,作ؓ替代的接口里不能提供默认的实玎ͼD每一个Pojo都要很无聊的实现一遍setBeanFactory()?BR>
    1.3 DI后的初始化函数调?/STRONG>
          比如属性A,B注入之后Q需要同时根据A和B来对A,Bq行加工或者装配一个内部属性CQ这样就需要在所有属性注入后再跑一个init()函数?BR>      Spring提供两种方式Q一U是和上面的原理一P实现InitializingBean接口的afterPropertiesSet()函数供Spring调用?BR>      一U是在xml定义文g里面自行定义init函数名?BR>      懒得每次在xml文g里定义的采用第1U方式,不想与spring耦合的pojo采用第2U方式。本来就是ؓ了扩展Spring而存在的FactoryBean多采用第一U?BR>
       所谓微内核Q就是仅提供以上三种功能的DI容器?BR>   但作量容器Q还需要以下两U方式,向容器内的POJO 附加各种服务?/STRONG>

    2.FactoryBean扩展机制
    Spring的AOP、ORM、事务管理、JMX、Quartz、Remoting、Freemarker、VelocityQ都靠FacotryBean的扩展,FacotryBean几乎遍布CQ?BR>
    <bean id="sessionFactory"
    class
    ="org.springframework.orm.hibernate3.LocalSessionFactoryBean"/>

    <bean id="baseDAOService"
    class
    ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"/>

    只不q当q对q类factoryBean比较L不仁Q不问原理的照搬照用了?BR>
    不过q原理说出来也好单,所有FactoryBean 实现FactoryBean接口的getObject()函数。Spring容器getBean(id)时见到bean的定义是普通classӞ׃构造该class的实例来获得beanQ而如果发现是FacotryBean接口的实例时Q就通过调用它的getObject()函数来获得beanQ仅此而以.......可见Q很重要的思想Q可以用很简单的设计来实现?BR>
    考察一个典型的FactoryBeanQ?BR>    一般会有两个变量,三个接口Q?BR>    一个setter函数注入需要改装的pojoQ一个内部变量保持装配后的对象returnOjbect?BR>    implements三个接口 QFactoryBean,InitializingBean和BeanFactoryAware ?BR>    各接口的意义之前都讲q了。factoryBean会在afterPropertiesSet()里把pojo改装成returnObjectQ需要用到beanfactoryq行天马行空的动作时靠BeanFactoryAware注入。最后在getObject()里把returnObjectq回?BR>
    Rod_IoC principles, combined with the factory bean, afford a powerful means to abstract the act of obtaining or accessing services and resources

    3. Bean Post-Processor扩展机制
         如果说FactoryBean 是一UFactory、Wrapper式的扩展QBean Post-Processor是另一UAOP、visitor式的机制Q所以也多用于spring的AOP架构?BR>      Post-Processor的原理就是BeanFactory在前文里的调用afterPropertiesSet()/init-method前后Q调用在工厂里注册了的post-processor的postProcessBeforeInitialization()和postProcessAfterInitialization()?BR>      那怎么注册登记呢?又分请不L仪公怸cR如果是ApplicationContextQ你把承BeanPostProcessor 的bean往xml里一搁就行了,application context自会打理。如果是BeanFacotryQ就要显式的注册Q代码大概像Q?BR>     
    XmlBeanFactory factory = new XmlBeanFactory("C:/beans.xml"); 
    BeanPostLogger logger 
    = new BeanPostLogger(); 
    factory.addBeanPostProcessor(logger);


    Rod_"Post-processors add the ability to customize bean and container behavior in a flexible, externalized fashion. "
    ҎFactory Bean那段Q可见两U机制在他心目中的不同作用?BR>
    pd文章:
    Spring 的微内核与FactoryBean扩展机制
    扩展Spring(2)--Spring对各U数据访问框架的集成机制

    江南白衣 2005-08-30 22:12 发表评论
    ]]>扩展Spring(2)--Spring对各U数据访问框架的集成机制http://www.aygfsteel.com/calvin/archive/2005/08/26/11243.html江南白衣江南白衣Fri, 26 Aug 2005 10:24:00 GMThttp://www.aygfsteel.com/calvin/archive/2005/08/26/11243.htmlhttp://www.aygfsteel.com/calvin/comments/11243.htmlhttp://www.aygfsteel.com/calvin/archive/2005/08/26/11243.html#Feedback3http://www.aygfsteel.com/calvin/comments/commentRss/11243.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/11243.html扩展Spring(2) ---Spring对各U数据访问框架的集成机制

         何ؓ数据框架集成?BR>   数据讉K框架原本好好的,Spring都干了什么呢Q?BR>   一是用templatecd装了数据框架那些资源获取和异怺务处理的废话代码Q而且按照自己的意见给Z些增强函数?BR>   二是其U_了Spring的声明式事务理中?BR>
        ҎSpring对Hibernate、JDBC的集成,q有Spring Modules?A >O/R Broker的集成,发现Spring的DAO框架主要有六个类Q?BR>    1.Template
          著名的Templatec,用callback机制装了除业务代码外的所有必要但废话的代码,重新装了数据框架的APIQƈ再附送一些增强版?BR>
        2.TransactionManager 
          实现PlatformTransactionManager接口Q数据访问框架就能与Spring的事务机?TransactionTemplate或AOP声明式事?l合?BR>
        重要的类仅以上两个,以下的类都只有少量标准代码,完全可以忽略?BR>    3.DAOSupport
           实际DAOcȝ基类Q负责保持template变量。如果你觉得它破坏了你的cdơ结构,完全可以不用?BR>    4.Accessor
         templatecȝ基类Qdefining common properties like DataSource and exception translatorQ也没大用?BR>    5.Operations
         template所实现的接口,定义template支持的数据访问函数和增强函数Qtemplate有多个实现时才有用?BR>    6.Exception Translate的相关类和函?BR>     异常译QSpring DAO很重视的一个功能?BR>
    Templatecȝ代码
       因ؓHibernate本n很复杂,所以HibernateTemplate也不适合畏高晕R的h士如我观看。JDBC单很多,但JDBCTemplate又忙着增强JDBC的功能,多出好多代码。所以我选O/R broker的集成代码来看,代码一共才280行?BR>注:如果不熟O/R brokerQ可以简单的认ؓbroker=connection, executable = statement Q其余一切同Jdbc?BR>
    1.1d函数 Execute(BrokerCallback action)
          step1. 获得Connection-- connecton = datasource.getConn();
          step2. 准备Statement -- statement = new Statement(connection);
          step3. 执行Action的回调函数doInBroker(Statement)。这个doInBroker()Ҏ由客户定义,会拿着传入的statementQ执行种U操作?BR>              
     try
    {
      action.doInBroker(statement );
    }
    catch()
    {
       
    //译异常
    }

       1.2 template的API函数
             虽然理论上大家可以直接用execute()Q在匿名内部c里调用数据讉K框架的Q何API。但java的匿名内部类不比闭包Q代码难看无比,所以除了Robbinq没见到其他兄弟提倡直接用executeҎ的?BR>        因此Qtemplate也对数据框架的APIq行了wrapQ封装了用execute(StatementCallback action)来执行这些API的函敎ͼ如下D就是wrap 了O/R Broker的execute(String statementID.....)ҎQ?BR>
    public int execute(final String statementID, final String[] paramNames, final Object[] values) throws DataAccessException {
        
    return executeWithIntResult(new BrokerCallback() {
          
    public Object doInBroker(Executable executable) throws BrokerException {
            applyNamedParamsToExecutable(executable, paramNames, values);
            
    return new Integer(executable.execute(statementID));
          }
        });
      }


        另外q提供一些增强型、便利型的API(如selectOne() ,selectMany())Q在参数、返回g极尽变化?BR>
    TransactionManager的代?/STRONG>
       比较复杂Q一下说不清。但JDBC的DatasourceTransactionManager和Hibernate的HibernateTransactionManager的代码都很相q,说明q个TransactionManager其实也比较固定埋头狂抄就是了?BR>
        有兴的同学Q可以响应某大老号召,实现ofbiz与spring的集?)

    pd文章:
    Spring 的微内核与FactoryBean扩展机制
    扩展Spring(2)--Spring对各U数据访问框架的集成机制

    江南白衣 2005-08-26 18:24 发表评论
    ]]>化Spring(4)--View?/title><link>http://www.aygfsteel.com/calvin/archive/2005/08/24/10914.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Wed, 24 Aug 2005 06:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/calvin/archive/2005/08/24/10914.html</guid><wfw:comment>http://www.aygfsteel.com/calvin/comments/10914.html</wfw:comment><comments>http://www.aygfsteel.com/calvin/archive/2005/08/24/10914.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.aygfsteel.com/calvin/comments/commentRss/10914.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/calvin/services/trackbacks/10914.html</trackback:ping><description><![CDATA[    作者:<A ><FONT color=#366900>江南白衣</FONT></A> <BR><BR>    人生像个舞台Q请良家女d?BR>    同样的,Freemarker和Velocity爱好者请跌本篇。与弃用webwork而单用Spring MVC Controller接口的理׃P<A >Freemarker</A>本来是一样好东西Q还跨界支持jsp 的taglibQ而且得到了WebWork的全力支持,但ؓ了它的非标准化,用户数量与IDE的缺乏,在View层我们还是用了<STRONG>保守但hZ用,IDE友好的JSP2.0 配合JSTL?BR><BR>    </STRONG>对于B/Sl构的企业应用Y件来_基本的页面不外两U,一U是填Form的,一U是DataGrid 数据列表理的,再配合一些css, js, ajax的效果,是View层要x的东西了?BR><BR><STRONG>1. JSP 2.0的EL代替<c:out></STRONG><BR>JSP2.0可以直接把EL写在html部分Q而不必动?lt;c:out>节点后,老实_JSP2.0+JSTL辑ֈ的页面效果,已不比Velocity相差多少了? <DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <DIV><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000">{goods.name}</SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"> <BR>代替<BR></SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">><</SPAN><SPAN style="COLOR: #800000">c:out </SPAN><SPAN style="COLOR: #ff0000">value</SPAN><SPAN style="COLOR: #0000ff">="{goods.name}"</SPAN><SPAN style="COLOR: #0000ff">/></</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">></SPAN></DIV></DIV> <P>(除了EL里面不能调用goods的函敎ͼsun那帮老顽固始l坚持JSTL只能用于数据昄Q不能进行数据操作,所以不能调用bean的get/set外的Ҏ)<BR><BR> <STRONG>2. 最懒的form 数据l定</STRONG> </P> <P>    Spring得可怜的几个tag基本上是鸡肋Q完全可以不要?而Spring开发中的那些Simple Form tag又还没有发布。Spring的Tag主要用来把VO的值绑到input框上。但是,和Struts一P需要逐个Input框绑定,而且语法极度冗长Q遇到select框还要自p行处?....典型的Spring Sample面让h一阵头? </P> <P>    ?A >jodd的form tag</A>l了我们懒h一个懒得多的方法,只要?lt;form>两头?lt;jodd:form bean="myVO"></jodd:form>包住Q里面的所有input框,select框,checkBox...l统自动被绑定了Q这么简单的事情Q真不明白struts,springZ么不用,Z不必要的灉|性么? <BR></P> <DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <DIV><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">form</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">jodd:form </SPAN><SPAN style="COLOR: #ff0000">bean</SPAN><SPAN style="COLOR: #0000ff">="human"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">input </SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="text"</SPAN><SPAN style="COLOR: #ff0000"> name</SPAN><SPAN style="COLOR: #0000ff">="name"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">input </SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="radiobox"</SPAN><SPAN style="COLOR: #ff0000"> name</SPAN><SPAN style="COLOR: #0000ff">="sex"</SPAN><SPAN style="COLOR: #ff0000"> value</SPAN><SPAN style="COLOR: #0000ff">="man"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">select </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="age"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR>  </SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">option </SPAN><SPAN style="COLOR: #ff0000">value</SPAN><SPAN style="COLOR: #0000ff">="20"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000">20</SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">option</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR>  </SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">option </SPAN><SPAN style="COLOR: #ff0000">value</SPAN><SPAN style="COLOR: #0000ff">="30"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000">30</SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">option</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">select</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">jodd:form</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">form</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"> <BR></SPAN></DIV></DIV> <P><BR> <P></P>不过Qjodd有个致命q是不能绑定内嵌对象的倹{比如Order(订单)对象里有个Customer(֮)对象Qjodd׃能像 struts,spring一L如下语法l定: <BR> <P></P> <DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <DIV><IMG src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">input </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="customer.customerNo"</SPAN><SPAN style="COLOR: #0000ff">></SPAN></DIV></DIV> <P>q是因ؓ它的beanUtils比Jakata Common弱,用了一个错误的思\的缘故?动用beanUtils修改一下就可以了,<A href="/Files/calvin/form_tag.rar">修改后的源码可以在这里下?/A>? <P><STRONG>3. DataGrid数据列表</STRONG></P> <P>DisplayTag和ValueList都属于这UŞ式的Tag Library。但最q出现的<A >Extreme Table</A>是真正的killerQ他本n功能强大不说Q而且从一开始就想着如何让别行扩展重载,比如Extend Attributes机制是DisplayTagq样的让千h一面者不会预留?BR><BR><BR><STRONG>4.css, javascript, ajax</STRONG><BR>天下UhQ没有什么特别想讲想推荐的,p谁吧?A >Buffalo</A>, DWR, Scriptaculous, Prototype, AjaxTags, AjaxAnywhere, Rico, Dojo, JSON-RPCQ看着名字头痛?BR><BR>相关文章<BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl3_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/21/10530.html"><FONT color=#366900>化Spring(1)--配置文g</FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl2_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/22/10695.html"><FONT color=#366900>化Spring(2)--Model?/FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/23/10794.html"><FONT color=#366900>化Spring(3)--Controller?/FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/24/10914.html"><FONT color=#366900>化Spring(4)--View?/FONT></A> </P><img src ="http://www.aygfsteel.com/calvin/aggbug/10914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/calvin/" target="_blank">江南白衣</a> 2005-08-24 14:22 <a href="http://www.aygfsteel.com/calvin/archive/2005/08/24/10914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>化Spring(3)--Controller?/title><link>http://www.aygfsteel.com/calvin/archive/2005/08/23/10794.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Tue, 23 Aug 2005 06:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/calvin/archive/2005/08/23/10794.html</guid><wfw:comment>http://www.aygfsteel.com/calvin/comments/10794.html</wfw:comment><comments>http://www.aygfsteel.com/calvin/archive/2005/08/23/10794.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.aygfsteel.com/calvin/comments/commentRss/10794.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/calvin/services/trackbacks/10794.html</trackback:ping><description><![CDATA[    作者:<A ><FONT color=#366900>江南白衣</FONT></A> <BR><BR>    Struts与Webwork的扇子请跌本篇?BR><BR>    MVC不就是把M、V、C分开么?臛_物朴素的做法是两个JSP一个负责ViewQ一个负责ControllerQ再加一个负责Model的Java BeanQ已l可以工作得很好Q那时候一切都很简单?BR>    而现在ؓ了一些不是本质的功能Q冒么多非标准的Web框架Q实在让Z阵郁闗像Ruby On Rails那样捷开发,可用可不用,而且没有太多的限刉要学习的Q比?STRONG>Webwork</STRONG>q型q可以考虑。但像Struts那样用框架麻烦,或者像Tapestry那样有严重自闭們֐Q额上凿着"高手专用玩具"的,用在团队里就是不负责ȝ行ؓ了?BR><BR> <DIV>    soQ?STRONG>我的MVCҎ是用Spring MVC的Controller接口Q写最普通的JavaBean作ؓController</STRONG>Q本质就和当q拿JSP作Controller差不多,但拥有了Spring IOC的特性?/DIV> <DIV>    之所以用q么消极的选择标准Q是因ؓ觉得q一代MVC框架重回RAD时代的标准还很远Q注定了只是一D늟暂的Q过渡的技术,不值得投资太多_֊和团队学习成本?/DIV> <DIV><BR><STRONG>1. 原理</STRONG> <DIV>     Spring MVC按植物分cd属于Martin Flower〈企业应用模式〉里的静态配|型Front ControlerQ用DispatchServlet截获所?.do的请求,按照xml文g的配|,调用对应的Command对象的handleRequest(request,response)函数Q同时进行依赖对象的注入?BR>     我们的Controller层,是实现handleRequest(request,response)函数的普通JavaBean?/DIV> <DIV></DIV></DIV> <DIV><STRONG><BR>2. 优势<BR>    </STRONG> Spring MVC与struts相比的优?</DIV> <DIV><STRONG>     </STRONG>一是它的Controller有着从松到紧的类层次l构Q用户可以选择实现只有一个HandleRequest()函数的接口,也可以用它有很多回调函数的SimpleFormControllercR?/DIV> <DIV>     二是不需要Form BeanQ也不需要Tapestry那所谓面向对象的面对象Q对于深怕类膨胀Q改一个东西要动N个地方的人最适合不过?/DIV> <DIV>     三是不需要强XML配置文gQ宣告式~程是好的,但如果强制成框架Q什么都要在xml里面宣告Q写的时候繁琐,看的时候也要代码配|两边看才能明白比较麻烦了?/DIV> <DIV> </DIV> <DIV>     那Webwork?没有实战q,不过因ؓ对MVC框架所求就不多Q单用Spring MVC的Controller已经可以满需求,׃多搞一套Webwork来给团队讑֝Q还有给日后l护Qspring,ww2之间的版本升U添ȝ了。真有什么需要添加的QSpring MVC源代码量很少Q很Ҏ掌控和扩展?BR>  </DIV> <DIV><B>3.化简</B></DIV> <DIV><STRONG>3.1. 直接implement ControllerQ实现handleRequest()函数</STRONG></DIV> <DIV>      首先Qsimple form controller非我所好,一炚w不simple。所以有时我会直接implement Controller接口。这个接口的唯一函数是供Front Controller调用的handleRequest(request,response)?BR>      如果需要application对象Q比如想用application.getRealPath()Ӟpextends webApplicationObjectSupport?BR><BR><STRONG>3.2.每个Controler负责一l相关的action</STRONG></DIV> <DIV>       我是坚决支持一个Controler负责多个action的,一个Controler一个action像一个function一个类一h聊。所以我用最传统的方式,用URL参数如msg="insert"把一l相关action交给一个Controler控制。ROR与制作中的Groovy On Rails都是q种模式QSpring也有MultiActionController支持?BR>       以上三者都是把URL参数直接反射为Controller的函敎ͼ?A >Stripes</A>的设计可用annotation标注url action到响应函数的映射?/DIV> <DIV>       <DIV></DIV><STRONG>3.3.xml宣告式编E的取舍</STRONG> </DIV> <DIV>    我的取舍很简单,反正Spring没有M强制Q我只在可能需要不重新~译而改变某些东西的时候,才把东西攑֜xml里动态注入。jsp路径之类的就l统收回到controller里面定义.</DIV> <DIV> </DIV> <DIV><STRONG>3.4.Data Binder</STRONG></DIV> <DIV>       Data Binder是Controller的必有环节,对于Spring提供的DataBinderQ照理完全可用,唯一不爽是对象如果有内嵌对象Q如订单对象里面包含了Customer对象QSpring需要你先自行创ZCustomer对象q把它赋l了Order对象Q才可能实现order.customer.customer_noq样的绑定。我hQ又拿Jakarta BeanUtils出来自己做了一个Binder?BR><BR>3.<STRONG>5.提取基类</STRONG></DIV> <DIV>      最后还是忍不住提取了一个基c,负责MultiAction和其他一些简便的Ҏ。Sprnig的MultiActionController做得太死Q规定所有函数的W?,2个参数必Lrequest和responseQ不懂动态的Q温柔的q行参数注入?BR><BR>      <BR>      l过化简再化Q已l是很简单一个Java Bean QQ谁都可以L上手Q即使某q某月技术的大潮把现在所有MVC框架都没了Q也不至于没得维护?BR><BR>相关文章<BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl3_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/21/10530.html"><FONT color=#366900>化Spring(1)--配置文g</FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl2_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/22/10695.html"><FONT color=#366900>化Spring(2)--Model?/FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/23/10794.html"><FONT color=#366900>化Spring(3)--Controller?/FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/24/10914.html"><FONT color=#366900>化Spring(4)--View?/FONT></A> </DIV><img src ="http://www.aygfsteel.com/calvin/aggbug/10794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/calvin/" target="_blank">江南白衣</a> 2005-08-23 14:53 <a href="http://www.aygfsteel.com/calvin/archive/2005/08/23/10794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>化Spring(2)--Model?/title><link>http://www.aygfsteel.com/calvin/archive/2005/08/22/10695.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Mon, 22 Aug 2005 06:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/calvin/archive/2005/08/22/10695.html</guid><wfw:comment>http://www.aygfsteel.com/calvin/comments/10695.html</wfw:comment><comments>http://www.aygfsteel.com/calvin/archive/2005/08/22/10695.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.aygfsteel.com/calvin/comments/commentRss/10695.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/calvin/services/trackbacks/10695.html</trackback:ping><description><![CDATA[    作者:<A ><FONT color=#366900>江南白衣</FONT></A> <BR><BR>    因ؓSpring自带的sampleL们的实际目很远Q所以官方一点的model层模式展现就靠Appfuse了?BR>    但Appfuse的model层d有一个DAO接口、一个DAOImplcR一个Service接口、一个ServiceImplcR一个DataObject.....大概只有受惯了虐待的人才会欣然接受吧?BR>    另外QDomain-Driven逢初一、十五也会被拿出来讨Z遍?BR><BR>    其实无论什么模式,都不q是一Uh为的划分、抽象和装。只要在团队里理解一_自我感觉优雅p了?BR>     我的是,一开始DO和Manager一生一旦包演全场,DO作ؓU数据蝲体,而ManagercL|商业方法,用getHibernateTemplate()直接讉K数据库,不强制基于接口编E。当某天pȝ复杂C直觉上需要将DAO层和Service层分开Ӟ再分开好了?BR><BR>    <STRONG><FONT size=4>1.DataObjectc?BR></FONT>     </STRONG>好听点也可以叫Domain Object。Domain Driven  Development虽然׃hQ但因ؓJava下的ORM框架都是ZData Mapper模式的,没有Ruby On Rails中那UActive Recorder的模式。所以,q是压下了这个欲望,Data ObjectUa作一个数据蝲体,而把数据库访问与商业逻辑操作l一攑ֈManagercM?BR><BR>    <STRONG><FONT size=4>2.Managerc?/FONT></STRONG><BR>    我的ManagercLAppfuse中DAOcMServicecȝl合体,因ؓQ?BR><BR>    <STRONG>2.1 不想使用UDAO</STRONG><BR>     以往的DAO是ؓ了透明不同数据库间的差异,而现在Hibernate已经做的很好。所以目前纯DAO的更大作用是Z来可以切换到别的ORMҎ比如iBatisQ但一个Pragmaic的程序员昄不会无聊Cؓ了这个机会不大的理由Q现在就d一个纯DAO层,目又不是Appfuse那样Zdemo各种ORMҎ而存在?BR><BR>    <STRONG>2.2 也不想用Service层来为Dao解?BR></STRONG>    在JPetStore里有一个很薄的Service层,Fascade了一堆DAOc,把这些DAOcȝ所有方法都늡的重复了一遍。理Z一个Managercd以管理数个Daoc,可以避免Dao之间直接耦合。但既然有Manager的情况下Q商业逻辑都是写在ManagercȝQ那样子Managergq是调用另一个Manager比较妥当Q调用裸Dao可能存在忽略了某些逻辑。所以,耦合又从Dao层升到Service层了?BR>     所以,除非你做的是薄的不带逻辑的Service层,否则没有解耦的意义?BR>    何况Q对一个不是死搬书的Designer来说Q组件边界之内的cM间的耦合q不是耦合?BR><BR>    <FONT size=4><STRONG>3.去除不必要的Z接口~程</STRONG><BR></FONT>    众所周知QSpring是提倡基于接口编E的?BR>    但有些Managerc,比如SaleOrderManager Q只?%的机会再有另一个Impl实现?5%旉里这两兄弟站一P像C++里的.h?cppQ徒增维护的J琐(l常要同步两个文件的函数声明)Q和代码览跌{时的不便(比如从Controlerc跟t到ServicecLQ只能蟩转到接口cȝ相应函数Q还要再按一ơ复杂的热键才蟩转到实现c?<BR>    qMartin Flower都说Q强制每个类都分L口和实现是过犹不及。只在有多个独立实现Q或者需要消除对实现cȝ依赖Ӟ才需要分L口?BR><BR>    <STRONG>3.1 DAO被强制用接口的原?/STRONG><BR>    Spring IOC本n是不会强制基于接口的Q但DAOcM般要使用Spring的声明式事务机制Q而声明式的事务机制是使用Spring AOP来实现的。Spring AOP的实现机制包括动态代理和Cgilib2Q其中Spring AOP默认使用的Java动态代理是必须Z接口Q所以就要求Z接口了?BR>    <BR>    <STRONG>3.2 解决Ҏ</STRONG><BR>    那就让Spring AOP改用CGLib2Q生成目标类的子cdQ我们只要指定用声明式事务的FactoryBean使用CGLib的方式来实现AOPQ就可以不基于接口编E了?BR>    指定的方式ؓ<STRONG>讄proxyTargetClass为true</STRONG>。如下:<BR> <DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <DIV><SPAN style="COLOR: #0000ff"> <DIV><IMG src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">bean </SPAN><SPAN style="COLOR: #ff0000">class</SPAN><SPAN style="COLOR: #0000ff">="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</SPAN><SPAN style="COLOR: #ff0000"><BR><IMG src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align=top>id</SPAN><SPAN style="COLOR: #0000ff">="baseService"</SPAN><SPAN style="COLOR: #ff0000">   abstract</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align=top>  </SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">property </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="transactionManager"</SPAN><SPAN style="COLOR: #ff0000"> ref</SPAN><SPAN style="COLOR: #0000ff">="transactionManager"</SPAN><SPAN style="COLOR: #0000ff">/></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align=top>  </SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">property </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="proxyTargetClass"</SPAN><SPAN style="COLOR: #ff0000"> value</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align=top><IMG src="http://www.aygfsteel.com/images/dot.gif"><BR><IMG src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">bean</SPAN><SPAN style="COLOR: #0000ff">></SPAN></DIV></SPAN></DIV></DIV><BR>     又因些Service Bean都是单例Q效率应该不受媄响?BR><BR>    <STRONG><FONT size=4>4.ȝ<BR></FONT></STRONG>    ҎAppfuse里面?个类Q我的Model层里只有VO作ؓU数据蝲体,ManagercL商业Ҏ。有q样太简单了Q但一个应用,要划成几个JSPQ一个ControllerQ一个ManagerQ一个VOQ对我来说已l够复杂,再要往上架墙叠屋,恕不奉陪Qv码在我的目范围里不需要?但有很多目是需要的Q神佑世人)<BR><BR>    后记Q迫于世人的压力Q?A href="http://www .springside.org.cn">SpringSide</A>暂时q是把DAO和Service层分开了,但依然坚持不搞那么多接口?BR>另外Q尽量利用IDEA的代码生成热键,为Managercȝ成delegate的DaocL法?BR><BR>相关文章<BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl3_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/21/10530.html"><FONT color=#366900>化Spring(1)--配置文g</FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl2_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/22/10695.html"><FONT color=#366900>化Spring(2)--Model?/FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/23/10794.html"><FONT color=#366900>化Spring(3)--Controller?/FONT></A> <BR><A id=_814bc1840a6fa23_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/08/24/10914.html"><FONT color=#366900>化Spring(4)--View?/FONT></A> <img src ="http://www.aygfsteel.com/calvin/aggbug/10695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/calvin/" target="_blank">江南白衣</a> 2005-08-22 14:55 <a href="http://www.aygfsteel.com/calvin/archive/2005/08/22/10695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>化Spring(1)--配置文ghttp://www.aygfsteel.com/calvin/archive/2005/08/21/10530.html江南白衣江南白衣Sun, 21 Aug 2005 12:59:00 GMThttp://www.aygfsteel.com/calvin/archive/2005/08/21/10530.htmlhttp://www.aygfsteel.com/calvin/comments/10530.htmlhttp://www.aygfsteel.com/calvin/archive/2005/08/21/10530.html#Feedback8http://www.aygfsteel.com/calvin/comments/commentRss/10530.htmlhttp://www.aygfsteel.com/calvin/services/trackbacks/10530.html作者:江南白衣 
       
                               ?/STRONG>

        Zh都爱Spring加Hibernate?BR>    但Spring MVC+hibernate的Sample如Appfuse的代码却不得最z优好读,如果在自q目中l发挥我们最擅长的依L葫芦大法Q美好愿望未必会实现?
         所以,Pramatic_不灭。这个系列就是探L适合自己的Spring+Hibernate模式?BR>    
                                  I-配置文g?/STRONG>

         我厌倦一切配|文件繁重的框架?
         最好的情况是,框架提供极端灉|复杂的配|方式,但只在你需要的时?/STRONG>?BR> 
         Spring提供了三U可能来化XML。随着国内用户水^的提高,q些基本的简化技巧大安已掌握?BR>     大家可以直接看第3Q第4?-Spring 1.2, Spring 2.0的后l改q?BR>

    1.1.autowire="byName" /"byType"

         假设Controller有一个属性名为customerDAOQSpring׃在配|文仉查找有没有名字ؓCustomerDAO的bean, 自动为Controller注入?BR>     如果bean有两个属性,一个想默认注入Q一个想自定义,只要讑֮了autowireQ然后显式的声明那个惌定义的,可以达到要求。这应了需求,在需要特别配|的时候就提供配置Q否则给我一个默认注入?BR>
         q有一个更懒的地方Q在最最栚w?lt;beans>节点写一句default-autovwrie="byName"Q可以让文g里的所有bean 都默认autowrie?BR>    不过Rod认ؓ开发期可以q样Q但Production Server上不应该使用Autowire。而我觉得那些自定义一ơ的地方比如TranscationManager应该详细定义Q而Dao,Controllerq种大量重复定义的bean可以偷Ҏ了?/P>

    1.2.<bean>节点之间抽象公共定义?Inner Bean

        q太方便懒h了,想不C个独立的XML节点都可以玩l承和派生,子节Ҏ有父节点的全部属性?BR>    最好用的地方就是那个Transtion Proxy的定义。先定义一个又长又冗的父类Q然后用子类ȝ承它?BR>   
        另外Q还有一个Inner Bean的机Ӟ可以把DAO写成Proxy的内部类。ؓ什么要写成内部c?Z让Proxy冒名替它去让Controller Autowire?详见后面的示?

    1.3. 宽松的配|? To XML or Not to XML 
        据说Spring比Struts的配|宽松了很多Q这q人把东西从配|文件中撤回原码中的Z?BR>    不赞成什么都往配置文g里晒Q造成了Rich Information的配|文Ӟ修改或者查看的时候,要同时打开配置文g和原码才能清楚一切?
        而我希望配置文g集中做一些整体的配置Q还有框架必ȝ、无需理的冗余代码。而一些细节的变化不大的配|和逻辑Q就量别往里塞了。因此,Success/Fail View 的配|,不徏议放在里面?

    2.化后的配|文?/STRONG>

    1.Controller只剩下一?/P>

    <bean name="customerController" class="org.springside.bookstore.web.CustomerController" autowire="byName"/>

    2.DAO也只剩一?/P>

    <bean id="customerDAO" class="org.springside.bookstore.dao.CustomerDao"/>

    3.Servicecd剩下5?

      <bean id="customerManager" parent="baseTxService">
            
    <property name="target">
                
    <bean class="org.springside.bookstore.service.CustomerManager"/>
            
    </property>
        
    </bean>

    3.Spring 1.2后xml语法?BR>
     
    最主要的简化是把属性值和引用bean?STRONG>子节?/STRONG>变回?STRONG>属性?/STRONG>Q对不喜Ƣautowire的兄弟比较有用?BR> 当然Q如果value要CDATA的时候还是要用子节点。另外,list的值可以用I格隔开也比较实用?BR>

    1.属性?BR>
      <property name="foo">
         
    <value>fooValue</value>
      </property>
      化ؓ
      <property name="foo" value="fooValue"/>

    2.引用 bean
    <property name="foo">
       
    <ref bean="fooBean">
    </property>
    化ؓ
    <property name="foo" ref="fooBean"/>


    3. list可以化ؓI格分开的字W串
     
    <property name="myFriendList">
      
    <list>
         
    <value>gigix</value>
            <value>wuyu</value>
      
    </list>
    </property>
    化ؓ
    <property name="myFriendList" value="gigix wuyu"/>
       
      
    4.Spring 2.0来了
       如果没什么外力刺ȀQspring xml 可能p样不会变了。但现在xml成了q街老鼠Q被ror的默认配|和JDK5的annotation逼得不行Q当然就要l求变?BR>   比如有好事者认为,节点名必Mbean打头Q附加一个属性id来表Cbean名;属性值必L一个property子节点,子节点上有个属性name来表C属性名Q是l机器看的很不直观的东西?
    <bean id="customerDAO" class="org.springside...CustomerDAO">
     
    <property name="maxCount" value="10">
    </bean>

    lh看的东西应该写?
    <customerDAO class="org.springside....CustomerDAO" maxCount="10"/>

    Spring 2.0正用schema实现cM的语法,具体L它的JPetStore sample?BR>
    5.使用Spring自带的DTD使编辑器Smart.

        如果没有用Eclipse的Spring插gQ那臛_也要使用spring自带的dtd使XML~辑器smart一些,能够自动Z生成属?判断节点/属性名U有没有拼错{?BR>
    6.q有更变态的化配|方?/STRONG>
        比如autoproxyQ不q我觉得更简化就不可控了Q所以没有采用?BR>
    相关文章
    化Spring(1)--配置文g
    化Spring(2)--Model?/FONT>
    化Spring(3)--Controller?/FONT>
    化Spring(4)--View?/FONT>



    江南白衣 2005-08-21 20:59 发表评论
    ]]>
    վ֩ģ壺 | | | ɫ| | | | | | | | Ӣ| | ̶| | | ͷ| | | ˮ| ɽʡ| | | ʯ| ˳| ڰ| | ɽ| | | | ͭ| ʤ| ʦ| | | ¯| | ̨| | ˮ|