??xml version="1.0" encoding="utf-8" standalone="yes"?>日本福利片高清在线观看,亚洲国产网站,91色视频在线http://www.aygfsteel.com/conans/category/32512.html你越挣扎我就兴?/description>zh-cnSat, 17 Apr 2010 11:08:29 GMTSat, 17 Apr 2010 11:08:29 GMT60Spring Security 3应用?1个步?/title><link>http://www.aygfsteel.com/conans/articles/318053.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 12 Apr 2010 05:36:00 GMT</pubDate><guid>http://www.aygfsteel.com/conans/articles/318053.html</guid><description><![CDATA[<ol> <li> <strong>Spring Security</strong><br /> 11个步骤ؓ应用E序d安全防护<br /> </li> <li> <strong>历史与现?/strong><br /> ?003q出现的Spring扩展插gAcegi Security发展而来?br /> 目前最新版本ؓ3.xQ已成ؓSpring的一部分?br /> 为J2EE企业应用E序提供可靠的安全性服务?br /> </li> <li> <strong>Authentication vs. Authorization</strong><br /> 区分概念验证与授?br /> 验证<br /> q个用户是谁Q?br /> 用户w䆾可靠吗?<br /> 授权<br /> 某用户A是否可以讉K资源R<br /> 某用户A是否可以执行M操作<br /> 某用户A是否可以对资源R执行M操作<br /> </li> <li> <strong>SS中的验证特点</strong><br /> 支持多种验证方式<br /> 支持多种加密格式<br /> 支持lg的扩展和替换<br /> 可以本地化输Z?br /> </li> <li> <strong>SS中的授权特点</strong><br /> 支持多种仲裁方式<br /> 支持lg的扩展和替换<br /> 支持寚w面访问、方法访问、对象访问的授权?br /> </li> <li> <strong>SS核心安全实现</strong><br /> Web安全<br /> 通过配置Servlet FilterȀzSS中的qo器链<br /> 实现Session一致性验?br /> 实现免登陆验证(Remember-Me验证Q?br /> 提供一pd标签库进行页面元素的安全控制<br /> Ҏ安全<br /> 通过AOP模式实现安全代理<br /> Web安全与方法安全均可以使用表达式语a定义讉K规则<br /> </li> <li> <strong>配置SS</strong><br /> 配置Web.xmlQ应用安全过滤器<br /> 配置SpringQ验证与授权部分<br /> 在web面中获取用戯n?br /> 在web面中应用安全标{ֺ<br /> 实现ҎU安?br /> </li> <li> <strong>1Q配|web.xml</strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3Cfilter%3E%0A%3Cfilter-name%3EspringSecurityFilterChain%3C%2Ffilter-name%3E%0A%3Cfilter-class%3Eorg.springframework.web.filter.DelegatingFilterProxy%3C%2Ffilter-class%3E%0A%3C%2Ffilter%3E%0A%3Cfilter-mapping%3E%0A%3Cfilter-name%3EspringSecurityFilterChain%3C%2Ffilter-name%3E%0A%3Curl-pattern%3E%2F*%3C%2Furl-pattern%3E%0A%3C%2Ffilter-mapping%3E%0A%3Ccontext-param%3E%0A%3Cparam-name%3EcontextConfigLocation%3C%2Fparam-name%3E%0A%3Cparam-value%3Eclasspath%3Aspring.xml%3C%2Fparam-value%3E%0A%3C%2Fcontext-param%3E%0A%3Clistener%3E%0A%3Clistener-class%3E%0Aorg.springframework.web.context.ContextLoaderListener%0A%3C%2Flistener-class%3E%0A%3C%2Flistener%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><filter>  </li> <li><filter-name>springSecurityFilterChain</filter-name>  </li> <li><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  </li> <li></filter>  </li> <li><filter-mapping>  </li> <li><filter-name>springSecurityFilterChain</filter-name>  </li> <li><url-pattern>/*</url-pattern>  </li> <li></filter-mapping>  </li> <li><context-param>  </li> <li><param-name>contextConfigLocation</param-name>  </li> <li><param-value>classpath:spring.xml</param-value>  </li> <li></context-param>  </li> <li><listener>  </li> <li><listener-class>  </li> <li>org.springframework.web.context.ContextLoaderListener  </li> <li></listener-class>  </li> <li></listener>  </li> </ol> </div> <pre style="display: none;" name="code" class="java"><filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </pre>  </li> <li> <strong>2QSpring配置文g中设|命名空?/strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Cbeans%3Abeansxmlns%3D%22http%3A%2F%2Fwww.springframework.org%2Fschema%2Fsecurity%22%0Axmlns%3Abeans%3D%22http%3A%2F%2Fwww.springframework.org%2Fschema%2Fbeans%22%20xmlns%3Axsi%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance%22%0Axsi%3AschemaLocation%3D%22http%3A%2F%2Fwww.springframework.org%2Fschema%2Fbeans%0Ahttp%3A%2F%2Fwww.springframework.org%2Fschema%2Fbeans%2Fspring-beans-3.0.xsd%0Ahttp%3A%2F%2Fwww.springframework.org%2Fschema%2Fsecurity%0Ahttp%3A%2F%2Fwww.springframework.org%2Fschema%2Fsecurity%2Fspring-security-3.0.xsd%22%3E%0A%3C%2Fbeans%3Abeans%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><?xml version="1.0" encoding="UTF-8"?>  </li> <li><beans:beansxmlns="http://www.springframework.org/schema/security"  </li> <li>xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  </li> <li>xsi:schemaLocation="http://www.springframework.org/schema/beans  </li> <li>http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  </li> <li>http://www.springframework.org/schema/security  </li> <li>http://www.springframework.org/schema/security/spring-security-3.0.xsd">  </li> <li></beans:beans>  </li> </ol> </div> <pre style="display: none;" name="code" class="java"><?xml version="1.0" encoding="UTF-8"?> <beans:beansxmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> </beans:beans> </pre> <strong> </strong> </li> <li> <strong>3Q配|最基本的验证与授权</strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3Chttp%20auto-config%3D%22true%22%3E%0A%3Cintercept-url%20pattern%3D%22%2F**%22%20access%3D%22ROLE_USER%22%20%2F%3E%0A%3C%2Fhttp%3E%0A%3Cauthentication-manager%3E%0A%3Cauthentication-provider%3E%0A%3Cuser-service%3E%0A%3Cuser%20name%3D%22tom%22%20password%3D%22123%22%20authorities%3D%22ROLE_USER%2C%20ROLE_A%22%20%2F%3E%0A%3Cuser%20name%3D%22jerry%22%20password%3D%22123%22%20authorities%3D%22ROLE_USER%2C%20ROLE_B%22%20%2F%3E%0A%3C%2Fuser-service%3E%0A%3C%2Fauthentication-provider%3E%0A%3C%2Fauthentication-manager%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><http auto-config="true">  </li> <li><intercept-url pattern="/**" access="ROLE_USER" />  </li> <li></http>  </li> <li><authentication-manager>  </li> <li><authentication-provider>  </li> <li><user-service>  </li> <li><user name="tom" password="123" authorities="ROLE_USER, ROLE_A" />  </li> <li><user name="jerry" password="123" authorities="ROLE_USER, ROLE_B" />  </li> <li></user-service>  </li> <li></authentication-provider>  </li> <li></authentication-manager>  </li> </ol> </div> <pre style="display: none;" name="code" class="java"><http auto-config="true"> <intercept-url pattern="/**" access="ROLE_USER" /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="tom" password="123" authorities="ROLE_USER, ROLE_A" /> <user name="jerry" password="123" authorities="ROLE_USER, ROLE_B" /> </user-service> </authentication-provider> </authentication-manager> </pre>  </li> <li> <strong>4Q通过数据库验证用戯n?/strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3Cauthentication-manager%3E%0A%3Cauthentication-provider%3E%0A%3Cpassword-encoder%20hash%3D%E2%80%9Cmd5%E2%80%9D%2F%3E%0A%3Cjdbc-user-service%20data-source-ref%3D%22dataSource%22%2F%3E%0A%3C%2Fauthentication-provider%3E%0A%3C%2Fauthentication-manager%3E%0A%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%BB%93%E6%9E%84%E8%A7%81SS%E8%AF%B4%E6%98%8E%E6%89%8B%E5%86%8C%E9%99%84%E5%BD%95A%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><authentication-manager>  </li> <li><authentication-provider>  </li> <li><password-encoder hash=“md5”/>  </li> <li><jdbc-user-service data-source-ref="dataSource"/>  </li> <li></authentication-provider>  </li> <li></authentication-manager>  </li> <li>数据表结构见SS说明手册附录A  </li> </ol> </div> <pre style="display: none;" name="code" class="java"><authentication-manager> <authentication-provider> <password-encoder hash=“md5”/> <jdbc-user-service data-source-ref="dataSource"/> </authentication-provider> </authentication-manager> 数据表结构见SS说明手册附录A </pre>  </li> <li> <strong>5Q完善web面验证规则</strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3Chttp%20auto-config%3D%22true%22%3E%0A%3Cintercept-url%20pattern%3D%22%2Fjs%2F**%22%20filters%3D%22none%22%2F%3E%0A%3Cintercept-url%20pattern%3D%22%2Fcss%2F**%22%20filters%3D%22none%22%2F%3E%0A%3Cintercept-url%20pattern%3D%22%2Fimages%2F**%22%20filters%3D%22none%22%2F%3E%0A%3Cintercept-url%20pattern%3D%22%2Fa.jsp%22%20access%3D%22ROLE_A%22%20%2F%3E%0A%3Cintercept-url%20pattern%3D%22%2Fb.jsp%22%20access%3D%22ROLE_B%22%20%2F%3E%0A%3Cintercept-url%20pattern%3D%22%2Fc.jsp%22%20access%3D%22ROLE_A%2C%20ROLE_B%22%20%2F%3E%0A%3Cintercept-url%20pattern%3D%22%2F**%22%20access%3D%22ROLE_USER%22%20%2F%3E%0A%3C%2Fhttp%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><http auto-config="true">  </li> <li><intercept-url pattern="/js/**" filters="none"/>  </li> <li><intercept-url pattern="/css/**" filters="none"/>  </li> <li><intercept-url pattern="/images/**" filters="none"/>  </li> <li><intercept-url pattern="/a.jsp" access="ROLE_A" />  </li> <li><intercept-url pattern="/b.jsp" access="ROLE_B" />  </li> <li><intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" />  </li> <li><intercept-url pattern="/**" access="ROLE_USER" />  </li> <li></http>  </li> </ol> </div> <pre style="display: none;" name="code" class="java"><http auto-config="true"> <intercept-url pattern="/js/**" filters="none"/> <intercept-url pattern="/css/**" filters="none"/> <intercept-url pattern="/images/**" filters="none"/> <intercept-url pattern="/a.jsp" access="ROLE_A" /> <intercept-url pattern="/b.jsp" access="ROLE_B" /> <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" /> <intercept-url pattern="/**" access="ROLE_USER" /> </http> </pre>  </li> <li> <strong>6Q自定义验证配置</strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3Chttp%20auto-config%3D%22true%22%3E%0A%3C!--%20%E6%8C%87%E5%AE%9A%E7%99%BB%E9%99%86%E9%A1%B5%E9%9D%A2%E3%80%81%E6%88%90%E5%8A%9F%E9%A1%B5%E9%9D%A2%E3%80%81%E5%A4%B1%E8%B4%A5%E9%A1%B5%E9%9D%A2--%3E%0A%3Cform-login%20login-page%3D%22%2Flogin.jsp%22%20default-target-url%3D%22%2Findex.jsp%22%20authentication-failure-url%3D%22%2Flogin.jsp%22%20%2F%3E%0A%3C!--%20%E5%B0%9D%E8%AF%95%E8%AE%BF%E9%97%AE%E6%B2%A1%E6%9C%89%E6%9D%83%E9%99%90%E7%9A%84%E9%A1%B5%E9%9D%A2%E6%97%B6%E8%B7%B3%E8%BD%AC%E7%9A%84%E9%A1%B5%E9%9D%A2%20--%3E%0A%3Caccess-denied-handler%20error-page%3D%22%2FaccessDenied.jsp%22%2F%3E%0A%3C!--%20%E4%BD%BF%E7%94%A8%E8%AE%B0%E4%BD%8F%E7%94%A8%E6%88%B7%E5%90%8D%E3%80%81%E5%AF%86%E7%A0%81%E5%8A%9F%E8%83%BD%EF%BC%8C%E6%8C%87%E5%AE%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E5%92%8C%E5%8A%A0%E5%AF%86%E7%9A%84key%20--%3E%0A%3Cremember-me%20data-source-ref%3D%22dataSource%22%20%2F%3E%0A%3C!--%20logout%E9%A1%B5%E9%9D%A2%EF%BC%8Clogout%E5%90%8E%E6%B8%85%E9%99%A4session%20--%3E%0A%3Clogout%20invalidate-session%3D%22true%22%20logout-success-url%3D%22%2Flogin.jsp%22%20%2F%3E%0A%3C!--%20session%20%E5%A4%B1%E6%95%88%E5%90%8E%E8%B7%B3%E8%BD%AC%E7%9A%84%E9%A1%B5%E9%9D%A2%EF%BC%8C%E6%9C%80%E5%A4%A7%E7%99%BB%E9%99%86%E6%AC%A1%E6%95%B0%20--%3E%0A%3Csession-management%20invalid-session-url%3D%22%2FsessionTimeout.htm%22%3E%0A%3Cconcurrency-control%20max-sessions%3D%221%22%20expired-url%3D%22%2FsessionTimeout.htm%22%20%2F%3E%0A%3C%2Fsession-management%3E%0A%3C%2Fhttp%3E%0A%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8SS%E8%87%AA%E5%B8%A6%E7%9A%84%E7%99%BB%E9%99%86%E9%A1%B5%E9%9D%A2%E4%BD%9C%E4%B8%BAlogin.jsp%E7%9A%84%E6%A8%A1%E6%9D%BF%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><http auto-config="true">  </li> <li><!-- 指定登陆面、成功页面、失败页?->  </li> <li><form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" />  </li> <li><!-- 试讉K没有权限的页面时跌{的页?nbsp;-->  </li> <li><access-denied-handler error-page="/accessDenied.jsp"/>  </li> <li><!-- 使用C用户名、密码功能,指定数据源和加密的key -->  </li> <li><remember-me data-source-ref="dataSource" />  </li> <li><!-- logout面Qlogout后清除session -->  </li> <li><logout invalidate-session="true" logout-success-url="/login.jsp" />  </li> <li><!-- session 失效后蟩转的面Q最大登陆次?nbsp;-->  </li> <li><session-management invalid-session-url="/sessionTimeout.htm">  </li> <li><concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" />  </li> <li></session-management>  </li> <li></http>  </li> <li>可以使用SS自带的登陆页面作为login.jsp的模?nbsp; </li> </ol> </div> <pre style="display: none;" name="code" class="java"><http auto-config="true"> <!-- 指定登陆面、成功页面、失败页?-> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" /> <!-- 试讉K没有权限的页面时跌{的页?--> <access-denied-handler error-page="/accessDenied.jsp"/> <!-- 使用C用户名、密码功能,指定数据源和加密的key --> <remember-me data-source-ref="dataSource" /> <!-- logout面Qlogout后清除session --> <logout invalidate-session="true" logout-success-url="/login.jsp" /> <!-- session 失效后蟩转的面Q最大登陆次?--> <session-management invalid-session-url="/sessionTimeout.htm"> <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" /> </session-management> </http> 可以使用SS自带的登陆页面作为login.jsp的模? </pre> </li> <li> <strong>7Q本地化消息输出</strong><br /> 拯本地化资源文件后Q在配置文g中加载该文gQ?br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3C!--%20%E5%8A%A0%E8%BD%BD%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%20--%3E%0A%3Cbeans%3Abean%20id%3D%22messageSource%22%20%0Aclass%3D%22org.springframework.context.support.ReloadableResourceBundleMessageSource%22%3E%0A%3Cbeans%3Aproperty%20name%3D%22basename%22%20value%3D%22classpath%3Amessages%22%2F%3E%0A%3C%2Fbeans%3Abean%3E%0A%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E5%9C%A8SS%E6%A0%B8%E5%BF%83%E5%8C%85%EF%BC%9Aspring-security-core-3.0.2.RELEASE.jar%E7%9A%84orgspringframeworksecurity%E7%9B%AE%E5%BD%95%E4%B8%AD%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><!-- 加蝲错误信息资源文g -->  </li> <li><beans:bean id="messageSource"   </li> <li>class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  </li> <li><beans:property name="basename" value="classpath:messages"/>  </li> <li></beans:bean>  </li> <li>资源文g在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目录?nbsp; </li> </ol> </div> <pre style="display: none;" name="code" class="java"><!-- 加蝲错误信息资源文g --> <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <beans:property name="basename" value="classpath:messages"/> </beans:bean> 资源文g在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目录? </pre>  </li> <li> <strong>8Q在web面中获取用户信?/strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9AJava%E4%BB%A3%E7%A0%81%0AAuthentication%20auth%20%3D%20SecurityContextHolder.getContext().getAuthentication()%3B%0ACollection%3CGrantedAuthority%3E%20col%20%3D%20auth.getAuthorities()%3B%0A%E6%96%B9%E5%BC%8F%E4%BA%8C%EF%BC%9A%E6%A0%87%E7%AD%BE%E5%BA%93%0A%3C%25%40%20taglib%20prefix%3D%22sec%22%20uri%3D%22http%3A%2F%2Fwww.springframework.org%2Fsecurity%2Ftags%22%20%25%3E%0A%3Csec%3Aauthentication%20property%3D%22name%E2%80%9C%2F%3E%0A%3Csec%3Aauthentication%20property%3D%22authorities%E2%80%9C%2F%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li>方式一QJava代码  </li> <li>Authentication auth = SecurityContextHolder.getContext().getAuthentication();  </li> <li>Collection<GrantedAuthority> col = auth.getAuthorities();  </li> <li>方式二:标签?nbsp; </li> <li><%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>  </li> <li><sec:authentication property="name“/>  </li> <li><sec:authentication property="authorities“/>  </li> </ol> </div> <pre style="display: none;" name="code" class="java">方式一QJava代码 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Collection<GrantedAuthority> col = auth.getAuthorities(); 方式二:标签? <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <sec:authentication property="name“/> <sec:authentication property="authorities“/> </pre>  </li> <li> <strong>9Q在web面q行元素安全控制</strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%E6%96%B9%E5%BC%8F%E4%B8%80%0A%3Csec%3AauthorizeifAnyGranted%3D%22ROLE_A%22%3E%0A%3Ca%20href%3D%22a.jsp%22%3E%E4%BD%A0%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AEa.jsp%3C%2Fa%3E%0A%3C%2Fsec%3Aauthorize%3E%0A%3Csec%3AauthorizeifNotGranted%3D%22ROLE_A%22%3E%0A%E4%BD%A0%E4%B8%8D%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AEa.jsp%0A%3C%2Fsec%3Aauthorize%3E%0A%E6%96%B9%E5%BC%8F%E4%BA%8C%0A%3Csec%3Aauthorizeurl%3D%22%2Fa.jsp%22%3E%0A%3Ca%20href%3D%22a.jsp%22%3E%E4%BD%A0%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AEa.jsp%3C%2Fa%3E%0A%3C%2Fsec%3Aauthorize%3E%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li>方式一  </li> <li><sec:authorizeifAnyGranted="ROLE_A">  </li> <li><a href="a.jsp">你可以访问a.jsp</a>  </li> <li></sec:authorize>  </li> <li><sec:authorizeifNotGranted="ROLE_A">  </li> <li>你不可以讉Ka.jsp  </li> <li></sec:authorize>  </li> <li>方式?nbsp; </li> <li><sec:authorizeurl="/a.jsp">  </li> <li><a href="a.jsp">你可以访问a.jsp</a>  </li> <li></sec:authorize>  </li> </ol> </div> <pre style="display: none;" name="code" class="java">方式一 <sec:authorizeifAnyGranted="ROLE_A"> <a href="a.jsp">你可以访问a.jsp</a> </sec:authorize> <sec:authorizeifNotGranted="ROLE_A"> 你不可以讉Ka.jsp </sec:authorize> 方式? <sec:authorizeurl="/a.jsp"> <a href="a.jsp">你可以访问a.jsp</a> </sec:authorize> </pre>  </li> <li> <strong>10Q全局Ҏ安全控制</strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3Cglobal-method-security%20pre-post-annotations%3D%22enabled%22%3E%0A%3Cprotect-pointcut%20expression%3D%22execution(*%20com.xasxt.*Service.add*(..))%22%20access%3D%22ROLE_A%22%2F%3E%0A%3Cprotect-pointcut%20expression%3D%22execution(*%20com.xasxt.*Service.delete*(..))%22%20access%3D%22ROLE_B%22%2F%3E%0A%3C%2Fglobal-method-security%3E%0A%E6%AD%A4%E5%A4%84%E4%BD%BF%E7%94%A8%E4%BA%86AspectJ%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E5%88%87%E5%85%A5%E7%82%B9%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%88%E7%99%BE%E5%BA%A6%EF%BC%9AAspectJ%20execution%EF%BC%89%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li><global-method-security pre-post-annotations="enabled">  </li> <li><protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/>  </li> <li><protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/>  </li> <li></global-method-security>  </li> <li>此处使用了AspectJ中常用的切入点表辑ּQ百度:AspectJ executionQ?nbsp; </li> </ol> </div> <pre style="display: none;" name="code" class="java"><global-method-security pre-post-annotations="enabled"> <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/> <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/> </global-method-security> 此处使用了AspectJ中常用的切入点表辑ּQ百度:AspectJ executionQ? </pre>  </li> <li> <strong>11Q用注解进行方法安全控?/strong><br /> <div> <div> <div>Java代码 <embed src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=public%20class%20DemoService%20%7B%0A%40PreAuthorize(%22hasRole(%26apos%3BROLE_A%26apos%3B)%22)%0Apublic%20void%20methodA()%20%7B%0A%7D%0A%40PreAuthorize(%22hasAnyRole(%26apos%3BROLE_A%2C%20ROLE_B%26apos%3B)%22)%0Apublic%20void%20methodB()%20%7B%0A%7D%0A%7D%0AhasRole%E4%B8%8EhasAnyRole%E4%B8%BASS%E9%80%9A%E7%94%A8%E5%86%85%E7%BD%AE%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%88google%20%3A%20spring%20security%20Common%20Built-In%20Expressions%EF%BC%89%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="15" width="14"></div> </div> <ol start="1"> <li>public class DemoService {  </li> <li>@PreAuthorize("hasRole(&apos;ROLE_A&apos;)")  </li> <li>public void methodA() {  </li> <li>}  </li> <li>@PreAuthorize("hasAnyRole(&apos;ROLE_A, ROLE_B&apos;)")  </li> <li>public void methodB() {  </li> <li>}  </li> <li>}  </li> <li>hasRole与hasAnyRole为SS通用内置表达式(google : spring security Common Built-In ExpressionsQ?nbsp; </li> </ol> </div> <pre style="display: none;" name="code" class="java">public class DemoService { @PreAuthorize("hasRole(&apos;ROLE_A&apos;)") public void methodA() { } @PreAuthorize("hasAnyRole(&apos;ROLE_A, ROLE_B&apos;)") public void methodB() { } } hasRole与hasAnyRole为SS通用内置表达式(google : spring security Common Built-In ExpressionsQ? </pre>  </li> <li> <strong>12Q下一步做什么?Q?</strong><br /> 采用更安全的验证方式<br /> 采用安全的数据传输方?br /> 实现动态授?br /> 自定义验证与授权部g<br /> 实现数据U安?/li> </ol> <img src ="http://www.aygfsteel.com/conans/aggbug/318053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/conans/" target="_blank">CONAN</a> 2010-04-12 13:36 <a href="http://www.aygfsteel.com/conans/articles/318053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再析在spring框架中解军_数据源的问题http://www.aygfsteel.com/conans/articles/285674.htmlCONANCONANMon, 06 Jul 2009 05:45:00 GMThttp://www.aygfsteel.com/conans/articles/285674.html在前面我写了?a linkindex="29" >如何?/a>spring框架中解军_数据源的问题》,通过设计模式中的Decorator模式?/span>spring框架中解军_数据源的问题Q得C许多|友的关注。在与网友探讨该问题的过E中Q我发现我的Ҏq不完善Q它只解决了一部分问题?/span>

