??xml version="1.0" encoding="utf-8" standalone="yes"?>成人精品三级,国产aⅴ综合色,成人国产精品一区二区http://www.aygfsteel.com/TrampEagle/category/9800.html学习和生z? zh-cnWed, 28 Feb 2007 12:30:05 GMTWed, 28 Feb 2007 12:30:05 GMT60为domain object注入依赖http://www.aygfsteel.com/TrampEagle/articles/30263.htmlTrampEagleTrampEagleSat, 11 Feb 2006 06:30:00 GMThttp://www.aygfsteel.com/TrampEagle/articles/30263.htmlhttp://www.aygfsteel.com/TrampEagle/comments/30263.htmlhttp://www.aygfsteel.com/TrampEagle/articles/30263.html#Feedback0http://www.aygfsteel.com/TrampEagle/comments/commentRss/30263.htmlhttp://www.aygfsteel.com/TrampEagle/services/trackbacks/30263.html原文引自Q?A >http://www.javaeye.com/pages/viewpage.action?pageId=1141

作? C
整理:robbin

原理Q利用Hibernate3提供的PostLoadEventListener在loadHibernate实体cȝ时候触发PostLoadEvent事gQ编写一个自定义的事件监听器Q注入依赖的Spring Bean对象

SpringHibernateInjector
import org.hibernate.event.PostLoadEvent;
import org.hibernate.event.PostLoadEventListener;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

public class SpringHibernateInjector implements PostLoadEventListener, BeanFactoryAware{

    AutowireCapableBeanFactory beanFactory;
   
    public void onPostLoad(PostLoadEvent event) {
        Object hibernateObject = event.getEntity();
        beanFactory.autowireBeanProperties(hibernateObject, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);   
    }

    public void setBeanFactory(BeanFactory factory)  {
        beanFactory = (AutowireCapableBeanFactory) factory;
    }

}
applicationContext.xml
<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="mappingResources">
            <list>
                ...domains.hbm.xml here...
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.Oracle9Dialect
                </prop>
                <prop key="hibernate.query.substitutions">
                    true 1, false 0
                </prop>
                <prop key="hibernate.show_sql">false</prop>
            </props>
        </property>
       <property name="eventListeners">
          <map>
            <entry key="post-load">
              <!-- This hibernate interceptor allows us to use Spring to inject services
 into Hibernate managed domain objects -->   
              <bean class="yourpackage.SpringHibernateInjector"/>
            </entry>        
           </map>
    </property>
    </bean>

注:此方法来自于ThoughtWorks?PerrynFowlerQ俺只是摘抄一?/P>

