﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-微笑沙漠-随笔分类-spring</title><link>http://www.blogjava.net/cyantide/category/36408.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 25 Sep 2009 11:45:08 GMT</lastBuildDate><pubDate>Fri, 25 Sep 2009 11:45:08 GMT</pubDate><ttl>60</ttl><item><title>Spring Bean作用域介绍(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html</link><dc:creator>微笑沙漠</dc:creator><author>微笑沙漠</author><pubDate>Mon, 14 Sep 2009 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/294980.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/294980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/294980.html</trackback:ping><description><![CDATA[<br />
<br />
singleton：SpringIoc容器只会创建该Bean的唯一实例，所有的请求和引用都只使用这个实例
<br />
Property:&nbsp; 每次请求都创建一个实例
<br />
request:&nbsp;&nbsp;&nbsp;
在一次Http请求中，容器会返回该Bean的同一个实例，而对于不同的用户请求，会返回不同的实例。需要注意的是，该作用域仅在基于Web的
Spring ApplicationContext情形下有效，以下的session和global Session也是如此
<br />
session：同上，唯一的区别是请求的作用域变为了session
<br />
global session：全局的HttpSession中，容器会返回该bean的同一个实例，典型为在是使用portlet context的时候有效（这个概念本人也不懂）
<br />
<br />
注意：如果要用到request，session，global session时需要配置
<br />
<br />
servlet2.4及以上：
<br />
在web.xml中添加：
<br />
&lt;listener&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.scope.RequestContextListener /&gt;
<br />
&lt;/listener&gt;
<br />
<br />
servlet2.4以下：
<br />
需要配置一个过滤器
<br />
&lt;filter&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;XXXX&lt;/filter-name&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.springframework.web.filter.RequestContextFilter&lt;/filter-class&gt;
<br />
&lt;filter-mapping&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;XXXX&lt;/filter-name&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
<br />
&lt;/filter-mapping&gt;
<br />
<br />
另外，从2.0开始，可以自己定义作用域，但需要实现scope，并重写get和remove方法
<br />
<br />
特别要引起注意的是：
<br />
&nbsp;&nbsp;
一般情况下前面两种作用域是够用的，但如果有这样一种情况：singleton类型的bean引用一个prototype的bean时会出现问题，因为
singleton只初始化一次，但prototype每请求一次都会有一个新的对象，但prototype类型的bean是singleton类型
bean的一个属性，理所当然不可能有新prototpye的bean产生，与我们的要求不符
<br />
<br />
解决方法：
<br />
1.放弃Ioc，这与设计初衷不符，并代码间会有耦合
<br />
2，Lookup方法注入，推荐
<br />
<br />
但在用Lookup方法注入时也需要注意一点：需要在引用的Bean中定一个一个抽象地返回被引用对象的方法
<br />
<br />
package com.huyong.lookup;
<br />
<br />
import java.util.Calendar;
<br />
<br />
/**
<br />
* @author HuYong Email:yate7571@hotmail.com
<br />
*/
<br />
public class CurrentTime {
<br />
private Calendar now = Calendar.getInstance();
<br />
<br />
public void printCurrentTime() {
<br />
System.out.println("Current Time:" + now.getTime());
<br />
}
<br />
<br />
}
<br />
<br />
<br />
package com.huyong.lookup;
<br />
<br />
/**
<br />
* @author HuYong Email:yate7571@hotmail.com
<br />
*/
<br />
public abstract class LookupBean {
<br />
private CurrentTime currentTime;
<br />
<br />
public CurrentTime getCurrentTime() {
<br />
return currentTime;
<br />
}
<br />
<br />
public void setCurrentTime(CurrentTime currentTime) {
<br />
this.currentTime = currentTime;
<br />
<br />
}
<br />
public abstract CurrentTime createCurrentTime();
<br />
<br />
}
<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
<br />
&lt;beans xmlns="http://www.springframework.org/schema/beans"
<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<br />
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;
<br />
<br />
&lt;bean id="currentTime" class="com.huyong.lookup.CurrentTime"
<br />
scope="prototype"&gt;
<br />
&lt;/bean&gt;
<br />
&lt;bean id="lookupBean" class="com.huyong.lookup.LookupBean"
<br />
scope="singleton"&gt;
<br />
&lt;lookup-method name="createCurrentTime" bean="currentTime" /&gt;
<br />
&lt;property name="currentTime" ref="currentTime"&gt;&lt;/property&gt;
<br />
&lt;/bean&gt;
<br />
<br />
&lt;/beans&gt;
<br />
<br />
<br />
Main Test：
<br />
package com.huyong.lookup;
<br />
<br />
import org.springframework.beans.factory.BeanFactory;
<br />
import org.springframework.beans.factory.xml.XmlBeanFactory;
<br />
import org.springframework.core.io.ClassPathResource;
<br />
<br />
/**
<br />
* @author HuYong Email:yate7571@hotmail.com
<br />
*/
<br />
public class LookupMain {
<br />
<br />
/**
<br />
* @param args
<br />
* @throws Exception
<br />
*/
<br />
public static void main(String[] args) throws Exception {
<br />
ClassPathResource resource = new ClassPathResource(
<br />
"applicationContext.xml");
<br />
BeanFactory factory = new XmlBeanFactory(resource);
<br />
<br />
LookupBean lookupBean = (LookupBean) factory.getBean("lookupBean");
<br />
System.out.println("----------first time---------");
<br />
System.out.println("getCurrentTime:");
<br />
lookupBean.getCurrentTime().printCurrentTime();
<br />
System.out.println("createCurrentTime:");
<br />
lookupBean.createCurrentTime().printCurrentTime();
<br />
<br />
Thread.sleep(12345);
<br />
<br />
System.out.println("---------second time---------");
<br />
System.out.println("getCurrentTime:");
<br />
LookupBean lookupBean02 = (LookupBean) factory.getBean("lookupBean");
<br />
lookupBean02.getCurrentTime().printCurrentTime();
<br />
System.out.println("createCurrentTime:");
<br />
lookupBean02.createCurrentTime().printCurrentTime();
<br />
<br />
}
<br />
<br />
}
<img src ="http://www.blogjava.net/cyantide/aggbug/294980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">微笑沙漠</a> 2009-09-14 10:30 <a href="http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中使用spring aop (转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html</link><dc:creator>微笑沙漠</dc:creator><author>微笑沙漠</author><pubDate>Tue, 05 Aug 2008 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/220114.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/220114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/220114.html</trackback:ping><description><![CDATA[<p>在JSP中使用Spring其实很容易，主要用到Spring的WebApplicationContextUtils.getWebApplicationContext函数。</p>
<p>要再JSP里面得到ApplicationContext需要这么做，首先import="org.springframework.web.context.support.*,org.springframework.context.*"</p>
<p>然后可以通过如何做法：</p>
<p><font color="#ff0000">ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());</font></p>
<p>这样就得到了ApplicationContext，就可以操作Spring了。</p>
<p>JSP本来就可以认为是一个Servlet，所以使用getServletContext()就是理所应当了。</p>
<p>一：web.xml配置<br />
<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;context&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;<br />
org.springframework.web.context.ContextLoaderServlet<br />
&lt;/servlet-class&gt;<br />
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;</p>
<p>&nbsp;</p>
<p><br />
二：在JSP<br />
<br />
&lt;%@ page import="org.springframework.context.ApplicationContext"%&gt;<br />
&lt;%@ page import="org.springframework.web.context.support.WebApplicationContextUtils"%&gt;<br />
&lt;%@ page import="com.yourcompany.service.CategoryService"%&gt;<br />
<br />
&lt;%<br />
//上面的CategoryService引用是我自己的东西<br />
//applicationContext.xml中一定要有完整的依赖链，从dataSource到CategoryService<br />
<br />
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());<br />
CategoryService cs = (CategoryService) ctx.getBean("CategoryService");<br />
List list =cs.getCategoryDAO().findAll();<br />
%&gt;</p>
 <img src ="http://www.blogjava.net/cyantide/aggbug/220114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">微笑沙漠</a> 2008-08-05 11:11 <a href="http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>