??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品嫩草久久久久,欧美日韩黄色,有码在线播放http://www.aygfsteel.com/supercrsky/category/27531.html专注于JavaWeb开?/description>zh-cnMon, 28 Jan 2008 19:37:51 GMTMon, 28 Jan 2008 19:37:51 GMT60使用Spring的CharacterEncodingFilter应注意的问题http://www.aygfsteel.com/supercrsky/articles/178219.html々上善若水?/dc:creator>々上善若水?/author>Mon, 28 Jan 2008 09:45:00 GMThttp://www.aygfsteel.com/supercrsky/articles/178219.htmlhttp://www.aygfsteel.com/supercrsky/comments/178219.htmlhttp://www.aygfsteel.com/supercrsky/articles/178219.html#Feedback0http://www.aygfsteel.com/supercrsky/comments/commentRss/178219.htmlhttp://www.aygfsteel.com/supercrsky/services/trackbacks/178219.html
<!-- 列表lg导出qo?nbsp;-->
    
<filter>
        
<filter-name>eXtremeExport</filter-name>
        
<filter-class>
            org.extremecomponents.table.filter.ExportFilter
        
</filter-class>
    
</filter>
    
<filter-mapping>
        
<filter-name>eXtremeExport</filter-name>
        
<url-pattern>*.do</url-pattern>
    
</filter-mapping>
    
<!-- 著名 Character Encoding filter -->
    
<filter>
        
<filter-name>encodingFilter</filter-name>
        
<filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        
</filter-class>
        
<init-param>
            
<param-name>encoding</param-name>
            
<param-value>GBK</param-value>
        
</init-param>
    
</filter>
    
<filter-mapping>
        
<filter-name>encodingFilter</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>

看不出有什么问?可当我插入测试数据时全是q.
数据库本w是没有问题?

后来l于扑ֈ了解决的Ҏ,原创列表lg的filter?br /> CharacterEncodingFilter的过滤有影响.调整一下顺序就行了.
<!-- 著名 Character Encoding filter -->
    
<filter>
        
<filter-name>encodingFilter</filter-name>
        
<filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        
</filter-class>
        
<init-param>
            
<param-name>encoding</param-name>
            
<param-value>GBK</param-value>
        
</init-param>
    
</filter>
    
<filter-mapping>
        
<filter-name>encodingFilter</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>
    
<!-- 列表lg导出qo?nbsp;-->
    
<filter>
        
<filter-name>eXtremeExport</filter-name>
        
<filter-class>
            org.extremecomponents.table.filter.ExportFilter
        
</filter-class>
    
</filter>
    
<filter-mapping>
        
<filter-name>eXtremeExport</filter-name>
        
<url-pattern>*.do</url-pattern>
    
</filter-mapping>