ȝ多数据源的问题,其实它需要分Z下三U情况:各个数据源的数据l构不同、各个数据源的数据结构相同、各个数据源的数据结构部分相同又有部分不同。对于第二种情况Q各个数据源的数据结构相同,我们使用一?/span>sessionFactoryQ而在sessionFactory中通过MultiDataSource来动态切换数据源Q应当是一个不错的ҎQ既解决了多?/span>sessionFactory对相同的值对象重复装载对内存的浪费,又数据源的切换对客L序透明Q简化了代码的实现和对客L序的影响。但是,对于W一U情况,各个数据源的数据l构不同Q运用这LҎ存在潜在风险?/span>

对于各个数据源的数据l构不同的情况,使用一?/span>sessionFactory而在q个sessionFactory中动态切换数据源Q可能造成数据讉K的张冠李戴。譬如,数据?/span>A有表T而数据源B没有Q可能造成客户E序在访问表T的时候却试去连接数据源BQ? 因ؓ客户E序讉K哪个数据源是在程序运行期间由客户E序军_的,因此q样的错误是很难发现的。也许客L序的一个不l意的错误就可能造成错误。解册个问 题的Ҏ有两个:一是严D求客L序不要写错,q当然是可以做到的,但作为框架设计者,另一个解x法是在框架中避免出现这L情况。因此我出?/span>MultiSessionFactory的方案来解决各个数据源的数据l构不同的多数据源问题?/span>