TrampEagle 2006-02-11 14:30 发表评论
]]>
OpenSessionInView会不会媄响性能Q?/title><link>http://www.aygfsteel.com/TrampEagle/articles/30094.html</link><dc:creator>TrampEagle</dc:creator><author>TrampEagle</author><pubDate>Fri, 10 Feb 2006 01:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/TrampEagle/articles/30094.html</guid><wfw:comment>http://www.aygfsteel.com/TrampEagle/comments/30094.html</wfw:comment><comments>http://www.aygfsteel.com/TrampEagle/articles/30094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/TrampEagle/comments/commentRss/30094.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/TrampEagle/services/trackbacks/30094.html</trackback:ping><description><![CDATA[原文摘自Q?A >http://forum.javaeye.com/viewtopic.php?t=17501&postdays=0&postorder=asc&start=0</A><BR><BR> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-11 12:15:26<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B>hongliang 写道:</B></SPAN></TD></TR> <TR> <TD class=quote>那这么说来,假设Hibernate在第一U拿到叻数据库连接,q个q接不还是持l?5U么Q?/TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR>如果是网l传输速度Dload面需?5U,那么旉消耗在|络传输上,本n面执行旉很短?<BR><BR>如果不是|络传输速度Dload面需?5U,那说明什么?说明q个面的程序执行了15U!Z么一个页面程序需要执行这么久呢?说明q个面的数据库查询非常耗时Q?U内存操作都是msU别的,如果?0多秒了,瓉只可能是数据库操? 如果数据库查询需?5U,请问你就不用OpenSessionInViewQ你不是一样需要打开数据库连接长?5U吗Q?/SPAN><span id="wmqeeuq" class=postbody></SPAN><span id="wmqeeuq" class=gensmall></SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-11 12:32:42<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody>我明白robbin你的意思,我说的情况就是网l传输导致的15U。本w页面执行的旉Q比如freemarker渲染一下模板,q个速度是非常快的,没问题,可是我的疑问在于如果网l传输狠慢,会不会媄响到数据库连接?<BR><BR>假设WebWork+Hibernate+FreeMarker架构模型是这L <BR><BR>Request <BR>| <BR>|---other filters... <BR>| <BR>|---OpenSessionInView Filter <BR>| <BR>|-----WebWork Controller <BR>| <BR>|---Action <BR>| <BR>|---FreeMarker Result(对response.getWriter()做process()操作) <BR>| <BR>| <BR>|---OpenSessionInView Filter <BR>| <BR>|---other filters... <BR>| <BR>Request <BR><BR><BR>q里有两U情c?<BR><BR>一是页面缓冲区_大,_一ơ性容Ux有的面Q这h染页面就会一ơ性进入缓冲区Q然后返回到OpenSessionInView FilterQ关闭SessionQ数据库q接q回池中Q一切OK?<BR><BR>W二U情冉|是重Ҏ讨论的,也是我的疑虑所在。那是假如q个面比较大,出叻页面缓冲区的大,那么渲染面Ӟ拿FreeMarker/Velocityq样的模板语a来说Q它执行process/mergeҎQ往servlet的response writer/outputStream里面写东西,写着写着Q发现写不动叻,是缓冲区满叻Q而这个writer/outputStreamQ正是服务器同用户之间徏立的sockethQ于是底层代码开始先向用户传输一部分面Q传好后Q又有叻新的~冲区,FreeMarker/Velocity的方法又能向~冲区里写东西叻。而传输页面这个过E,又耗费dU钟的时_导致叻数据库连接被占用ȝ长的旉?<BR><BR>可能我描q的是错误的Q希望robbin指正Q:Q?/SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-11 13:07:27<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody>我觉得这个问题归根结底就是AppServerI竟会如何实现页面输出。那么必然和具体的应用服务器实现有关pR那么至于每个AppServerI竟会怎样d玎ͼ我就不得而知了。v码大家可以研I一下Tomcat源代码看看tomcat是如何实现的?<BR><BR>confluence采用的就是Hibernate/Spring/Webwork架构QOpenSessionInViewQ以confluenceq么q的使用Q好像也没有听过q方面的问题投诉?/SPAN><span id="wmqeeuq" class=postbody></SPAN><span id="wmqeeuq" class=gensmall></SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-11 18:26:22<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody>我写了一个简单的webapp在Tomcat5.5.12上面做了一个小试。在JSP面里面循环1万次输出字符ԌE序在远E服务器上面q行Q网l是ADSL宽带Qfilter实被阻塞了20U左叟뀂然后我另外开了一个flashgetM载服务器上的大文Ӟ模拟|络速度比较慢的环境Qfilter被阻塞了50U左叟뀂分别做了三ơ测试。另外当面下蝲q程中直接点L览器stop按钮Q则JSP执行被打断,filter立刻解除dQ被执行完毕?<BR><BR>l论证明Q用OpenSessionInView的时候,如果render的页面数据量非常大,q且客户端网l速度很慢的情况下Q由于页面的输出旉q程很长Q确实会造成filter被长旉d。对于OpenSessionInViewFilter来说Q就会造成数据库连接被保持很长的时_才能被关闭?<BR><BR>不过Q对于Spring的OpenSessionInViewFilter来说Q虽然数据库q接被保持了q长的时_但是q没有锁定数据库资源Q特别是事务资源。因为Spring的事务是通过TransactionInterceptor来实现的Q在MVCl构中,当最后一个业务bean被调用结束以后,Transaction已l被提交了。此后,虽然数据库连接还保持中,但是数据库资源没有锁定问题?<BR><BR>完整的调用示意图Q?<BR><BR>request -> (OpenSessionInViewFilter打开Session) -> ServletDispatcher -> Action -> (打开ConnectionQ启动事? -> spring bean -> another spring bean -> (提交事务) -> bean执行完毕Q返回Action -> render view(JSP/Template) -> (OpenSessionInViewFilter关闭Session和Connection)</SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-11 22:44:45<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody>robbin的分析很透彻Q对于最后一点,我稍有疑问?<BR><BR></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B>引用:</B></SPAN></TD></TR> <TR> <TD class=quote><BR>对于Spring的OpenSessionInViewFilter来说Q虽然数据库q接被保持了q长的时_但是q没有锁定数据库资源Q特别是事务资源?<BR></TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR>其实我认为数据库q接被保持过长时间有时候会有很大的问题。尤其是对于采用数据q接池的情况Q如果你的数据库q接一直被保持Q那么这个资源就未被释放。假设说q个数据q接池的最大连接数?5Q我感觉很容易造成数据库的q接不够用?<BR><BR>不清楚底层的实现是如何做的,或许我的疑问有些多虑?/SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-11 22:51:56<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B>downpour 写道:</B></SPAN></TD></TR> <TR> <TD class=quote>robbin的分析很透彻Q对于最后一点,我稍有疑问?<BR><BR></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B>引用:</B></SPAN></TD></TR> <TR> <TD class=quote><BR>对于Spring的OpenSessionInViewFilter来说Q虽然数据库q接被保持了q长的时_但是q没有锁定数据库资源Q特别是事务资源?<BR></TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR>其实我认为数据库q接被保持过长时间有时候会有很大的问题。尤其是对于采用数据q接池的情况Q如果你的数据库q接一直被保持Q那么这个资源就未被释放。假设说q个数据q接池的最大连接数?5Q我感觉很容易造成数据库的q接不够用?<BR><BR>不清楚底层的实现是如何做的,或许我的疑问有些多虑?/SPAN></TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR>按道理来_数据库连接应该尽早被释放Q以~解数据库资源的压力Qgq很久才释放Q确实会D需要更多的数据库连接。这个就只能扩大q接池数量,增加数据库最大允许连接数来解决了?<BR><BR>此外QSession被gq很久释放,那么Session占用的一U缓存也会占用比较长旉Q这意味着会无谓消耗更多的JVM内存?<BR><BR>因此QOpenSessionInView虽然实方便Q但是大家还是慎用吧。对于那些页面渲染速度很慢Q拨可接用h量过多的|站最好不要用?/SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-14 10:22:24<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B>引用:</B></SPAN></TD></TR> <TR> <TD class=quote>因此QOpenSessionInView虽然实方便Q但是大家还是慎用吧。对于那些页面渲染速度很慢Q拨可接用h量过多的|站最好不要用?/TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR>切的应该是大ƈ发用户量的情况吧。这个问题一直都存在Q在1q多前我和robbin争论中就提出来了q。hibernate2的代码可以看到session是和connection紧密耦合的(Hibernate3没看q)。但hibernate大部分被用于q发用户可预见的intranet应用Q所以问题也不是很大。如果ƈ发用户多Q对connection pool资源, opensession in view在hibernate中用会构成较大压力。如果jboss j2ee5 server采用hibernate作ؓejb3实现Q没有做修正的话Q同L问题也会存在于jboss j2ee5 server中?/SPAN><span id="wmqeeuq" class=postbody></SPAN><span id="wmqeeuq" class=gensmall><BR><BR>上一ơ由Charlesxp?005-12-14 周三, 上午10:25修改Qd修改??/SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-14 10:22:33<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B>hongliang 写道:</B></SPAN></TD></TR> <TR> <TD class=quote>几天没来Q居然变_֍叅R。。本来我也想做一下robbin的那个测试,l果q几天忙于其它事Q一直没旉。看来OpenSessionInView果然有这个问题,q也是我一直担心的Q看来真是应叻那句话Q“如果一件事可能出错Q那它一定会出错”。。?<BR><BR>不过Q如果不用OpenSessionInViewQ我q真一下子找不到北叻Q从学Hibernate开始就一直在OpenSessionInView的熏陶下长大。。?_-b <BR><BR>Robbin有什么好的办法能够在不用OpenSessionInView的情况下比较好的处理面吗?</TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR>在dao中对要render的集合强制初始化?/SPAN><span id="wmqeeuq" class=postbody></SPAN><span id="wmqeeuq" class=gensmall></SPAN></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD width="100%"><A ><IMG title=文章 height=9 alt=文章 src="http://forum.javaeye.com/templates/subSilver/images/icon_minipost.gif" width=12 border=0></A><span id="wmqeeuq" class=postdetails>旉: 2005-12-14 10:51:52<span id="wmqeeuq" class=gen> </SPAN>   标题: </SPAN></TD> <TD vAlign=top noWrap><A ><IMG title=引用回复 alt=引用回复 src="http://forum.javaeye.com/templates/subSilver/images/lang_chinese_simplified/icon_quote.gif" border=0></A> <A ><IMG title=这个帖子加入我的Blog alt=这个帖子加入我的Blog src="http://forum.javaeye.com/templates/subSilver/images/icon_blog.gif" border=0></A></TD></TR> <TR> <TD colSpan=2> <HR> </TD></TR> <TR> <TD colSpan=2><span id="wmqeeuq" class=postbody></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B>hongliang 写道:</B></SPAN></TD></TR> <TR> <TD class=quote>是不是像q样Q?<BR><BR>foo.getBars()</TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR>Hibernate.initialize(foo.getBars);</SPAN><span id="wmqeeuq" class=postbody></SPAN><span id="wmqeeuq" class=gensmall></SPAN></TD></TR></TBODY></TABLE><img src ="http://www.aygfsteel.com/TrampEagle/aggbug/30094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/TrampEagle/" target="_blank">TrampEagle</a> 2006-02-10 09:52 <a href="http://www.aygfsteel.com/TrampEagle/articles/30094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一关于Spring AOP~程的教E?/title><link>http://www.aygfsteel.com/TrampEagle/articles/27728.html</link><dc:creator>TrampEagle</dc:creator><author>TrampEagle</author><pubDate>Thu, 12 Jan 2006 04:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/TrampEagle/articles/27728.html</guid><wfw:comment>http://www.aygfsteel.com/TrampEagle/comments/27728.html</wfw:comment><comments>http://www.aygfsteel.com/TrampEagle/articles/27728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/TrampEagle/comments/commentRss/27728.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/TrampEagle/services/trackbacks/27728.html</trackback:ping><description><![CDATA[引自Q?A >http://spring.jactiongroup.net/viewtopic.php?t=478</A><BR><BR><span id="wmqeeuq" class=postbody><FONT size=2>q是在网上发现的一关于Spring AOP~程的教E,dq篇文章后,Spring AOP不再难以理解Q因此我把它译成中文Q推荐给Spring AOP的初学者。这是译文的</FONT><A class=postlink target=_blank><FONT color=#5493b4 size=2>链接</FONT></A><FONT size=2>?<BR><BR>AOP正在成ؓ软g开发的下一个圣杯。用AOPQ你可以处理aspect的代码注入主E序Q通常ȝ序的主要目的q不在于处理q些aspect。AOP可以防止代码混ؕ?<BR>Z理解AOP如何做到q点Q考虑一下记日志的工作。日志本w不太可能是你开发的ȝ序的主要d。如果能“不可见的”、通用的日志代码注入主E序中,那该多好啊。AOP可以帮助你做到?<BR>Spring framework是很有前途的AOP技术。作ZU非늕性的Q轻型的AOP frameworkQ你无需使用预编译器或其他的元标{,便可以在JavaE序中用它。这意味着开发团队里只需一对付AOP frameworkQ其他hq是象往怸LE?<BR>AOP是很多直觉难以理解的术语的根源。幸q的是,你只要理解三个概念,可以编写AOP模块。这三个概念是:adviceQpointcut和advisor。advice是你惛_别的E序内部不同的地Ҏ入的代码。pointcut定义了需要注入advice的位|,通常是某个特定的cȝ一个publicҎ。advisor是pointcut和advice的装配器Q是advice注入ȝ序中预定义位|的代码?<BR><BR>既然我们知道了需要用advisor向主要代码中注入“不可见的”adviceQ让我们实现一个Spring AOP的例子。在q个例子中,我们实C个before adviceQ这意味着advice的代码在被调用的publicҎ开始前被执行。以下是q个before advice的实C码: <BR><BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B><FONT size=2>代码:</FONT></B></SPAN></TD></TR> <TR> <TD class=code>package com.company.springaop.test; <BR><BR>import java.lang.reflect.Method; <BR>import org.springframework.aop.MethodBeforeAdvice; <BR><BR>public class TestBeforeAdvice implements MethodBeforeAdvice { <BR><BR>  public void before(Method m, Object[] args, Object target) <BR>  throws Throwable { <BR>    System.out.println("Hello world! (by " <BR>        + this.getClass().getName() <BR>        + ")"); <BR>  } <BR>} <BR> </TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR><FONT size=2>接口MethodBeforeAdvice只有一个方法before需要实玎ͼ它定义了advice的实现。beforeҎq三个参数Q它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名U可以用作判断是否执行代码的条g。Object[] args是传l被调用的publicҎ的参数数l。当需要记日志Ӟ参数args和被执行Ҏ的名Uͼ都是非常有用的信息。你也可以改变传lm的参敎ͼ但要心使用q个功能Q编写最初主E序的程序员q不知道ȝ序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用?<BR><BR>在下面的BeanImplcMQ每个publicҎ调用前,都会执行adviceQ?<BR><BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B><FONT size=2>代码:</FONT></B></SPAN></TD></TR> <TR> <TD class=code>package com.company.springaop.test; <BR><BR>public class BeanImpl implements Bean { <BR><BR>  public void theMethod() { <BR>    System.out.println(this.getClass().getName() <BR>        + "." + new Exception().getStackTrace()[0].getMethodName() <BR>        + "()" <BR>        + " says HELLO!"); <BR>  } <BR>}</TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR><FONT size=2>cBeanImpl实现了下面的接口BeanQ?<BR><BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B><FONT size=2>代码:</FONT></B></SPAN></TD></TR> <TR> <TD class=code>package com.company.springaop.test; <BR><BR>public interface Bean { <BR>  public void theMethod(); <BR>}</TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR><BR><FONT size=2>虽然不是必须使用接口Q但面向接口而不是面向实现编E是良好的编E实践,Spring也鼓p样做?<BR><BR>pointcut和advice通过配置文g来实玎ͼ因此Q接下来你只需~写L法的Java代码Q?<BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B><FONT size=2>代码:</FONT></B></SPAN></TD></TR> <TR> <TD class=code><BR><BR>package com.company.springaop.test; <BR><BR>import org.springframework.context.ApplicationContext; <BR>import org.springframework.context.support.FileSystemXmlApplicationContext; <BR><BR>public class Main { <BR><BR>  public static void main(String[] args) { <BR>    //Read the configuration file <BR>    ApplicationContext ctx <BR>        = new FileSystemXmlApplicationContext("springconfig.xml"); <BR><BR>    //Instantiate an object <BR>    Bean x = (Bean) ctx.getBean("bean"); <BR><BR>    //Execute the public method of the bean (the test) <BR>    x.theMethod(); <BR>  } <BR>}</TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR><BR><FONT size=2>我们从读入和处理配置文g开始,接下来马上要创徏它。这个配|文件将作ؓ_合E序不同部分的“胶水”。读入和处理配置文g后,我们会得C个创建工厂ctx。Q何一个Spring理的对象都必须通过q个工厂来创建。对象通过工厂创徏后便可正怋用?<BR><BR>仅仅用配|文件便可把E序的每一部分l装h?<BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="wmqeeuq" class=genmed><B><FONT size=2>代码:</FONT></B></SPAN></TD></TR> <TR> <TD class=code><BR><?xml version="1.0" encoding="UTF-8"?> <BR><!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <BR><BR><beans> <BR>  <!--CONFIG--> <BR>  <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean"> <BR>    <property name="proxyInterfaces"> <BR>      <value>com.company.springaop.test.Bean</value> <BR>    </property> <BR>    <property name="target"> <BR>      <ref local="beanTarget"/> <BR>    </property> <BR>    <property name="interceptorNames"> <BR>      <list> <BR>        <value>theAdvisor</value> <BR>      </list> <BR>    </property> <BR>  </bean> <BR><BR>  <!--CLASS--> <BR>  <bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/> <BR><BR>  <!--ADVISOR--> <BR>  <!--Note: An advisor assembles pointcut and advice--> <BR>  <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <BR>    <property name="advice"> <BR>      <ref local="theBeforeAdvice"/> <BR>    </property> <BR>    <property name="pattern"> <BR>      <value>com\.company\.springaop\.test\.Bean\.theMethod</value> <BR>    </property> <BR>  </bean> <BR><BR>  <!--ADVICE--> <BR>  <bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/> <BR></beans> <BR> </TD></TR></TBODY></TABLE><span id="wmqeeuq" class=postbody><BR><BR><FONT size=2>四个bean定义的次序ƈ不重要。我们现在有了一个adviceQ一个包含了正则表达式pointcut的advisorQ一个主E序cd一个配|好的接口,通过工厂ctxQ这个接口返回自己本w实现的一个引用?<BR><BR>BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创徏一个bean元素Qƈ指定了一个实现类。这是全部的工作?<BR><BR>advisor通过Spring framework提供的一个RegexMethodPointcutAdvisorcL实现。我们用advisor的一个属性来指定它所需的advice-bean。第二个属性则用正则表辑ּ定义了pointcutQ确保良好的性能和易L?<BR><BR>最后配|的是beanQ它可以通过一个工厂来创徏。bean的定义看h比实际上要复杂。bean是ProxyFactoryBean的一个实玎ͼ它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义Q?<BR><BR></FONT> <UL><BR> <LI>属性proxyInterface定义了接口类?<BR> <LI>属性target指向本地配置的一个beanQ这个beanq回一个接口的实现?<BR> <LI>属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的?<BR></LI></UL><BR><BR><SPAN style="FONT-WEIGHT: bold">Spring工具</SPAN> <BR><BR>虽然你可以手工修改Ant构徏脚本Q但使用SpringUIQ译注:SpringUI现在是Spring framework的一部分Qƈ改名为spring-ideQ,使用Spring AOP变得很简单,只要点点鼠标卛_。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠标,q择“add Spring Project Nature”。在project属性中Q你可以在“Spring Project”下dSpring配置文g。在~译前把下面的类库加入projectQaopalliance.jarQcommons-logging.jarQjakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息: <BR><BR>... (logging information) <BR>Hello world! (by com.company.springaop.test.TestBeforeAdvice) <BR>com.company.springaop.test.BeanImpl.theMethod() says HELLO! <BR><BR><BR><SPAN style="FONT-WEIGHT: bold">优点和缺?/SPAN> <BR><BR>Spring比v其他的framework更有优势Q因为除了AOP以外Q它提供了更多别的功能。作Z个轻型frameworkQ它在J2EE不同的部分都可以发挥作用。因此,即不想使用Spring AOPQ你可能q是想用Spring。另一个优ҎQSpringq不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一开始。读了本文后Q你应该可以更好地理解Spring reference了。Spring唯一的缺Ҏ~Z更多的文档,但它的mailing list是个很好的补充,而且会不断地出现更多的文档?/SPAN><span id="wmqeeuq" class=gensmall><BR></SPAN><img src ="http://www.aygfsteel.com/TrampEagle/aggbug/27728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/TrampEagle/" target="_blank">TrampEagle</a> 2006-01-12 12:45 <a href="http://www.aygfsteel.com/TrampEagle/articles/27728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ҷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɾ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank">ٸ</a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">⴨</a>| <a href="http://" target="_blank">Ʊ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">IJ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">«ɽ</a>| <a href="http://" target="_blank">ˮ</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>