调整后CharacterEncodingFilter表现良好,一切正?׃会再出来
q的问题了.

]]>
Spring发送邮件的单例?/title><link>http://www.aygfsteel.com/supercrsky/articles/174712.html</link><dc:creator>々上善若水?/dc:creator><author>々上善若水?/author><pubDate>Fri, 11 Jan 2008 12:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/supercrsky/articles/174712.html</guid><wfw:comment>http://www.aygfsteel.com/supercrsky/comments/174712.html</wfw:comment><comments>http://www.aygfsteel.com/supercrsky/articles/174712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/supercrsky/comments/commentRss/174712.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/supercrsky/services/trackbacks/174712.html</trackback:ping><description><![CDATA[注意在做此例前确认你已经加入?br /> spring-misc相关?br /> 以及mail.jar,activation.jar.<br /> 如没有可到我的网盘下?<br /> bean.xml:<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff"><?</span><span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="color: #0000ff">?></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">beans<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />    xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />    xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="mailSender"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="org.springframework.mail.javamail.JavaMailSenderImpl"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #008000"><!--</span><span style="color: #008000"> mail提供?nbsp;</span><span style="color: #008000">--></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="host"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: #0000ff"><</span><span style="color: #800000">value</span><span style="color: #0000ff">></span><span style="color: #000000">smtp.163.com</span><span style="color: #0000ff"></</span><span style="color: #800000">value</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="javaMailProperties"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: #0000ff"><</span><span style="color: #800000">props</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: #008000"><!--</span><span style="color: #008000"> 用户认证 </span><span style="color: #008000">--></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: #0000ff"><</span><span style="color: #800000">prop </span><span style="color: #ff0000">key</span><span style="color: #0000ff">="mail.smtp.auth"</span><span style="color: #0000ff">></span><span style="color: #000000">true</span><span style="color: #0000ff"></</span><span style="color: #800000">prop</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: #0000ff"><</span><span style="color: #800000">prop </span><span style="color: #ff0000">key</span><span style="color: #0000ff">="mail.smtp.timeout"</span><span style="color: #0000ff">></span><span style="color: #000000">25000</span><span style="color: #0000ff"></</span><span style="color: #800000">prop</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: #0000ff"></</span><span style="color: #800000">props</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #008000"><!--</span><span style="color: #008000"> 用户?nbsp;</span><span style="color: #008000">--></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: #0000ff"><</span><span style="color: #800000">value</span><span style="color: #0000ff">></span><span style="color: #000000">78688287</span><span style="color: #0000ff"></</span><span style="color: #800000">value</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #008000"><!--</span><span style="color: #008000"> 密码 </span><span style="color: #008000">--></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            </span><span style="color: #0000ff"><</span><span style="color: #800000">value</span><span style="color: #0000ff">></span><span style="color: #000000">******</span><span style="color: #0000ff"></</span><span style="color: #800000">value</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #0000ff"></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"></</span><span style="color: #800000">beans</span><span style="color: #0000ff">></span></div> <br /> MailTest.java:<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> com;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.context.ApplicationContext;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.context.support.FileSystemXmlApplicationContext;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.mail.MailSender;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.mail.SimpleMailMessage;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> MailTest<br /> <img id="Codehighlighter1_263_799_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_799_Open_Text.style.display='none'; Codehighlighter1_263_799_Closed_Image.style.display='inline'; Codehighlighter1_263_799_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_263_799_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_263_799_Closed_Text.style.display='none'; Codehighlighter1_263_799_Open_Image.style.display='inline'; Codehighlighter1_263_799_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span id="Codehighlighter1_263_799_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_263_799_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args)<br /> <img id="Codehighlighter1_307_796_Open_Image" onclick="this.style.display='none'; Codehighlighter1_307_796_Open_Text.style.display='none'; Codehighlighter1_307_796_Closed_Image.style.display='inline'; Codehighlighter1_307_796_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_307_796_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_307_796_Closed_Text.style.display='none'; Codehighlighter1_307_796_Open_Image.style.display='inline'; Codehighlighter1_307_796_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span id="Codehighlighter1_307_796_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_307_796_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">得到spring的context对象</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        ApplicationContext ctx </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileSystemXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">/src/com/bean.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">mail提供?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        MailSender sender </span><span style="color: #000000">=</span><span style="color: #000000"> (MailSender) ctx.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">mailSender</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">创徏一个简单mail消息对象</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        SimpleMailMessage smm </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> SimpleMailMessage();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">收g?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        smm.setTo(</span><span style="color: #000000">"</span><span style="color: #000000">zdw@live.cn</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">发g人地址</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        smm.setFrom(</span><span style="color: #000000">"</span><span style="color: #000000">78688287@163.com</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">标题</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        smm.setSubject(</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">内容</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        smm.setText(</span><span style="color: #000000">"</span><span style="color: #000000">q是关于Spring Mail抽象层的单测?/span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">发?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        sender.send(smm);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">提示信息</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Send Ok!!</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> l测试一切正? <img src ="http://www.aygfsteel.com/supercrsky/aggbug/174712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/supercrsky/" target="_blank">々上善若水?/a> 2008-01-11 20:32 <a href="http://www.aygfsteel.com/supercrsky/articles/174712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的W一个aspectJE序http://www.aygfsteel.com/supercrsky/articles/174381.html々上善若水?/dc:creator>々上善若水?/author>Thu, 10 Jan 2008 10:04:00 GMThttp://www.aygfsteel.com/supercrsky/articles/174381.htmlhttp://www.aygfsteel.com/supercrsky/comments/174381.htmlhttp://www.aygfsteel.com/supercrsky/articles/174381.html#Feedback0http://www.aygfsteel.com/supercrsky/comments/commentRss/174381.htmlhttp://www.aygfsteel.com/supercrsky/services/trackbacks/174381.html
package com;

public class MyClass
{
    
public void foo(int age, String name)
    
{
        System.out.println(
"Inside foo(int,String)");
    }


    
public static void main(String[] args)
    
{
        MyClass myClass 
= new MyClass();
        myClass.foo(
1"zdw");
    }


}

HelloWorld.aj:
package com;