问题的分?/span>

?/span>MultiDataSource的方案一PMultiSessionFactory同样是在spring框架下调?/span>ApplicationContext?/span>getBean()Ҏ而不会另外创?/span>beanFacotyQ也同样使用Decorator模式来处理切换的问题?/span>MultiSessionFactory的对象关pd图:

在该Ҏ中,SessionFactoryHibernate?/span>org.hibernate.SessionFactory接口Q?/span>DecoratorMultiSessionFactoryQ?/span>SessionFactory1?/span>SessionFactory2往往?/span>spring?/span>org.springframework.orm.hibernate3.LocalSessionFactoryBean。细心的朋友可能会注意,实际?/span>LocalSessionFactoryBeanq不?/span>SessionFactory的实玎ͼq个Ҏ是否有问题呢Q这个问题其实也一直困C我好久,最后我发现Q我们通过ApplicationContext?/span>getBean()得到一?/span>LocalSessionFactoryBean的时候其实ƈ不是真正地得C它,而是得到了一?/span>SessionFactoryQ因?/span>spring?/span>LocalSessionFactoryBean重写?/span>getObject()Q其返回的?/span>SessionFactory。一个简单的明证是Q?/span>HibernateDaoSupport?/span>sessionFactory属性的cd?/span>SessionFactoryQ而我们在spring配置的时候注入的却是LocalSessionFactoryBean?/span>

Ҏ的实?/span>

在整个这个方案中Q我们需要实现的只有MultiSessionFactorycd我们可爱?/span>SpserverQd׃个类Q然后呢是一?/span>spring的配|,完成了?/span>

MultiSessionFactory实现?/span>SessionFactoryQ同时ؓ了得?/span>AplicationContext而实CApplicationContextAware?/span>MultiSessionFactory的代码如下:

java 代码
  1. public class MultiSessionFactory implements SessionFactory, ApplicationContextAware {   
  2.     private static final long serialVersionUID = 2064557324203496378L;   
  3.     private static final Log log = LogFactory.getLog(MultiSessionFactory.class);   
  4.     private ApplicationContext applicationContext = null;   
  5.     private SessionFactory sessionFactory = null;   
  6.     public ApplicationContext getApplicationContext() {   
  7.         return applicationContext;   
  8.     }   
  9.     public void setApplicationContext(ApplicationContext applicationContext) {   
  10.        this.applicationContext = applicationContext;   
  11.     }   
  12.     public SessionFactory getSessionFactory(String sessionFactoryName) {   
  13.        log.debug("sessionFactoryName:"+sessionFactoryName);   
  14.        try{   
  15.            if(sessionFactoryName==null||sessionFactoryName.equals("")){   
  16.               return sessionFactory;   
  17.            }   
  18.            return (SessionFactory)this.getApplicationContext().getBean(sessionFactoryName);   
  19.        }catch(NoSuchBeanDefinitionException ex){   
  20.            throw new DaoException("There is not the sessionFactory 
  21.        }   
  22.     }   
  23.   
  24.     public SessionFactory getSessionFactory() {   
  25.        String sessionFactoryName = SpObserver.getSp();   
  26.        return getSessionFactory(sessionFactoryName);   
  27.     }   
  28.   
  29.     public void setSessionFactory(SessionFactory sessionFactory) {   
  30.        this.sessionFactory = sessionFactory;   
  31.     }   
  32.   
  33.     // SessionFactory接口需要实现的Ҏ   
  34.   
  35. ......   
  36.   
  37. }  

MultiSessionFactory的完整代码见我提供的附g?/span>setSessionFactory()实际上是讑֮的默?/span>sessionFactoryQ它?/span>spring装蝲的时候调用,其对应的数据源应当是L据源Q即目初始化中需要读取初始化数据的数据源。在M多数据源目中,都应当有一个存攑ֈ始化数据、系l维护数据、用h限数据的数据源,q就是主数据源。因?/span>MultiSessionFactory的配|应当这样写Q?/span>

xml 代码
  1. <bean id="sessionFactory" class="com.htxx.service.dao.MultiSessionFactory">  
  2.     <property name="sessionFactory"><ref bean="hostSessionFactory"/>property> 
  3. >  

SpServer的写法与《如何在spring框架中解军_数据源的问题?/a>中的一P我就不再累赘了?/span>

另外Q在spring配置中配|多个数据源Q每个数据源对应一?/span>sessionFactoryQ这个对应的sessionFactory中的值对象应当是该数据源的值对象。客L序在执行数据讉K前,通过调用SpServer?/span>putSp()ҎQ告?/span>MultiSessionFactory需要切换到哪个sessionFactoryQ然后执行数据访问。这P不同数据源的值对象通过攑֜不同?/span>sessionFactory中,避免了张冠李戴的情况。具体的CZ见附件的MultiSessionFactoryTest?/span>

另外的方?/span>

也许有些朋友对以上方案还不满意,因ؓ在执行数据访问前毕竟q要多做一步指?/span>sessionFactory的工作。实际上Q对于各个数据源的数据结构不同的目Q一个值对象应当用哪个数据源有一个非常确定的对应关系。如果通过配置文g值对象与它的sessionFactory对应hQ那么我们在执行数据讉K的时候传递的是哪个值对象,MultiSessionFactory马上可以去扑ֈ对应?/span>sessionFactory。这个方案你可以通过AOP来制作一个拦截器拦截所有诸?/span>save()?/span>delete()?/span>get()?/span>load(){方法来实现Q也可以扩展HibernateDaoSupport来实现。这LҎ使客L序甚至都不用知道他是在操作的一个多数据源系l。当Ӟq个Ҏ感兴的朋友可以自己d现?/span>

另外Q在q个Ҏ中的核心是运?/span>Decorator设计模式来解军_?/span>sessionFactory的目的,?/span>MultiSessionFactory的实现。至于通过什么方式来通知MultiSessionFactory应当切换到哪?/span>SessionFactoryQ可以根据不同项目的情况自由选择。我在这里给大家提供了通过SpOberver和徏立值对象与sessionFactory关系的配|文件这两个ҎQ你也可以有自己的方案解冟?/span>

W三U情늚解决Ҏ

前面我已l给ZW一U和W二U情늚解决ҎQ各个数据源的数据结构不同的情况?/span>MultiSessionFactory解决Q各个数据源的数据结构相同的情况?/span>MultiDataSource解决。那么第三种情况Q各个数据源的数据结构部分相同又有部分不同,又应当如何解军_Q当然是?/span>MultiSessionFactory?/span>MultiDataSourcel合h解决。对于数据结构不同的部分Q其分别创徏各自?/span>sessionFactory然后通过MultiSessionFactory来切换,而对于数据结构相同的部分Q徏立共同的sessionFactory和多个不同的dataSource然后通过MultiDataSource来切换就可以了?/span>

q有的朋友问到这LҎ其事务处理和二~存的情c这个方案是?/span>spring框架下的解决ҎQ其事务处理的能力也是由spring的能力来军_的。目?/span>spring要处理跨数据库的事务处理是通过JTA来实现的Q这U方式在该方案中同样可以实现Q朋友们可以试一试。另外,本方案能使用二~存吗?当然可以。对?/span>MultiSessionFactory当然没有M问题Q它通过不同?/span>sessionFactory分离开了不同的数据源和值对象,我们可以毫无ֿC用。对?/span>MultiDataSource来说Q就有点问题了?/span>MultiDataSource使多个数据源使用共同?/span>sessionFactoryQ因此它仿佛是多个数据源在逻辑上合qؓ一个数据源。正因ؓ如此Q我们需要保证对于同一个表在所有数据源中都要主键唯一。什么意思呢Q数据源A和数据源B都有?/span>TQ如果数据源A中的?/span>T拥有ID?/span>001的一条数据,那么在数据源B的表T中就不能?/span>ID?/span>001的记录。如果你L通过MultiDataSource来执行表的插入操作,q且使用uuid.hex生成主键Q这当然不会有问题。但如果你有通过其它方式插入表的操作Q你应当保证q样的唯一性。另外,对于查询的操作,~存中存攄既可能是数据?/span>A的数据,也可能是数据?/span>B的数据,因此你应当对数据有一个规划。对于表T的数据,哪些应当插入到数据源A中,哪些应当插入?/span>B中,应当有一个定义。假如是通过不同单位来决定插入哪个数据源Q那么在查询数据?/span>A的表T是,应当增加条g只查询数据源A应当有的单位而排除调其它单位。如此这P你只要注意到q两个问题,你就可以攑ֿ大胆C用二U缓存?/span>

CONAN 2009-07-06 13:45 发表评论
]]>
如何在spring框架中解军_数据源的问题http://www.aygfsteel.com/conans/articles/285673.htmlCONANCONANMon, 06 Jul 2009 05:43:00 GMThttp://www.aygfsteel.com/conans/articles/285673.html在我们的目中遇到这样一个问题:我们的项目需要连接多个数据库Q而且不同的客户在每次讉K中根据需要会去访问不同的数据库。我们以往?/span>spring?/span>hibernate框架中L配置一个数据源Q因?/span>sessionFactory?/span>dataSource属性L指向q个数据源ƈ且恒定不变,所?/span>DAO在?/span>sessionFactory的时候都是通过q个数据源访问数据库。但是现在,׃目的需要,我们?/span>DAO在访?/span>sessionFactory的时候都不得不在多个数据源中不断切换Q问题就出现了:如何?/span>sessionFactory在执行数据持久化的时候,Ҏ客户的需求能够动态切换不同的数据源?我们能不能在spring的框架下通过量修改得到解决Q是否有什么设计模式可以利用呢Q?/span>  