public aspect HelloWorld
{
    
//切入?/span>
    pointcut callPointcut() : call(void MyClass.foo(int,String));
    
//前置通知
    before() : callPointcut()
    
{
        System.out.println(
"Hello World");
        System.out.println(
"In the advice attached to the call pointcut");
    }

}
    


]]>
使用Springq行面向切面~程QAOPQ?/title><link>http://www.aygfsteel.com/supercrsky/articles/174368.html</link><dc:creator>々上善若水?/dc:creator><author>々上善若水?/author><pubDate>Thu, 10 Jan 2008 09:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/supercrsky/articles/174368.html</guid><wfw:comment>http://www.aygfsteel.com/supercrsky/comments/174368.html</wfw:comment><comments>http://www.aygfsteel.com/supercrsky/articles/174368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/supercrsky/comments/commentRss/174368.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/supercrsky/services/trackbacks/174368.html</trackback:ping><description><![CDATA[     摘要: ?面向切面~程QAOPQ提供另外一U角度来思考程序结构,通过q种方式弥补了面向对象编E(OOPQ的不?除了c(classesQ以外,AOP提供?切面。切面对x点进行模块化Q例如横切多个类型和对象的事务管理?Q这些关注点术语通常UC 横切QcrosscuttingQ?x炏V) Spring的一个关键的lg是 AOP框架?管如此QSpring IoC容器q不依赖于AOPQ这...  <a href='http://www.aygfsteel.com/supercrsky/articles/174368.html'>阅读全文</a><img src ="http://www.aygfsteel.com/supercrsky/aggbug/174368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/supercrsky/" target="_blank">々上善若水?/a> 2008-01-10 17:40 <a href="http://www.aygfsteel.com/supercrsky/articles/174368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP初探http://www.aygfsteel.com/supercrsky/articles/171909.html々上善若水?/dc:creator>々上善若水?/author>Mon, 31 Dec 2007 13:48:00 GMThttp://www.aygfsteel.com/supercrsky/articles/171909.htmlhttp://www.aygfsteel.com/supercrsky/comments/171909.htmlhttp://www.aygfsteel.com/supercrsky/articles/171909.html#Feedback0http://www.aygfsteel.com/supercrsky/comments/commentRss/171909.htmlhttp://www.aygfsteel.com/supercrsky/services/trackbacks/171909.html AOP正在成ؓ软g开发的下一个圣杯。用AOPQ你可以处理aspect的代码注入主E序Q通常ȝ序的主要目的q不在于处理q些aspect。AOP可以防止代码混ؕ?
Z理解AOP如何做到q点Q考虑一下记日志的工作。日志本w不太可能是你开发的ȝ序的主要d。如果能?#8220;不可见的”、通用的日志代码注入主E序中,那该多好啊。AOP可以帮助你做到?
Spring framework是很有前途的AOP技术。作ZU非늕性的Q轻型的AOP frameworkQ你无需使用预编译器或其他的元标{,便可以在JavaE序中用它。这意味着开发团队里只需一对付AOP frameworkQ其他hq是象往怸LE?
AOP是很多直觉难以理解的术语的根源。幸q的是,你只要理解三个概念,可以编写AOP模块。这三个概念是:adviceQpointcut?advisor。advice是你惛_别的E序内部不同的地Ҏ入的代码。pointcut定义了需要注入advice的位|,通常是某个特定的cȝ一?publicҎ。advisor是pointcut和advice的装配器Q是advice注入ȝ序中预定义位|的代码?

既然我们知道了需要用advisor向主要代码中注入“不可见的”adviceQ让我们实现一个Spring AOP的例子。在q个例子中,我们实C个before adviceQ这意味着advice的代码在被调用的publicҎ开始前被执行。以下是q个before advice的实C码:

package com.company.springaop.test; 

import java.lang.reflect.Method; 
import org.springframework.aop.MethodBeforeAdvice; 

public class TestBeforeAdvice implements MethodBeforeAdvice 

  
public void before(Method m, Object[] args, Object target) 
  
throws Throwable 
    System.out.println(
"Hello world! (by " 
        
+ this.getClass().getName() 
        
+ ")"); 
  }
 
}
 


接口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对象的引用?

在下面的BeanImplcMQ每个publicҎ调用前,都会执行adviceQ?

package com.company.springaop.test; 

public class BeanImpl implements Bean 

  
public void theMethod() 
    System.out.println(
this.getClass().getName() 
        
+ "." + new Exception().getStackTrace()[0].getMethodName() 
        
+ "()" 
        
+ " says HELLO!"); 
  }
 
}


cBeanImpl实现了下面的接口BeanQ?

package com.company.springaop.test; 

public interface Bean 
  
public void theMethod(); 
}



虽然不是必须使用接口Q但面向接口而不是面向实现编E是良好的编E实践,Spring也鼓p样做?

pointcut和advice通过配置文g来实玎ͼ因此Q接下来你只需~写L法的Java代码Q?
package com.company.springaop.test; 

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

public class Main 

  
public static void main(String[] args) 
    
//Read the configuration file 
    ApplicationContext ctx 
        
= new FileSystemXmlApplicationContext("springconfig.xml"); 

    
//Instantiate an object 
    Bean x = (Bean) ctx.getBean("bean"); 

    
//Execute the public method of the bean (the test) 
    x.theMethod(); 
  }
 
}



我们从读入和处理配置文g开始,接下来马上要创徏它。这个配|文件将作ؓ_合E序不同部分?#8220;胶水”。读入和处理配置文g后,我们会得C个创建工厂ctx。Q何一个Spring理的对象都必须通过q个工厂来创建。对象通过工厂创徏后便可正怋用?

仅仅用配|文件便可把E序的每一部分l装h?
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 
  
<!--CONFIG--> 
  
<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    
<property name="proxyInterfaces"> 
      
<value>com.company.springaop.test.Bean</value> 
    
</property> 
    
<property name="target"> 
      
<ref local="beanTarget"/> 
    
</property> 
    
<property name="interceptorNames"> 
      
<list> 
        
<value>theAdvisor</value> 
      
</list> 
    
</property> 
  
</bean> 

  
<!--CLASS--> 
  
<bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/> 

  
<!--ADVISOR--> 
  
<!--Note: An advisor assembles pointcut and advice--> 
  
<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
    
<property name="advice"> 
      
<ref local="theBeforeAdvice"/> 
    
</property> 
    
<property name="pattern"> 
      
<value>com\.company\.springaop\.test\.Bean\.theMethod</value> 
    
</property> 
  
</bean> 

  
<!--ADVICE--> 
  
<bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/> 
</beans> 


四个bean定义的次序ƈ不重要。我们现在有了一个adviceQ一个包含了正则表达式pointcut的advisorQ一个主E序cd一个配|好的接口,通过工厂ctxQ这个接口返回自己本w实现的一个引用?

BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创徏一个bean元素Qƈ指定了一个实现类。这是全部的工作?

advisor通过Spring framework提供的一个RegexMethodPointcutAdvisorcL实现。我们用advisor的一个属性来指定它所需?advice-bean。第二个属性则用正则表辑ּ定义了pointcutQ确保良好的性能和易L?

最后配|的是beanQ它可以通过一个工厂来创徏。bean的定义看h比实际上要复杂。bean是ProxyFactoryBean的一个实玎ͼ它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义Q?


  • 属性proxyInterface定义了接口类?
  • 属性target指向本地配置的一个beanQ这个beanq回一个接口的实现?
  • 属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的?


Spring工具

虽然你可以手工修改Ant构徏脚本Q但使用SpringUIQ译注:SpringUI现在是Spring framework的一部分Qƈ改名为spring-ideQ,使用Spring AOP变得很简单,只要点点鼠标卛_。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠标,q择“add Spring Project Nature”。在project属性中Q你可以?#8220;Spring Project”下添加Spring配置文g。在~译前把下面的类库加入projectQaopalliance.jarQcommons- logging.jarQjakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息:

 (logging information) 
Hello world! (by com.company.springaop.test.TestBeforeAdvice) 
com.company.springaop.test.BeanImpl.theMethod() says HELLO! 



优点和缺?/span>

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>
 


]]>
反向控制和面向切面编E在Spring的应?/title><link>http://www.aygfsteel.com/supercrsky/articles/171903.html</link><dc:creator>々上善若水?/dc:creator><author>々上善若水?/author><pubDate>Mon, 31 Dec 2007 13:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/supercrsky/articles/171903.html</guid><wfw:comment>http://www.aygfsteel.com/supercrsky/comments/171903.html</wfw:comment><comments>http://www.aygfsteel.com/supercrsky/articles/171903.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/supercrsky/comments/commentRss/171903.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/supercrsky/services/trackbacks/171903.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><strong>引言</strong> <br /> <br />   在J2EE的整个发展历E中Q现在正是一个非常时刅R从很多斚w来说QJ2EE都是一个伟大的成功Q它成功地在从前没有标准的地方徏立了标准Q大大提升了企业UY件的开攄度,q且得到了整个行业和开发者的q泛认可。然而,J2EE在一些方面已l开始捉襟见肘。J2EE应用开发的成本通常很高。J2EE应用目臛_和从前的非J2EE目一样容易失败——如果不是更Ҏp|的话。这Lp|率高得让人难以接受。在q样的失败率之下QY件开发几乎变成了运气。而在J2EE遭遇p|的场景中QEJB通常都扮演着重要的角艌Ӏ因此,J2EEC不断地向着更简单的解决Ҏ、更用EJB的方向发?sup>[1]</sup>。然而,每个应用E序都需要一些基设施Q拒l用EJBq不意味着拒绝EJB所采用的基设施解决Ҏ。那么,如何利用现有的框架来提供q些基础设施服务呢,伴随着q个问题的提出,一个轻量的J2EE解决Ҏ出现了,q就是Spring Framework?br /> <br />   Spring是ؓ化企业pȝ开发而诞生的QSpring框架为J2EE应用常见的问题提供了单、有效的解决ҎQ用SpringQ你可以用简单的POJO(Plain Old Java Object)来实现那些以前只有EJB才能实现的功能。这样不只是能简化服务器端开发,MJavapȝ开发都能从Spring的简单、可试和松耦合特征中受益。可以简单的_Spring是一个轻量的反向控ӞIoCQ和面向切面~程QAOPQ容器框?sup>[3]</sup>。Spring IoCQ借助于依赖注入设计模式,使得开发者不用理会对象自w的生命周期及其关系Q而且能够改善开发者对J2EE模式的用;Spring AOPQ借助于Spring实现的拦截器Q开发者能够实C声明的方式用企业服务Q比如安全性服务、事务服务等。Spring IoC?Spring ; AOPl合Q一起Ş成了SpringQ这样一个有机整体,使得构徏轻量U的J2EE架构成ؓ可能Q而且事实证明Q非常有效。没有Spring IoC的Spring AOP是不完善的,没有Spring AOP的Spring IoC是不健壮的。本文是以Spring架构的成功的实际商务pȝ目景,阐述了反向控制原理和面向切面的编E技术在Spring框架中的应用Q同时抽取适量代码C意具体应用Qƈ和传l开发模式进行对比,展示了Spring framework的简单,高效Q可l护{优炏V?br /> <br />   <strong>1、Spring IoC 1.1 反向控制原理 </strong><br /> <br />   反向控制是Spring框架的核心。但是,反向控制是什么意思?到底控制的什么方面被反向了呢Q?004q美国专家Martin Fowler发表了一论文《Inversion of Control Containers and the Dependency Injection pattern》阐qCq个问题Q他ȝ说是获得依赖对象的方式反向了Q根据这个启C,他还为反向控制提Z一个更贴切的名字:Dependency Injection(DI 依赖注入)?br /> <br />   通常Q应用代码需要告知容器或框架,让它们找到自w所需要的c?然后再由应用代码创徏待用的对象实例。因此,应用代码在用实例之前,需要创建对象实例。然而,IoC模式?创徏对象实例的Q务交lIoC容器或框?实现了IoC设计模式的框架也被称为IoC容器)Q得应用代码只需要直接用实例,q就是IoC。相对IoC 而言Q?#8220;依赖注入”的确更加准确的描qCq种设计理念。所谓依赖注入,即组件之间的依赖关系由容器在q行期决定,形象的来_即由容器动态的某U依赖关pL入到lg之中?br /> <br />   1.2 IoC在Spring中的实现 <br /> <br />   M重要的系l都需要至两个相互合作的cL完成业务逻辑。通常Q每个对象都要自p责得到它的合作(依赖Q对象。你会发玎ͼq样会导致代码耦合度高而且难于试。用IoCQ对象的依赖都是在对象创建时p责协调系l中各个对象的外部实体提供的Q这样软glg松散q接成ؓ可能。下面示意了Spring IoC 应用Q步骤如下:<br /> <br />   Q?Q定义Action接口Qƈ为其定义一个executeҎQ以完成目标逻辑。多q前QGoF在《Design PatternQElements of Reusable Object-Oriented Software》一书中提出“Programming to an InterfaceQnot an implementation”的原则,q里首先业务对象抽象成接口Q正是ؓ了实施这个原则?br /> <br />   Q?Q类UpperAction实现Action接口Q在此类中,定义一个String型的域messageQƈ提供相应的setter和getterҎQ实现的executeҎ如下Q?br /> <br /> </span></span> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_35_84_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_84_Open_Text.style.display='none'; Codehighlighter1_35_84_Closed_Image.style.display='inline'; Codehighlighter1_35_84_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_35_84_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_35_84_Closed_Text.style.display='none'; Codehighlighter1_35_84_Open_Image.style.display='inline'; Codehighlighter1_35_84_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /><span style="color: #0000ff">public</span><span style="color: #000000"> String execute (String str) </span><span id="Codehighlighter1_35_84_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_35_84_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> </span><span style="color: #0000ff">return</span><span style="color: #000000"> (getMessage () </span><span style="color: #000000">+</span><span style="color: #000000"> str).toUpperCase () ;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div> <br /> <span style="font-family: Comic Sans MS"><span style="font-size: 12pt">  Q?Q编写Spring配置文gQbean.xmlQ?br /> <br /> </span></span> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">QbeansQ?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />Qbean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">TheAction</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">net.chen.spring.qs.UpperAction</span><span style="color: #000000">"</span><span style="color: #000000">Q?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />Qproperty name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">Q?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />QvalueQHeLLoQ?/span><span style="color: #000000">/</span><span style="color: #000000">valueQ?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />Q?/span><span style="color: #000000">/</span><span style="color: #000000">propertyQ?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />Q?/span><span style="color: #000000">/</span><span style="color: #000000">beanQ?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />Q?/span><span style="color: #000000">/</span><span style="color: #000000">beansQ?/span></div> <br /> <span style="font-family: Comic Sans MS"><span style="font-size: 12pt">  Q?Q测试代?br /> <br /> </span></span> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_30_204_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_204_Open_Text.style.display='none'; Codehighlighter1_30_204_Closed_Image.style.display='inline'; Codehighlighter1_30_204_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_30_204_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_30_204_Closed_Text.style.display='none'; Codehighlighter1_30_204_Open_Image.style.display='inline'; Codehighlighter1_30_204_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> testQuickStart () </span><span id="Codehighlighter1_30_204_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_30_204_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> ApplicationContext ctx</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> FileSystemXmlApplicationContext (</span><span style="color: #000000">"</span><span style="color: #000000">bean.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> Action a</span><span style="color: #000000">=</span><span style="color: #000000"> (Action) ctx.getBean (</span><span style="color: #000000">"</span><span style="color: #000000">TheAction</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> System.out.println (a. execute (</span><span style="color: #000000">"</span><span style="color: #000000">Rod Johnson</span><span style="color: #000000">"</span><span style="color: #000000">));<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div> <br /> <span style="font-family: Comic Sans MS"><span style="font-size: 12pt">  上面的测试代码中Q我们根?bean.xml"创徏了一个ApplicationContext实例Qƈ从此实例中获取我们所需的Action实现Q运行测试代码,我们看到控制台输出:<br /> <br /> </span></span> <table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"> <tbody> <tr> <td><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">……<br /> HELLO ROD JOHNSON</span></span></td> </tr> </tbody> </table> <br /> <span style="font-family: Comic Sans MS"><span style="font-size: 12pt">  仔细观察一下上面的代码Q可以看刎ͼ<br /> <br />   Q?Q我们的lgq不需要实现框架指定的接口Q因此可以轻杄组件从Spring中脱,甚至不需要Q何修改,q在ZEJB框架实现的应用中是难以想象的?br /> <br />   Q?Q组仉的依赖关pd,极大改善了代码的可重用性。Spring的依赖注入机Ӟ可以在运行期为组仉|所需资源Q而无需在编写组件代码时加以指定,从而在相当E度上降低了lg之间的耦合?br /> <br />   Springl我们带来了如此q般的好处,那么Q反q来Q让我们试想一下,如果不用Spring框架Q回到我们传l的~码模式Q情况会是怎样呢?<br /> <br />   首先Q我们必ȝ写一个配|文件读取类Q以实现Message属性的可配|化?br /> <br />   其次Q得有一个Factory模式的实玎ͼq结合配|文件的d完成Action的动态加载。于是,我们实现了一个ActionFactory来实现这个功能:<br /> <br /> </span></span> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_27_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_481_Open_Text.style.display='none'; Codehighlighter1_27_481_Closed_Image.style.display='inline'; Codehighlighter1_27_481_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_27_481_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_27_481_Closed_Text.style.display='none'; Codehighlighter1_27_481_Open_Image.style.display='inline'; Codehighlighter1_27_481_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> ActionFactory </span><span id="Codehighlighter1_27_481_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_27_481_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_81_480_Open_Image" onclick="this.style.display='none'; Codehighlighter1_81_480_Open_Text.style.display='none'; Codehighlighter1_81_480_Closed_Image.style.display='inline'; Codehighlighter1_81_480_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_81_480_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_81_480_Closed_Text.style.display='none'; Codehighlighter1_81_480_Open_Image.style.display='inline'; Codehighlighter1_81_480_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /> </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> Action getAction (String actionName) </span><span id="Codehighlighter1_81_480_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_81_480_Open_Text"><span style="color: #000000">{Properties pro </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Properties ();<br /> <img id="Codehighlighter1_123_436_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_436_Open_Text.style.display='none'; Codehighlighter1_123_436_Closed_Image.style.display='inline'; Codehighlighter1_123_436_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_123_436_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_436_Closed_Text.style.display='none'; Codehighlighter1_123_436_Open_Image.style.display='inline'; Codehighlighter1_123_436_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /> </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_123_436_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_123_436_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  pro.load (</span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream (</span><span style="color: #000000">"</span><span style="color: #000000">config.properties</span><span style="color: #000000">"</span><span style="color: #000000">));<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  String actionImplName </span><span style="color: #000000">=</span><span style="color: #000000">(String)pro.get(actionName);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  String actionMessage </span><span style="color: #000000">=</span><span style="color: #000000">(String) pro.get (actionName</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">_msg</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  Object obj </span><span style="color: #000000">=</span><span style="color: #000000">Class.forName (actionImplName).newInstance ();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  BeanUtils.setProperty(obj,</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">,actionMessage);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">return</span><span style="color: #000000"> (Action) obj;<br /> <img id="Codehighlighter1_470_478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_470_478_Open_Text.style.display='none'; Codehighlighter1_470_478_Closed_Image.style.display='inline'; Codehighlighter1_470_478_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_470_478_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_470_478_Closed_Text.style.display='none'; Codehighlighter1_470_478_Open_Image.style.display='inline'; Codehighlighter1_470_478_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /> }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (FileNotFoundException e) </span><span id="Codehighlighter1_470_478_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_470_478_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  ……<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" /> }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span></div> </span><br /> <span style="font-family: Comic Sans MS"><span style="font-size: 12pt">  配置文g则采用properties文g形式如下所C:<br /> <br /> </span></span> <table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1"> <tbody> <tr> <td><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">TheAction=net.chen.spring.qs.UpperAction<br /> TheAction_msg=HeLLo</span></span></td> </tr> </tbody> </table> <br /> <span style="font-family: Comic Sans MS">  试代码也作相应修改。现在不论实现的好坏QM通过上面新增的多行代码,l于实现了类似的功能。如果现在有了一个新的需求,q样q个ActionFactory每次都新Z个类的实例,昄q对pȝ性能不利Q考虑到我们的两个Action都是U程安全的,修改一下ActionFactoryQ保持系l中只有一个Action实例供其它线E调用。另外Action对象创徏后,需要做一些初始化工作。修改一下ActionFactoryQ其在创徏Action实例之后Q随卛_调用Action.initҎ执行初始化。Action的处理这样就差不多了。下面我们来看看另外一个Factory<br /> <br />   ……<br /> <br />   往往q些pȝ开发中最常见的需求,会导致我们的代码q速膨胀Q而Spring IoC的出玎ͼ则大大缓解了q样的窘境。通过以上实例Q可以看出,Spring IoC为我们提供了如下几方面的优势Q?br /> <br />   Q?Q应用组件不需要在q行时寻扑օ协作者,因此更易于开发和~写应用Q?br /> <br />   Q?Q由于借助于IoC容器理lg的依赖关p,使得应用的单元测试和集成试更利于展开Q?br /> <br />   Q?Q通常Q在借助于IoC容器关系业务对象的前提下Q很需要用具体IoC容器提供的APIQ这使得集成现有的遗留应用成为可能?br /> <br />   因此Q通过使用IoC能够降低lg之间的耦合度,最l,能够提高cȝ重用性,利于试Q而且更利于整个品或pȝ集成和配|?br /> </span> <img src ="http://www.aygfsteel.com/supercrsky/aggbug/171903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/supercrsky/" target="_blank">々上善若水?/a> 2007-12-31 21:40 <a href="http://www.aygfsteel.com/supercrsky/articles/171903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中如何加载多个配|文?/title><link>http://www.aygfsteel.com/supercrsky/articles/170441.html</link><dc:creator>々上善若水?/dc:creator><author>々上善若水?/author><pubDate>Wed, 26 Dec 2007 00:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/supercrsky/articles/170441.html</guid><wfw:comment>http://www.aygfsteel.com/supercrsky/comments/170441.html</wfw:comment><comments>http://www.aygfsteel.com/supercrsky/articles/170441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/supercrsky/comments/commentRss/170441.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/supercrsky/services/trackbacks/170441.html</trackback:ping><description><![CDATA[<p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">Spring加蝲多个配置文g的方?/span></span></p> <p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><span id="wmqeeuq" class="STYLE1">1.W一U,使用数组</span><br /> 代码<br /> </span></span></p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">ApplicationContext contex</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> ClassXmlApplicationContext(</span><span style="color: #0000ff">new</span><span style="color: #000000"> String[</span><span style="color: #000000">"</span><span style="color: #000000">a1.xml</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">a2.xml</span><span style="color: #000000">"</span><span style="color: #000000">]); </span></span></span></div> <p><span style="font-family: Comic Sans MS"><br /> </span> </p> <p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><span id="wmqeeuq" class="STYLE1">2.W二U,只用通配W?/span><br /> 代码<br /> </span></span></p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">ApplicationContext contex</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> ClassXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">a*.xml</span><span style="color: #000000">"</span><span style="color: #000000">);</span></span></span></div> <p><br /> <span style="font-family: Comic Sans MS"><span style="font-size: 12pt">//但此U方法只Ҏ件系l中的xml文g有效Q针对jar包中的无?<br /> </span></span></p> <p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><span id="wmqeeuq" class="STYLE1">3.W三U,引入</span><br /> 代码<br /> </span></span></p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">ApplicationContext contex</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> ClassXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">a1.xml</span><span style="color: #000000">"</span></span></span><span style="color: #000000"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">); <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></span></span></div> <p><br /> <span style="font-family: Comic Sans MS"><span style="font-size: 12pt">//在a1.xml?<br /> <br /> </span></span></p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000"><</span><span style="color: #0000ff">import</span><span style="color: #000000"> resource</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">a2.xml</span><span style="color: #000000">"</span><span style="color: #000000">/></span><span style="color: #008000">//</span></span></span></div> <p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">执行resource路径为相对a1.xml的\?</span></span></p> <img src ="http://www.aygfsteel.com/supercrsky/aggbug/170441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/supercrsky/" target="_blank">々上善若水?/a> 2007-12-26 08:04 <a href="http://www.aygfsteel.com/supercrsky/articles/170441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP学习体会http://www.aygfsteel.com/supercrsky/articles/164589.html々上善若水?/dc:creator>々上善若水?/author>Sun, 02 Dec 2007 01:03:00 GMThttp://www.aygfsteel.com/supercrsky/articles/164589.htmlhttp://www.aygfsteel.com/supercrsky/comments/164589.htmlhttp://www.aygfsteel.com/supercrsky/articles/164589.html#Feedback0http://www.aygfsteel.com/supercrsky/comments/commentRss/164589.htmlhttp://www.aygfsteel.com/supercrsky/services/trackbacks/164589.html