问题的分?/span>

我首先想到在spring?/span>applicationContext中配|所有的dataSource。这?/span>dataSource可能是各U不同类型的Q比如不同的数据库:Oracle?/span>SQL Server?/span>MySQL{,也可能是不同的数据源Q比?/span>apache 提供?/span>org.apache.commons.dbcp.BasicDataSource?/span>spring提供?/span>org.springframework.jndi.JndiObjectFactoryBean{。然?/span>sessionFactoryҎ客户的每ơ请求,?/span>dataSource属性设|成不同的数据源Q以到达切换数据源的目的?/span>

但是Q我很快发现一个问题:当多用户同时q发讉K数据库的时候会出现资源争用的问题。这都是“单例模式”惹的。众所周知Q我们在使用spring框架的时候,?/span>beanFactory中注册的bean基本上都是采用单例模式,?/span>spring在启动的时候,q些beanp载到内存中,q且每个bean在整个项目中只存在一个对象。正因ؓ只存在一个对象,对象的所有属性,更准说是实例变量,表现得就如同是个静态变量(实际?#8220;静?#8221;?#8220;单例”往往是非常相似的两个东西Q我们常常用“静?#8221;来实?#8220;单例”Q。拿我们的问题来_sessionFactory在整个项目中只有一个对象,它的实例变量dataSource也就只有一个,如同一个静态变量一般。如果不同的用户都不断地M?/span>dataSource的|必然会出现多用户争用一个变量的问题Q对pȝ产生隐患?/span>

通过以上的分析,解决多数据源讉K问题的关键,集中在sessionFactory在执行数据持久化的时候,能够通过某段代码L据客L需要动态切换数据源Qƈ解决资源争用的问题?/span>

问题的解?/span>

(一)            采用Decorator设计模式

要解册个问题,我的思\锁定在了q个dataSource上了。如?/span>sessionFactory指向?/span>dataSource可以Ҏ客户的需求去q接客户所需要的真正的数据源Q即提供动态切换数据源的功能,那么问题p决了。那么我们怎么做呢Q去修改那些我们要用的dataSource源码吗?q显然不是一个好的方案,我们希望我们的修改与?/span>dataSource代码是分ȝ。根据以上的分析Q?/span>GoF设计模式中的Decorator模式Q装饰者模式)应当是我们可以选择的最x案?/span>

什么是“Decorator模式”Q简单点儿说是当我们需要修改原有的功能Q但我们又不愿直接去修改原有的代码时Q设计一?/span>Decorator套在原有代码外面。当我们使用Decorator的时候与原类完全一P?/span>Decorator的某些功能却已经修改Z我们需要修改的功能?/span>Decorator模式的结构如图?/span>

我们本来需要修改图中所有具体的Componentcȝ一些功能,但却q不是去直接修改它们的代码,而是在它们的外面增加一?/span>Decorator?/span>Decorator与具体的Componentc都是承的AbstractComponentQ因此它长得和具体的ComponentcMP也就是说我们在?/span>Decorator的时候就如同在?/span>ConcreteComponentA或?/span>ConcreteComponentB一P甚至那些使用ConcreteComponentA或?/span>ConcreteComponentB的客L序都不知道它们用的类已经改ؓ?/span>DecoratorQ但?/span>Decorator已经对具体的Componentcȝ部分Ҏq行了修改,执行q些Ҏ的结果已l不同了?/span>

(?            设计MultiDataSourcec?/span>

现在回到我们的问题,我们需要对dataSource的功能进行变_但又不希望修?/span>dataSource中的M代码。我q里指的dataSource是所有实?/span>javax.sql.DataSource接口的类Q我们常用的包括apache 提供?/span>org.apache.commons.dbcp.BasicDataSource?/span>spring提供?/span>org.springframework.jndi.JndiObjectFactoryBean{,q些cL们不可能修改它们本nQ更不可能对它们一个个C改以实现动态分配数据源的功能,同时Q我们又希望使用dataSource?/span>sessionFactoryҎ感觉不到这L变化?/span>Decorator模式正是解册个问题的设计模式?/span>

首先写一?/span>Decoratorc,我取名叫MultiDataSourceQ通过它来动态切换数据源。同时在配置文g中将sessionFactory的dataSource属性由原来的某个具体的dataSource改ؓMultiDataSource。如图:

Ҏ?span>Decorator模式Q?/span>AbstractComponent是一个抽象类Q但在这里我们可以将q个抽象cȝ接口来代替,?/span>DataSource接口Q?/span>ConcreteComponent是那些DataSource的实现类Q如BasicDataSource?/span>JndiObjectFactoryBean{?/span>MultiDataSource装了具体的dataSourceQƈ实现了数据源动态切换:
java 代码
  1. public class MultiDataSource implements DataSource {   
  2.     private DataSource dataSource = null;   
  3. public MultiDataSource(DataSource dataSource){   
  4.         this.dataSource = dataSource;   
  5.     }   
  6.     /* (non-Javadoc)  
  7.      * @see javax.sql.DataSource#getConnection()  
  8.      */  
  9.     public Connection getConnection() throws SQLException {   
  10.         return getDataSource().getConnection();   
  11.     }   
  12.     //其它DataSource接口应当实现的方?  
  13.   
  14.     public DataSource getDataSource(){   
  15.         return this.dataSource;   
  16.         }   
  17.     }   
  18.     public void setDataSource(DataSource dataSource) {   
  19.         this.dataSource = dataSource;   
  20.     }   
  21. }   

客户在发求的时候,dataSourceName攑ֈrequest中,然后把request中的数据源名通过调用new MultiDataSource(dataSource)时可以告?/span>MultiDataSource客户需要的数据源,可以实现动态切换数据源了。但l心的朋友会发现q在单例的情况下是问题的,因ؓMultiDataSource在系l中只有一个对象,它的实例变量dataSource也只有一个,如同一个静态变量一般。正因ؓ如此Q?/span>单例模式让许多设计模式都不得不需要更改,q将在我的?#8220;单例”更改了我们的设计模式》中详细讨论。那么,我们在单例模式下如何设计呢?

(?            单例模式下的MultiDataSource

在单例模式下Q由于我们在每次调用MultiDataSource的方法的时候,dataSource都可能是不同的,所以我们不能将dataSource攑֜实例变量dataSource中,最单的方式是在方?/span>getDataSource()中增加参敎ͼ告诉MultiDataSource我到底调用的是哪?/span>dataSourceQ?/span>

java 代码
  1. public DataSource getDataSource(String dataSourceName){   
  2.         log.debug("dataSourceName:"+dataSourceName);   
  3.         try{   
  4.             if(dataSourceName==null||dataSourceName.equals("")){   
  5.                 return this.dataSource;   
  6.             }   
  7.             return (DataSource)this.applicationContext.getBean(dataSourceName);   
  8.         }catch(NoSuchBeanDefinitionException ex){   
  9.             throw new DaoException("There is not the dataSource 
  10.         }   
  11.     }   

值得一提的是,我需要的数据源已l都?span>spring的配|文件中注册Q?/span>dataSourceName是其对应的id?/span>

xml 代码
  1. <bean id="dataSource1"  
  2.     class="org.apache.commons.dbcp.BasicDataSource">  
  3.     <property name="driverClassName">  
  4.         <value>oracle.jdbc.driver.OracleDrivervalue>  
  5.     property> 
  6.     ......   
  7. bean>  
  8. <bean id="dataSource2"  
  9.     class="org.apache.commons.dbcp.BasicDataSource">  
  10.     <property name="driverClassName">  
  11.         <value>oracle.jdbc.driver.OracleDrivervalue> 
  12.     property>   
  13.     ......   
  14. bean>   

Z得到spring?/span>ApplicationContextQ?/span>MultiDataSourcecdd现接?/span>org.springframework.context.ApplicationContextAwareQƈ且实现方法:

java 代码
  1. private ApplicationContext applicationContext = null;   
  2. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {   
  3.         this.applicationContext = applicationContext;   
  4.     }   

如此q样Q我可以通过this.applicationContext.getBean(dataSourceName)得到dataSource了?/span>

(?            通过U程传?/span>dataSourceName

查看以上设计Q?/span>MultiDataSource依然无法q行Q因为用户在发出hӞ他需要连接什么数据库Q其数据源名是放?/span>request中的Q要?/span>request中的数据源名传给MultiDataSourceQ需要经q?/span>BUS?/span>DAOQ也是说ؓ了把数据源名传给MultiDataSourceQ?/span>BUS?/span>DAO的所有方法都要增?/span>dataSourceName的参敎ͼq是我们不愿看到的。写一个类Q通过U程的方式蟩q?/span>BUS?/span>DAO直接传递给MultiDataSource是一个不错的设计Q?/span>

java 代码
  1. public class SpObserver {   
  2.     private static ThreadLocal local = new ThreadLocal();   
  3.     public static void putSp(String sp) {   
  4.         local.set(sp);   
  5.     }   
  6.     public static String getSp() {   
  7.         return (String)local.get();   
  8.     }   
  9. }   

做一?span>filterQ每ơ客户发求的时候就调用SpObserver.petSp(dataSourceName)Q将request中的dataSourceName传递给SpObserver对象?/span>最后修?/span>MultiDataSource的方?/span>getDataSource()Q?/span>

java 代码
  1. public DataSource getDataSource(){   
  2.         String sp = SpObserver.getSp();   
  3.         return getDataSource(sp);   
  4.     }   

完整?span>MultiDataSource代码在附件中?/span>

(?            动态添加数据源

通过以上ҎQ我们解决了动态分配数据源的问题,但你可能提出疑问Q方案中的数据源都是配置?/span>spring?/span>ApplicationContext中,如果我在E序q行q程中动态添加数据源怎么办?q确实是一个问题,而且在我们的目中也实遇到?/span>spring?/span>ApplicationContext是在目启动的时候加载的。加载以后,我们如何动态地加蝲新的bean?/span>ApplicationContext中呢Q我惛_如果?/span>spring自己的方法解册个问题就好了。所q的是,在查?/span>spring的源代码后,我找Cq样的代码,~写?/span>DynamicLoadBeanc,只要调用loadBean()ҎQ就可以某个或某几个配|文件中?/span>bean加蝲?/span>ApplicationContext中(见附Ӟ。不通过配置文g直接加蝲对象Q在spring的源码中也有Q感兴趣的朋友可以自qI?/span>

(?            ?/span>spring中配|?/span>

在完成了所有这些设计以后,我最后再唠叨一句。我们应当在spring中做如下配置Q?/span>

xml 代码
  1. <bean id="dynamicLoadBean" class="com.htxx.service.dao.DynamicLoadBean">bean>  
  2. <bean id="dataSource" class="com.htxx.service.dao.MultiDataSource">  
  3.         <property name="dataSource">  
  4.             <ref bean="dataSource1" />  
  5.         property>  
  6.     bean>  
  7.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  8.         <property name="dataSource">  
  9.             <ref bean="dataSource" />  
  10.         property>  
  11.         ......   
  12.     bean>  

其中dataSource属性实际上更准地说应当是defaultDataSourceQ即spring启动时以及在客户没有指定数据源时应当指定的默认数据源?/span>

该方案的优势

 

以上Ҏ与其它方案相比,它有哪些优势呢?

首先Q这个方案完全是?/span>spring的框架下解决的,数据源依焉|在spring的配|文件中Q?/span>sessionFactory依然去配|它?/span>dataSource属性,它甚至都不知?/span>dataSource的改变。唯一不同的是在真正的dataSource?/span>sessionFactory之间增加了一?/span>MultiDataSource?/span>

其次Q实现简单,易于l护。这个方案虽然我说了q么多东西,其实都是分析Q真正需要我们写的代码就只有MultiDataSource?/span>SpObserver两个cR?/span>MultiDataSourcecȝ正要写的只有getDataSource()?/span>getDataSource(sp)两个ҎQ?/span>SpObservercL单了。实现越单,出错的可能就小Q维护性就高?/span>

最后,q个Ҏ可以使单数据源与多数据源兼容。这个方案完全不影响BUS?/span>DAO的编写。如果我们的目在开始之初是单数据源的情况下开发,随着目的进行,需要变更ؓ多数据源Q则只需要修?/span>spring配置Qƈ量修改MVC层以便在h中写入需要的数据源名Q变更就完成了。如果我们的目希望改回单数据源Q则只需要简单修攚w|文件。这P为我们的目增加更多的Ҏ?/span>

特别说明Q实例中? DynamicLoadBean在web环境下运行会出错Q需要将cMAbstractApplicationContext改ؓ org.springframework.context.ConfigurableApplicationContext?/strong>





CONAN 2009-07-06 13:43 发表评论
]]>
Spring Security 2 配置_讲http://www.aygfsteel.com/conans/articles/253454.htmlCONANCONANThu, 05 Feb 2009 14:01:00 GMThttp://www.aygfsteel.com/conans/articles/253454.html阅读全文

CONAN 2009-02-05 22:01 发表评论
]]>
Spring,hibernate,struts的面试笔试题Q含{案Q?/title><link>http://www.aygfsteel.com/conans/articles/249547.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 02 Jan 2009 07:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/conans/articles/249547.html</guid><description><![CDATA[<div id="wmqeeuq" class="blog_content">Hibernate工作原理及ؓ什么要用?<br /> 原理Q?br /> 1.dq解析配|文?br /> 2.dq解析映信息,创徏SessionFactory<br /> 3.打开Sesssion<br /> 4.创徏事务Transation<br /> 5.持久化操?br /> 6.提交事务<br /> 7.关闭Session<br /> 8.关闭SesstionFactory<br /> <br /> Z么要用:<br /> 1. 对JDBC讉K数据库的代码做了装Q大大简化了数据讉K层繁琐的重复性代码?br /> <br /> 2. Hibernate是一个基于JDBC的主持久化框架Q是一个优U的ORM实现。他很大E度的简化DAO层的~码工作<br /> <br /> 3. hibernate使用Java反射机制Q而不是字节码增强E序来实现透明性?br /> <br /> 4. hibernate的性能非常好,因ؓ它是个轻量框架。映的灉|性很。它支持各种关系数据库,从一对一到多对多的各U复杂关pR?br /> <br /> 2Q?Hibernate是如何gq加?<br /> 1. Hibernate2延迟加蝲实现Qa)实体对象 b)集合QCollectionQ?br /> <br /> 2. Hibernate3 提供了属性的延迟加蝲功能<br /> <br /> 当Hibernate在查询数据的时候,数据q没有存在与内存中,当程序真正对数据的操作时Q对象才存在与内存中Q就实现了gq加载,他节省了服务器的内存开销Q从而提高了服务器的性能?br /> <br /> 3QHibernate中怎样实现cM间的关系?(如:一对多、多对多的关p?<br /> <br /> cMcM间的关系主要体现在表与表之间的关p进行操作,它们都市对对象进行操作,我们E序中把所有的表与c都映射在一P它们通过配置文g中的many-to-one、one-to-many、many-to-many?br /> <br /> 4Q?说下Hibernate的缓存机?br /> <br /> 1. 内部~存存在Hibernate中又叫一U缓存,属于应用事物U缓?br /> <br /> 2. 二~存Q?br /> a) 应用及缓?br /> b) 分布式缓?br /> 条gQ数据不会被W三方修攏V数据大在可接受范围、数据更新频率低、同一数据被系l频J用、非 关键数据<br /> c) W三方缓存的实现<br /> <br /> 5Q?Hibernate的查询方?br /> Sql、Criteria,object comptosition<br /> HqlQ?br /> 1?属性查?br /> 2?参数查询、命名参数查?br /> 3?兌查询<br /> 4?分页查询<br /> 5?l计函数<br /> <br /> 6Q?如何优化HibernateQ?br /> 1.使用双向一对多兌Q不使用单向一对多<br /> 2.灉|使用单向一对多兌<br /> 3.不用一对一Q用多对一取代<br /> 4.配置对象~存Q不使用集合~存<br /> 5.一对多集合使用Bag,多对多集合用Set<br /> 6. l承cM用显式多?br /> 7. 表字D要,表关联不要怕多Q有二~存撑腰<br /> <br /> <br /> 7Q?Struts工作机制Qؓ什么要使用StrutsQ?br /> 工作机制Q?br /> Struts的工作流E?<br /> 在web应用启动时就会加载初始化ActionServlet,ActionServlet?br /> struts-config.xml文g中读取配|信?把它们存攑ֈ各种配置对象<br /> 当ActionServlet接收C个客戯求时,执行如下流E?<br /> -(1)索和用户h匚w的ActionMapping实例,如果不存?p回请求\径无效信?<br /> -(2)如果ActionForm实例不存?创Z个ActionForm对象,把客h交的表单数据保存到ActionForm对象?<br /> -(3)Ҏ配置信息军_是否需要表单验?如果需要验?p用ActionForm的validate()Ҏ;<br /> -(4)如果ActionForm的validate()Ҏq回null或返回一个不包含ActionMessage的ActuibErrors对象, pC单验证成?<br /> -(5)ActionServletҎActionMapping所包含的映信息决定将h转发l哪个Action,如果相应?Action实例不存?先创徏q个实例,然后调用Action的execute()Ҏ;<br /> -(6)Action的execute()Ҏq回一个ActionForward对象,ActionServlet在把客户h转发l?ActionForward对象指向的JSPlg;<br /> -(7)ActionForward对象指向JSPlg生成动态网?q回l客?<br /> <br /> Z么要用:<br /> JSP、Servlet、JavaBean技术的出现l我们构建强大的企业应用pȝ提供了可能。但用这些技术构建的pȝ非常的繁乱,所以在此之上,我们需要一个规则、一个把q些技术组lv来的规则Q这是框架QStruts便应q而生?br /> <br /> ZStruts开发的应用?cȝ件构成:控制器组件、模型组件、视囄?br /> <br /> 8Q?Struts的validate框架是如何验证的Q?br /> 在struts配置文g中配|具体的错误提示Q再在FormBean中的validate()Ҏ具体调用?br /> <br /> 9Q?说下Struts的设计模?br /> MVC模式: web应用E序启动时就会加载ƈ初始化ActionServler。用h交表单时Q一个配|好的ActionForm对象被创建,q被填入表单相应的数据,ActionServlerҎStruts-config.xml文g配置好的讄军_是否需要表单验证,如果需要就调用ActionForm?ValidateQ)验证后选择请求发送到哪个ActionQ如果Action不存在,ActionServlet会先创徏q个对象Q然后调?Action的executeQ)Ҏ。ExecuteQ)从ActionForm对象中获取数据,完成业务逻辑Q返回一个ActionForward对象QActionServlet再把客户h转发lActionForward对象指定的jsplgQActionForward对象指定的jsp生成动态的|页Q返回给客户?br /> <br /> 10Q?spring工作机制及ؓ什么要?<br /> 1.spring mvch有的h都提交给DispatcherServlet,它会委托应用pȝ的其他模块负责负责对hq行真正的处理工作?br /> 2.DispatcherServlet查询一个或多个HandlerMapping,扑ֈ处理h的Controller.<br /> 3.DispatcherServlet误求提交到目标Controller<br /> 4.Controllerq行业务逻辑处理后,会返回一个ModelAndView<br /> 5.Dispathcher查询一个或多个ViewResolver视图解析?扑ֈModelAndView对象指定的视囑֯?br /> 6.视图对象负责渲染q回l客L?br /> <br /> Z么用Q?br /> {AOP 让开发h员可以创建非行ؓ性的x点,UCؓ横切x点,q将它们插入到应用程序代码中。?AOP 后,公共服务 Q比如日志、持久性、事务等Q就可以分解成方面ƈ应用到域对象上,同时不会增加域对象的对象模型的复杂性?br /> IOC 允许创徏一个可以构造对象的应用环境Q然后向q些对象传递它们的协作对象。正如单?倒置 所表明的,IOC 像?q来?JNDI。没有用一堆抽象工厂、服务定位器、单元素QsingletonQ和直接构造(straight constructionQ,每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaboratorQ?br /> Spring即一个AOP框架Q也是一IOC容器?Spring 最好的地方是它有助于您替换对象。有?SpringQ只要用 JavaBean 属性和配置文g加入依赖性(协作对象Q。然后可以很Ҏ地在需要时替换hcM接口的协作对象。}<br /> <br /> <br /> <br /> <br /> Spring 框架是一个分层架构,?7 个定义良好的模块l成。Spring 模块构徏在核心容器之上,核心容器定义了创建、配|和理 bean 的方式,如图 1 所C?br /> <br /> l成 Spring 框架的每个模块(或组Ӟ都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下Q?br /> <br /> ?核心容器Q核心容器提?Spring 框架的基本功能。核心容器的主要lg?BeanFactoryQ它是工厂模式的实现。BeanFactory 使用控制反{ QIOCQ模式将应用E序的配|和依赖性规范与实际的应用程序代码分开?br /> <br /> ?Spring 上下文:Spring 上下文是一个配|文Ӟ?Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能?br /> <br /> ?Spring AOPQ通过配置理Ҏ,Spring AOP 模块直接面向方面的~程功能集成C Spring 框架中。所以,可以很容易地?Spring 框架理的Q何对象支?AOP。Spring AOP 模块为基?Spring 的应用程序中的对象提供了事务理服务。通过使用 Spring AOPQ不用依?EJB lgQ就可以声明性事务管理集成到应用E序中?br /> <br /> ?Spring DAOQJDBC DAO 抽象层提供了有意义的异常层次l构Q可用该l构来管理异常处理和不同数据库供应商抛出的错误消息。异常层ơ结构简化了错误处理Qƈ且极大地降低了需要编写的异常代码数量Q例如打开和关闭连接)。Spring DAO 的面?JDBC 的异帔R从通用?DAO 异常层次l构?br /> <br /> ?Spring ORMQSpring 框架插入了若q个 ORM 框架Q从而提供了 ORM 的对象关pdP其中包括 JDO、Hibernate ?iBatis SQL Map。所有这些都遵从 Spring 的通用事务?DAO 异常层次l构?br /> <br /> ?Spring Web 模块QWeb 上下文模块徏立在应用E序上下文模块之上,为基?Web 的应用程序提供了上下文。所以,Spring 框架支持?Jakarta Struts 的集成。Web 模块q简化了处理多部分请求以及将h参数l定到域对象的工作?br /> <br /> ?Spring MVC 框架QMVC 框架是一个全功能的构?Web 应用E序?MVC 实现。通过{略接口QMVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText ?POI?br /> <br /> Spring 框架的功能可以用在Q?J2EE 服务器中Q大多数功能也适用于不受管理的环境。Spring 的核心要ҎQ支持不l定到特?J2EE 服务的可重用业务和数据访问对象。毫无疑问,q样的对象可以在不同 J2EE 环境 QWeb ?EJBQ、独立应用程序、测试环境之间重用?br /> <br /> IOC ?AOP<br /> <br /> 控制反{模式Q也UC依赖性介入)的基本概忉|Q不创徏对象Q但是描q创建它们的方式。在代码中不直接与对象和服务q接Q但在配|文件中描述哪一个组仉要哪一Ҏ务。容器(?Spring 框架中是 IOC 容器Q?负责这些联pd一赗?br /> <br /> 在典型的 IOC 场景中,容器创徏了所有对象,q设|必要的属性将它们q接在一P军_什么时间调用方法。下表列Z IOC 的一个实现模式?br /> <br /> <br /> <br /> <br /> Spring 框架?IOC 容器采用cd 2 和类? 实现?br /> <br /> <br /> 面向斚w的编E?br /> <br /> 面向斚w的编E,?AOPQ是一U编E技术,它允许程序员Ҏ切关注点或横切典型的职责分界U的行ؓQ例如日志和事务理Q进行模块化。AOP 的核心构造是斚wQ它那些媄响多个类的行为封装到可重用的模块中?br /> <br /> AOP ?IOC 是补充性的技术,它们都运用模块化方式解决企业应用E序开发中的复杂问题。在典型的面向对象开发方式中Q可能要日志记录语句放在所有方法和 Java cM才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,q以声明的方式将它们应用到需要日志的lg上。当Ӟ优势是 Java cM需要知道日志服务的存在Q也不需要考虑相关的代码。所以,?Spring AOP ~写的应用程序代码是松散耦合的?br /> <br /> AOP 的功能完全集成到?Spring 事务理、日志和其他各种Ҏ的上下文中?br /> <br /> IOC 容器<br /> <br /> Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean lg一起用。这个包通常不是qL接用,而是由服务器其用作其他多数功能的底层中介。下一个最高抽象?BeanFactory 接口Q它是工厂设计模式的实现Q允讔R过名称创徏和检索对象。BeanFactory 也可以管理对象之间的关系?br /> <br /> BeanFactory 支持两个对象模型?br /> <br /> ?单?模型提供了具有特定名U的对象的共享实例,可以在查询时对其q行索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想?br /> <br /> ?原型 模型保每次索都会创建单独的对象。在每个用户都需要自q对象Ӟ原型模型最适合?br /> <br /> bean 工厂的概忉| Spring 作ؓ IOC 容器的基。IOC 处理事情的责Q从应用程序代码{Ud框架。正如我在下一个示例中演示的那PSpring 框架使用 JavaBean 属性和配置数据来指出必设|的依赖关系?br /> <br /> BeanFactory 接口<br /> <br /> 因ؓ org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各U底层存储方法实现。最常用?BeanFactory 定义?XmlBeanFactoryQ它Ҏ XML 文g中的定义装入 beanQ如清单 1 所C?br /> <br /> 清单 1. XmlBeanFactory<br /> <br /> BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));<br /> <br /> ?XML 文g中定义的 Bean 是被消极加蝲的,q意呛_需?bean 之前Qbean 本n不会被初始化。要?BeanFactory ?beanQ只需调用 getBean() ҎQ传入将要检索的 bean 的名U即可,如清?2 所C?br /> <br /> 清单 2. getBean()<br /> <br /> MyBean mybean = (MyBean) factory.getBean("mybean");<br /> <br /> 每个 bean 的定义都可以?POJO Q用cd?JavaBean 初始化属性定义) ?FactoryBean。FactoryBean 接口Z?Spring 框架构徏的应用程序添加了一个间接的U别?br /> <br /> IOC CZ<br /> <br /> 理解控制反{最单的方式是看它的实际应用。在对由三部分组成的 Spring pd 的第 1 部分q行ȝӞ我用了一个示例,演示了如何通过 Spring IOC 容器注入应用E序的依赖关p(而不是将它们构徏q来Q?br /> <br /> 我用开启在U信用帐L用例作ؓL。对于该实现Q开启信用帐戯求用户与以下服务q行交互Q?br /> <br /> ?信用U别评定服务Q查询用L信用历史信息?br /> <br /> ?q程信息链接服务Q插入客户信息,客户信息与信用卡和银行信息q接hQ以q行自动借记Q如果需要的话)?br /> <br /> ?电子邮g服务Q向用户发送有关信用卡状态的电子邮g?br /> <br /> 三个接口<br /> <br /> 对于q个CZQ我假设服务已经存在Q理想的情况是用松散耦合的方式把它们集成在一赗以下清单显CZ三个服务的应用程序接口?br /> <br /> 清单 3. CreditRatingInterface<br /> <br /> public interface CreditRatingInterface {<br /> public boolean getUserCreditHistoryInfo<wbr>rmation(ICustomer iCustomer);<br /> }<br /> <br /> 清单 3 所C的信用U别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是?CreditRating cL供的?br /> <br /> 清单 4. CreditLinkingInterface<br /> <br /> public interface CreditLinkingInterface {<br /> <br /> public String getUrl();<br /> public void setUrl(String url);<br /> public void linkCreditBankAccount() throws Exception ;<br /> <br /> }<br /> <br /> 信用链接接口信用历史信息与银行信息Q如果需要的话)q接在一Pq插入用L信用卡信息。信用链接接口是一个远E服务,它的查询是通过 getUrl() Ҏq行的。URL ?Spring 框架?bean 配置机制讄Q我E后会讨论它。该接口的实现是?CreditLinking cL供的?br /> <br /> 清单 5. EmailInterface<br /> <br /> public interface EmailInterface {<br /> <br /> public void sendEmail(ICustomer iCustomer);<br /> public String getFromEmail();<br /> public void setFromEmail(String fromEmail) ;<br /> public String getPassword();<br /> public void setPassword(String password) ;<br /> public String getSmtpHost() ;<br /> public void setSmtpHost(String smtpHost);<br /> public String getUserId() ;<br /> public void setUserId(String userId);</div> <div id="wmqeeuq" class="blog_content">转自|络?/div> <img src ="http://www.aygfsteel.com/conans/aggbug/249547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/conans/" target="_blank">CONAN</a> 2009-01-02 15:13 <a href="http://www.aygfsteel.com/conans/articles/249547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中用proxool作数据源q接池的配置http://www.aygfsteel.com/conans/articles/232264.htmlCONANCONANFri, 03 Oct 2008 14:06:00 GMThttp://www.aygfsteel.com/conans/articles/232264.html 但是搜烦spring中配|proxool?数据源连接池的资料却几乎找不到详l点的?br />
因此自己整理如下Q?br />
  先下?
 
  http://surfnet.dl.sourceforge.net/sourceforge/proxool/proxool-0.9.0RC2.zip


  web.xml

-------------------------


  <servlet>
    <servlet-name>proxoolServletConfigurator</servlet-name>
    <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
    <init-param>
      <param-name>xmlFile</param-name>
      <param-value>WEB-INF/proxool.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>proxooladmin</servlet-name>
    <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>proxooladmin</servlet-name>
    <url-pattern>/proxooladmin</url-pattern>
  </servlet-mapping>


-------------------------

  proxool.xml

-------------------------
<?xml version="1.0" encoding="UTF-8"?>
<proxool-config>
  <proxool>
    <alias>blogdb</alias>
    <driver-url>jdbc:oracle:thin:@127.0.0.1:1521:ORADB</driver-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <driver-properties>
      <property name="user" value="lizongbo"/>
      <property name="password" value="password"/>
    </driver-properties>
    <maximum-connection-count>10</maximum-connection-count>
    <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql>
  </proxool>
</proxool-config>

spring里:
两种配置Q?br /> a:  <!-- 与上面的proxool以及web.xml里结合?->
    <bean id="mainDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
    <value>org.logicalcobwebs.proxool.ProxoolDriver</value>
    </property>
    <property name="url">
    <value>proxool.blogdb</value>
    </property>
    </bean>

b:<!-- 单独的类似dbcp的?->
  <bean id="mainDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
    <property name="driver">
      <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="driverUrl">
      <value>jdbc:oracle:thin:lizongbo/password@127.0.0.1:1521:ORADB</value>    
 <!--用户名和密码写在一h调用成功,不然会报 调用无效的参?错误Q下面设|用户名和密码的property好像是无效的Q其它数据库也是q样
 比如mysql的也要把用户名和密码写在url里:<property name="driverUrl" value="jdbc:mysql://localhost:3306/blogdb?user=lizongbo&amp;password=lizongbo" />
 -->
    </property>
    <property name="user"> <!-- 必须在这里也讄Q但?proxool却不使用它,或许是个bug-->
      <value>lizongbo</value>
    </property>
    <property name="password"> <!-- 必须在这里也讄Q但?proxool却不使用它,或许是个bug-->
      <value>lizongbo</value>
    </property>
    <property name="alias">
      <value>lizongbo</value>
    </property>
    <property name="houseKeepingSleepTime">
      <value>90000</value>
    </property>
    <property name="prototypeCount">
      <value>5</value>
    </property>
    <property name="maximumConnectionCount">
      <value>100</value>
    </property>
    <property name="minimumConnectionCount">
      <value>10</value>
    </property>
    <property name="trace">
      <value>true</value>
    </property>
    <property name="verbose">
      <value>true</value>
    </property>
  </bean>


CONAN 2008-10-03 22:06 发表评论
]]>
OpenSessionInView详解http://www.aygfsteel.com/conans/articles/213755.htmlCONANCONANWed, 09 Jul 2008 11:12:00 GMThttp://www.aygfsteel.com/conans/articles/213755.htmlOpenSessionInView详解 关键? Spring OpenSessionInView OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类Q其主要意思是在发起一个页面请求时打开Hibernate的SessionQ一直保持这个SessionQ直到这个请求结束,具体是通过一个Filter来实现的?׃Hibernate引入了Lazy LoadҎ,使得qHibernate的Session周期的对象如果再想通过getterҎ取到其关联对象的|Hibernate会抛Z个LazyLoad的Exception。所以ؓ了解册个问题,Spring引入了这个FilterQ得Hibernate的Session的生命周期变ѝ?首先分析一下它的源码,可以发现Q它所实现的功能其实比较简单: Java代码

 

  1 SessionFactory sessionFactory = lookupSessionFactory(request);    
  2   
  3 Session session = null;    
  4   
  5 boolean participate = false;    
  6   
  7   
  8   
  9 if (isSingleSession()) {    
 10   
 11 // single session mode    
 12   
 13 if (TransactionSynchronizationManager.hasResource(sessionFactory)) {    
 14   
 15 // Do not modify the Session: just set the participate flag.    
 16   
 17 participate = true;    
 18   
 19 else {    
 20   
 21 logger.debug("Opening single <A title=Hibernate href="http://www.google.cn/search?sbi=基金&amp;amp;q=基金&amp;amp;sbb=搜烦&amp;amp;sa=搜烦&amp;amp;client=pub-6430022987645146&amp;amp;forid=1&amp;amp;prog=aff&amp;amp;ie=GB2312&amp;amp;oe=GB2312&amp;amp;hl=zh-CN " target=_blank>Hibernate</A> Session in OpenSessionInViewFilter");    
 22   
 23 session = getSession(sessionFactory);    
 24   
 25 TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));    
 26   
 27 }    
 28   
 29 else {    
 30   
 31 // deferred close mode    
 32   
 33 if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {    
 34   
 35 // Do not modify deferred close: just set the participate flag.    
 36   
 37 participate = true;    
 38   
 39 else {    
 40   
 41 SessionFactoryUtils.initDeferredClose(sessionFactory);    
 42   
 43 }    
 44   
 45 }    
 46   
 47   
 48   
 49 try {    
 50   
 51 filterChain.doFilter(request, response);    
 52   
 53 finally {    
 54   
 55 if (!participate) {    
 56   
 57 if (isSingleSession()) {    
 58   
 59 // single session mode    
 60   
 61 TransactionSynchronizationManager.unbindResource(sessionFactory);    
 62   
 63 logger.debug("Closing single <A title=Hibernate href="http://www.google.cn/search?sbi=基金&amp;amp;q=基金&amp;amp;sbb=搜烦&amp;amp;sa=搜烦&amp;amp;client=pub-6430022987645146&amp;amp;forid=1&amp;amp;prog=aff&amp;amp;ie=GB2312&amp;amp;oe=GB2312&amp;amp;hl=zh-CN " target=_blank>Hibernate</A> Session in OpenSessionInViewFilter");    
 64   
 65 closeSession(session, sessionFactory);    
 66   
 67 }else {    
 68   
 69 // deferred close mode    
 70   
 71 SessionFactoryUtils.processDeferredClose(sessionFactory);    
 72   
 73 }    
 74   
 75 }    
 76   
 77 }    
 78   
 79   
 80   
 81 SessionFactory sessionFactory = lookupSessionFactory(request);    
 82   
 83 Session session = null;    
 84   
 85 boolean participate = false;    
 86   
 87   
 88   
 89 if (isSingleSession()) {    
 90   
 91 // single session mode    
 92   
 93 if (TransactionSynchronizationManager.hasResource(sessionFactory)) {    
 94   
 95 // Do not modify the Session: just set the participate flag.    
 96   
 97 participate = true;    
 98   
 99 else {    
100   
101 logger.debug("Opening single <A title=Hibernate href="http://www.google.cn/search?sbi=基金&amp;amp;q=基金&amp;amp;sbb=搜烦&amp;amp;sa=搜烦&amp;amp;client=pub-6430022987645146&amp;amp;forid=1&amp;amp;prog=aff&amp;amp;ie=GB2312&amp;amp;oe=GB2312&amp;amp;hl=zh-CN " target=_blank>Hibernate</A> Session in OpenSessionInViewFilter");    
102   
103 session = getSession(sessionFactory);    
104   
105 TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));    
106   
107 }    
108   
109 else {    
110   
111 // deferred close mode    
112   
113 if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {    
114   
115 // Do not modify deferred close: just set the participate flag.    
116   
117 participate = true;    
118   
119 else {    
120   
121 SessionFactoryUtils.initDeferredClose(sessionFactory);    
122   
123 }    
124   
125 }    
126   
127   
128   
129 try {    
130   
131 filterChain.doFilter(request, response);    
132   
133 finally {    
134   
135 if (!participate) {    
136   
137 if (isSingleSession()) {    
138   
139 // single session mode    
140   
141 TransactionSynchronizationManager.unbindResource(sessionFactory);    
142   
143 logger.debug("Closing single <A title=Hibernate href="http://www.google.cn/search?sbi=基金&amp;amp;q=基金&amp;amp;sbb=搜烦&amp;amp;sa=搜烦&amp;amp;client=pub-6430022987645146&amp;amp;forid=1&amp;amp;prog=aff&amp;amp;ie=GB2312&amp;amp;oe=GB2312&amp;amp;hl=zh-CN " target=_blank>Hibernate</A> Session in OpenSessionInViewFilter");    
144   
145 closeSession(session, sessionFactory);    
146   
147 }else {    
148   
149 // deferred close mode    
150   
151 SessionFactoryUtils.processDeferredClose(sessionFactory);    
152   
153 }    
154   
155 }    
156   
157 }  

在上qC码中Q首先获得SessionFactoryQ然后通过SessionFactory获得一个Session。然后执行真正的Action代码Q最后根据情况将Hibernate的Sessionq行关闭。整个思\比较清晰?注意Q在q里有个2个TipsQ?1Q通过getSession()获得的这个Session做了一?session.setFlushMode(FlushMode.NEVER); 有关FlushMode可以参考一下这文章。http://www2.matrix.org.cn/resource/article/2006-10-08/Hibernate+FlushMode+NEVER_312bca85-5699-11db-91a0-d98dff0aec60.html 2QSpringҎ到的Session做了一ơ绑定到当前U程的做法,使得q个Session是线E安全的?从上qC码其实可以得C些对我们的开发有帮助的结论: 1Q如果用了OpenSessionInView模式Q那么Spring会帮助你理Session的开和关Q从而你在你的DAO中通过HibernateDaoSupport拿到的getSession()ҎQ都是绑定到当前U程的线E安全的SessionQ即拿即用,最后会由Filterl一关闭?2Q由于拿到的Hibernate的Session被设|了session.setFlushMode(FlushMode.NEVER); 所以,除非你直接调用session.flush()Q否则Hibernate session无论何时也不会flushM的状态变化到数据库。因此,数据库事务的配置非常重要。(我们知道Q在调用org.hibernate.Transaction.commit()的时候会触发session.flush()Q我曄见过很多人在使用OpenSessionInView模式Ӟ都因为没有正配|事务,D了底层会抛出有关FlushMode.NEVER的异常?OpenSessionInViewq个模式使用比较单,也成Z大家在Web开发中l常使用的方法,不过它有时候会带来一些意想不到的问题Q这也是在开发中需要注意的?1. 在StrutsQSpringQHibernate环境中,׃配置的问题导致的模式失效 q个问题以前论坛曄讨论q,可以参考一下下面这个帖子: http://www.javaeye.com/topic/15057 2. OpenSessionInView的效率问?q个问题也有人在论坛提出q,Robbin曄做过具体的测试,可以具体参考一下下面这个帖子: http://www.javaeye.com/topic/17501 3. ׃使用了OpenSessionInView模式后造成了内存和数据库连接问?q个问题是我在生产环境中到的一个问题。由于用了OpenSessionInView模式QSession的生命周期变得非帔R。虽然解决了Lazy Load的问题,但是带来的问题就是Hibernate的一U缓存,也就是SessionU别的缓存的生命周期会变得非帔RQ那么如果你在你的Service层做大批量的数据操作Ӟ其实q些数据会在~存中保留一份,q是非常耗费内存的。还有一个数据库q接的问题,存在的原因在于由于数据库的Connection是和Sessionl在一LQ所以,Connection也会得不到及时的释放。因而当pȝ出现业务非常J忙Q而计量又非常大的时候,往往数据q接池的q接C不够。这个问题我至今非常头痛Q因为有很多客户Ҏ据连接池的数量会有限Ӟ不会l你无限制的增加下去?4. 使用了OpenSessionInView模式以后取数据的事务问题 在用了OpenSessionInView以后Q其实事务的生命周期比Session的生命周期来得短Q就以ؓ着Q其实有相当一部分的查询是不被U_C务的范围内的Q此时是否会d脏数据?q个问题我至今不敢确认,有经验的朋友h教一下?最后提一下OpenSessionInView模式的一些替代方案,可以使用OpenSessionInViewInterceptor来代替这个FilterQ此时可以用Spring的AOP配置Q将q个Interceptor配置C所需要的层次上去。另外就是只能用最古老的Hibernate.initialize()Ҏq行初始化了?

CONAN 2008-07-09 19:12 发表评论
]]>
【翻译】spring配置全书(?http://www.aygfsteel.com/conans/articles/213465.htmlCONANCONANTue, 08 Jul 2008 15:03:00 GMThttp://www.aygfsteel.com/conans/articles/213465.html阅读全文

CONAN 2008-07-08 23:03 发表评论
]]>
Q{载)spring+hibernate避免延迟加蝲异常 http://www.aygfsteel.com/conans/articles/212420.htmlCONANCONANThu, 03 Jul 2008 12:30:00 GMThttp://www.aygfsteel.com/conans/articles/212420.html在hibernate中,延迟加蝲?个非常大的优点,但有时候却l我们带来一些小ȝQ在后台查询l束后,session已经关闭Q但在前台显C的时候,如果存在兌关系׃产生延迟加蝲异常?br /> 解决办法是客L每次h分?个session,请求结果返回给客户端,q完成展现后关闭session?br /> 实现q个功能非常单,在web.xml中加入以下配|?br />

<filter>
      <filter-name>hibernateFilter</filter-name>
              <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>
      <init-param>
          <param-name>singleSession</param-name>
          <param-value>true</param-value>
      </init-param>
</filter>
<filter-mapping>
      <filter-name>hibernateFilter</filter-name>
      <url-pattern>*.do</url-pattern>
  </filter-mapping>


使用spring提供q个qo器就可以实现session的集中管理了Q所有以.dol尾的请求都自动分配?个session,q且在这个请求过E中都用这个session.



CONAN 2008-07-03 20:30 发表评论
]]>
Spring Application Platform - SpringSource的应用服务器发布http://www.aygfsteel.com/conans/articles/210659.htmlCONANCONANWed, 25 Jun 2008 11:43:00 GMThttp://www.aygfsteel.com/conans/articles/210659.html2008q的5.1力_节,SpringSource发布了策划已久的开源应用服务器QSpringSource Application Platform。JavaEye的新闻频道也有报道:

SpringSource 宣布发布 SpringSource Application Platform Beta

M来说QSpring的Application Platform是一个根据Rod Johnson自己对于Java企业应用开发的理解Q自行制订了一套应用服务器的标准,q且开发了q样一个专用的应用服务器出来。但是Spring的应用服务器也有自己的一些特Ԍ让我们简单看看:



q是Spring应用服务器的l构图。他的底层是用Equinoxq个OSGi框架来搭建的Q我们知道Equinox为底层框架搭建的应用软gq有EclipseQ他的特Ҏ高度的模块化Q可定制化和在线的部|和卸蝲Q以及模块的版本理、依赖管理等功能?

Spring在Equinox的基之上开发了DMKq样一个框Ӟ卛_态模块内?Dynamic Module Kernel)QDMK装了Equinox的很多底层操作,向上提供了更加方便的API和管理^台?

在DMK之上Q所有的功能l统以模块的方式q行在DMK之上Q例如Tomcat是以模块的方式部v在Spring应用服务器上Q此外还集成了应用发布模块、系l管理模块等{。所有的模块都可以以标准的方式部|到Spring应用服务器上面,具体模块的信息,可以看看Spring应用服务器的repository目录下面的文件?

Spring应用服务器给我的感觉和JBoss应用服务器很像。JBoss也是cMq样的结构,JBoss最核心的底层是JBoss MicrokernelQ即微内核,q个MicroKernel提供了JMX的接口,而JBoss应用服务器的所有其他功能,都是通过标准的JMX来插入到MicroKernel之上的,例如Tomcat、Hibernate3、EJB、TransactionQDB Pool{等Q都是标准的SAR模块包?

他们之间比较大的不同在于Spring应用服务器底层用的是OSGil构来进行模块化的管理和部vQ而JBoss使用的是ZJMX的模块化理。用OSGi的一大好处就是可以在U的热部|和卸蝲Qƈ且可以提供良好的模块版本理?

Spring应用服务器我从我初步的接触来看,我觉得有一些比较有特色的地方:

一、轻量和模块化

Spring应用服务器本质上是ZEquinox的Spring DMKQ这DMK本n是很的Q在DMK上面可以部v各种各样的功能模块来扩展应用服务器的功能Q模块化E度非常高,内核本n是很轻量U的?

看Spring Applicaiton Platform自己的文档上面说Q如果去掉Tomcat模块的话Q启动应用服务器只占15MB内存(能用来干啥?)Q其实目前Spring应用服务器ƈ没有提供很多功能模块上来Q只是一个web模块、一个部|模块和一个管理监控模块。但是计划在2.0版本增加更多的模块、例如群集支持模块、SOA模块{等?

二、在U的热部|和卸蝲

得益于EquinoxQ可以在服务器运行期增加功能模块、部|新的Web应用Q或者更新、卸载Web应用Q所有的q些操作都可以Onlineq行。这恐怕是比传l的Java应用服务器最领先的特色了?

三、库的版本管理和依赖

jar包的版本冲突和依赖是传统Java应用很头疼的一个方面,Spring应用服务器提Z自己的一套库版本理和库依赖理的机Ӟ具体的原理我q没有仔l的研究Q貌g是利用了OSGi的功能?

ȝQ?

Spring应用服务器和Spring框架q没有什么直接的关系。你用其他框架开发的Web应用也可以部|到spring应用服务器上来,只是Spring应用服务器提供了很多可能你觉得不错的功能Q吸引你使用spring的应用服务器Q而不是tomcat或者jboss。但是Spring应用服务器ƈ不符合Java EE的标准,因此可以看成是一个完全无视JCP的应用服务器Q也是Rod Johnson大胆甩开标准q军应用服务器市场的试?

CONAN 2008-06-25 19:43 发表评论
]]>
Spring和struts2的整?/title><link>http://www.aygfsteel.com/conans/articles/209888.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 22 Jun 2008 11:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/conans/articles/209888.html</guid><description><![CDATA[<table style="table-layout: fixed"> <tbody> <tr> <td> <div id="wmqeeuq" class="cnt"> <div id="wmqeeuq" class="cnt">在Struts2中整合Spring的IoC支持是一件十分简单的事情。让我们一步一步来实现Q?br /> 1Q复制struts2-spring-plugin-x-x-x.jar和相应的spring.jar?WEB-INF/lib目录下?br /> 2Q在struts.properties中设|struts.objectFactory属性?br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; border-bottom: #3c78b5 1px dashed; background-color: #f0f0f0; text-align: center"><strong>struts.properties</strong></div> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre>struts.objectFactory = spring </pre> </div> </div> 或者是在XML文g中进行常量配|?br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; border-bottom: #3c78b5 1px dashed; background-color: #f0f0f0; text-align: center"><strong>struts.xml</strong></div> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre><struts>        <constant name="struts.objectFactory" value="spring" /> </struts> </pre> </div> </div> 3Q配|Spring监听?br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; border-bottom: #3c78b5 1px dashed; background-color: #f0f0f0; text-align: center"><strong>web.xml</strong></div> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre><listener>        <listener-class>org.springframework.web.context.ContextLoaderListener<span id="wmqeeuq" class="code-tag"></listener-class> </listener> </span> </pre> </div> </div> 通过Spring配置来注册对?br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; border-bottom: #3c78b5 1px dashed; background-color: #f0f0f0; text-align: center"><strong>applicationContext.xml</strong></div> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre><?xml version=<span id="wmqeeuq" class="code-quote">"1.0"</span> encoding="UTF-8"?> <!DOCTYPE beans PUBLIC        "-//SPRING//DTD BEAN//EN"        "http://www.springframework.org/dtd/spring-beans.dtd"> <beans default-autowire="byName">        <bean id="personManager" class="com.acme.PersonManager"/> </beans> </pre> </div> </div> 当然你也可以拥有更多的Spring配置文g。在web.xml中进行下列设|,从而Spring的ApplicationContext通过匚w所l定模式的文件来初始化对?br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre><!-- 用来定位Spring XML文g的上下文配置 --> <context-param>        <param-name>contextConfigLocation<span id="wmqeeuq" class="code-tag"></param-name>        <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> </context-param> </span> </pre> </div> </div> 4Q修改你的Struts配置文g<br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; border-bottom: #3c78b5 1px dashed; background-color: #f0f0f0; text-align: center"><strong>struts.xml</strong></div> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre><!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"        "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>        <include file="struts-default.xml"/>        <package name="default" extends="struts-default">            <action name="foo" class="com.acme.Foo">                <result>foo.ftl</result>            </action>        </package>        <package name="secure" namespace="/secure" extends="default">            <action name="bar" class="bar">                <result>bar.ftl</result>            </action>        </package> </struts> </pre> </div> </div> 默认情况下,Spring从下面的文g中寻找ؓbar所做的配置<br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; border-bottom: #3c78b5 1px dashed; background-color: #f0f0f0; text-align: center"><strong>applicationConext.xml</strong></div> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC        "-//SPRING//DTD BEAN//EN"        "http://www.springframework.org/dtd/spring-beans.dtd"> <beans default-autowire="byName">        <bean id="bar" class="com.my.BarClass" singleton="false"/>        ... </beans> </pre> </div> </div> 5Q好了,现在你的Struts2和Springp正常的一起工作了。有几个配置技术点需要详l说明下Q装配模式。你可以通过讄修改struts.properties中下列属性的值来改变装配模式?br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre class="code-java">struts.objectFactory.spring.autoWire = type </pre> </div> </div> 该参数可供选择的设|值有<br /> <table style="margin: 5px; border-collapse: collapse"> <tbody> <tr> <th style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid; background-color: #f0f0f0; text-align: center">name</th> <td style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid">按照你的action的属性的名字和Spring里的bean的名字匹配,如果匚wp动装配。这?strong>~省?/strong></td> </tr> <tr> <th style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid; background-color: #f0f0f0; text-align: center">type</th> <td style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid">按照你的action的属性的cdQ在Spring注册的bean中查找,如果相同p动装配。这需要你在Spring中仅注册了一个此cd的bean</td> </tr> <tr> <th style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid; background-color: #f0f0f0; text-align: center">auto</th> <td style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid">Spring会试图自动监来扑ֈ最好的Ҏ自动装配你的action</td> </tr> <tr> <th style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid; background-color: #f0f0f0; text-align: center">constructor</th> <td style="border-right: #ccc 1px solid; padding-right: 4px; border-top: #ccc 1px solid; padding-left: 4px; padding-bottom: 3px; border-left: #ccc 1px solid; padding-top: 3px; border-bottom: #ccc 1px solid">Spring会自动装配bean的构造函数的参数</td> </tr> </tbody> </table> 是否使用cȝ存。你可以通过讄修改struts.properties中下列属性的值来改变是否使用Spring自n的类~存机制。可以设定的gؓtrue或falseQ默认ؓtrue?br /> <div style="border-right: #3c78b5 1px dashed; border-top: #3c78b5 1px dashed; margin: 10px; border-left: #3c78b5 1px dashed; line-height: 13px; border-bottom: #3c78b5 1px dashed"> <div style="padding-right: 3px; padding-left: 3px; padding-bottom: 3px; padding-top: 3px; background-color: #f0f0f0; text-align: left"> <pre>struts.objectFactory.spring.useClassCache = false </pre> </div> </div> </div> </div> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/conans/aggbug/209888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/conans/" target="_blank">CONAN</a> 2008-06-22 19:00 <a href="http://www.aygfsteel.com/conans/articles/209888.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">SHOW</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>| <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>