需明确的几个概?
                                                  
1、通知(Advice)Q用于告知系l将有哪些新的行为?br /> 2、切入点(Pointcut):定义了通知应该在应用到那些q接?br /> 3、目标对?/span>(Target)Q被通知的对象?br /> 4?/span> 代理(Proxy)Q将通知应用到目标对象后创徏的对象?/span>

Spring有两U代理创建方式:

     1.如果目标对象实现了一个或多个接口暴露的方法,Spring?/span>JDK?/span>java.lang.reflect.Proxy创徏代理。这个类?/span>Spring动态生一个新的类Q它实现了所需的接口,l入了通知Qƈ且代理目标的所有请求。(q篇主要介绍q个方式Q?/span>

2.如果目标对象没有实现M接口Q?span style="font-family: 'Courier New'">Spring使用CGLIB库生成目标对象的子类。在创徏q个子类的时候,Spring通知l入Qƈ且将对目标对象的调用委托l这个子cR?/span>

 下面以一个实例说?span style="font-family: 'Courier New'">Spring AOP的基本开发方法:

一Q?/span>创徏通知

Springq接Ҏ型是建立在方法拦截上Q这意味着你编写的Spring通知会在Ҏ调用周围的各个地方织入系l中?/span>

?/span>1

    TestAopServiceAdvice实现了接?/span>MethodBeforeAdvice(前置通知)Qƈ实现它的惟一的方?/span>beforeQ这个类可以在调用目标对象前被调用。同Lq有AfterReturningAdvice(后置通知)Q?/span>MethodInterceptor(环绕通知)Q异帔R知(ThrowsAdvice)Q引入通知{?/span>

    在这个方法中我们输出了一个字W串TestAopServiceAdviceQ用于验证这个方法是否在目标对象前调用了?/span>

注意Q?/span>我们无法改变beforeҎ中的参数args?/span>target中的|args中存的是原来要传入目标对象的变量Q?/span>targetx目标对象?/span>

 二.配置Spring XML配置文g

要在Spring中实?/span>AOPQ一般情况下需要配|?/span>4?/span>beanQ?/span>

1Q?/span>目标对象Q?/span>targetQ?/span>

2Q?/span>通知(advice)

3Q?/span>切入?/span>(pointcut)

4Q?/span>代理(proxy)

?/span>2

切入点又分ؓ静态切入点和动态切入点
1?/span> 静态切入点的意思是通知L被执?/span>,
也是最常用的一U切入点?br /> 2?/span>   动态切入点Ҏq行时方法的参数值决定通知是否被执行?/span>

在图2中,定义了用了一?/span>Spring提供的静态切入点

    NameMatchMethodPointAdvisorQ它保证了当被调用的Ҏ的名字与l出的映名字相匚w的时候,q个切入Ҏ匚w?/span>

   Spring提供的另一个静态切入点?/span>RegexpMethodPointcutAdvisorQ让你可以利用正则表辑ּ来定义切入点.

 使用ProxyBeanFactory可以创徏一个被通知的类Q即代理对象。它的最常用?/span>?/span>个控制行为的属性是:
1?/span>proxyInterfaces
Q代理应该实现的接口列表
2?/span>interceptorNamesQ需要应用到目标对象上的通知Bean的名字。可以是拦截器?/span>Advisor或其他通知cȝ名字?/span>

注:在用容器?/span>getBeanҎӞ应该?/span>getBean(代理cȝ名字)Q而不?/span>getBean(目标对象的名?/span>)Q否?/span>AOP无法工作?/span>



]]>
Spring中bean的作用域http://www.aygfsteel.com/supercrsky/articles/162778.html々上善若水?/dc:creator>々上善若水?/author>Sat, 24 Nov 2007 00:55:00 GMThttp://www.aygfsteel.com/supercrsky/articles/162778.htmlhttp://www.aygfsteel.com/supercrsky/comments/162778.htmlhttp://www.aygfsteel.com/supercrsky/articles/162778.html#Feedback0http://www.aygfsteel.com/supercrsky/comments/commentRss/162778.htmlhttp://www.aygfsteel.com/supercrsky/services/trackbacks/162778.html如何使用spring的作用域Q?br /> <bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
q里?/span>scope是用来配置spring bean的作用域Q它标识bean的作用域?/span>

     ?span>spring2.0之前bean只有2U作用域卻Isingleton(单例)、non-singletonQ也UprototypeQ? Spring2.0以后Q增加了session、request、global session三种专用于Web应用E序上下文的Bean。因此,默认情况下Spring2.0现在有五U类型的Bean。当ӞSpring2.0对Bean的类型的设计q行了重构,q设计出灉|的Beancd支持Q理Z可以有无数多U类型的BeanQ用户可以根据自q需要,增加新的BeancdQ满_际应用需求?/span>
1、singleton作用?br /> 当一?span>bean?/span>作用?/span>讄?span>singleton, 那么Spring IOC容器中只会存在一个共享的bean实例Qƈ且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换a之,当把一个bean定义讄为singleton作用域时QSpring IOC容器只会创徏该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cacheQ中Qƈ且所有针对该bean的后l请求和引用都将q回被缓存的对象实例Q这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的Q单例设计模式表CZ个ClassLoader中只有一个class存在Q而这里的singleton则表CZ个容器对应一个beanQ也是说当一个bean被标识ؓsingleton时候,spring的IOC容器中只会存在一个该bean?/span>

配置实例Q?br /> <bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/> 或?/span><bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>

2、prototype     
prototype作用域部|的beanQ每一ơ请求(其注入到另一个bean中,或者以E序的方式调用容器的getBean()ҎQ都会生一个新的bean实例Q相当一个new的操作,对于prototype作用域的beanQ有一炚w帔R要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配|、装饰或者是装配完一?span>prototype实例后,它交给客户端,随后对该prototype实例不闻不问了。不何U作用域Q容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言QQ何配|好的析构生命周期回调方法都不会被调用
。清除prototype作用域的对象q放Q何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一U可行方式是Q通过使用bean的后|处理器Q该处理器持有要被清除的bean的引用。)
配置实例Q?br /> <bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/
>
或?span style="font-size: 10pt; color: teal"><
beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/> 3、request    request表示该针Ҏ一?span>HTTPh都会产生一个新的beanQ同时该bean仅在当前HTTP request内有效?/span>request?span>session、global session使用的时候首先要在web.xml中做如下配置Q?/span>
     如果你用的?span>Servlet 2.4及以上的web容器Q那么你仅需要在web应用的XML声明文g
web.xml中增加下qContextListener卛_Q?br />
 <web-app>
  ...
  
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  
</listener>
  ...
</web-app>

Q如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实玎ͼ
<web-app>
 ..
 
<filter> 
    
<filter-name>requestContextFilter</filter-name>
 
    
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>

 
</filter> 
 
<filter-mapping>
 
    
<filter-name>requestContextFilter</filter-name>
 
    
<url-pattern>/*</url-pattern>

 
</filter-mapping>
  ...
</web-app>

接着既可以配|?/span>bean的作用域了:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>

4、session    
session作用域表C针对每一?span>HTTPh都会产生一个新的beanQ同时该bean仅在当前HTTP session内有效,配置实例Q?/span>配置实例Q和request配置实例的前提一P配置好web启动文g可以如下配|:<bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>

5、global session    
global session作用域类g标准?span>HTTP Session作用域,不过它仅仅在Zportlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各U不同的portlet所׃n。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中用global session作用域来标识beanQ那么web会自动当成sessioncd来用?/span>配置实例Q和request配置实例的前提一P配置好web启动文g可以如下配|:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>

6、自定义bean装配作用?/font>      
在spring2.0中作用域是可以Q意扩展的Q你可以自定义作用域Q甚至你也可以重新定义已有的作用域(但是你不能覆盖singleton和prototypeQ,spring的作用域由接口org.springframework.beans.factory.config.Scope来定义,自定义自q作用域只要实现该接口卛_Q下面给个实例:我们建立一个线E的scopeQ该scope在表CZ个线E中有效Q代码如下:
publicclass MyScope implements Scope 
     privatefinal ThreadLocal threadScope = 
new ThreadLocal() 
{
          
protected Object initialValue()
{
            returnnew HashMap(); 
          }
 
    }

     
public Object get(String name, ObjectFactory objectFactory) 

        Map scope = (Map) threadScope.get(); 
        Object object = scope.get(name); 
        
if(object==null)

          object = objectFactory.getObject(); 
          scope.put(name, object); 
        }
 
        
return
 object; 
     }
 
     
public Object remove(String name)

        Map scope = (Map) threadScope.get(); 
        
return
 scope.remove(name); 
     }

     publicvoid registerDestructionCallback(String name, Runnable callback) 

     }

    
public String getConversationId() {
       
// TODO Auto-generated method stub
       returnnull;
    }
 
          }


]]>
վ֩ģ壺 ̨| | ʡ| | | | ɽ| ɽ| | ʯ| ˮ| | ˷| żҿ| «| | | | | | | ʼ| | | | ƽ| | ɽ| ɽ| ¡| ¡| | ɽ| ɽ| | ̨| | | | ɽ| |