Ich verfolge diese tutorial in Bezug auf das Pooling von Objekten im Frühjahr. Ich habe den Anweisungen des Tutorials gefolgt, aber wenn ich meine Anwendung starte, wird immer eine neue Instanz des Objekts generiert. Ich erwarte, dass vorhandene Objekte wiederverwendet werden, da ich die Objekte zusammenfasse. Daher sollten keine neuen Instanzen erstellt werden. Wenn ich auf die Getter-Methode der Bean zugreife, wird erneut eine neue Instanz der Bean erstellt.Wie poole ich Objekte im Frühling?
Was hätte ich falsch machen können? Habe ich das Konzept des Poolings im Frühling missverstanden?
Unten ist mein Code:
Anwendungskontext: (. Dies ist nur der Körper meines Anwendungskontext)
<bean id="simpleBeanTarget" class="com.bean.SimpleBean" scope="prototype">
</bean>
<bean id="poolTargetSource" class="org.springframework.aop.target.CommonsPoolTargetSource">
<property name="targetBeanName" value="simpleBeanTarget" />
<property name="maxSize" value="2" />
</bean>
<bean id="simpleBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource" ref="poolTargetSource" />
</bean>
Der Controller: (Dies ist nur der Körper meines Methode)
@RequestMapping("/hello")
public ModelAndView helloWorld(HttpServletRequest request, HttpServletResponse response)
{
String message = "Hello World, Spring 3.";
try
{
System.out.println("Accessing Application Context");
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("Getting Bean");
SimpleBean simpleBean = (SimpleBean) context.getBean("simpleBean");
//A new SimpleBean... is printed here.
System.out.println("Displaying Hello World: " + simpleBean.getRandomNum());
//After this line, A new SimpleBean... is printed again. I simply access the getter method. Why does it create a new instance of SimpleBean?
return new ModelAndView("hello", "message", message);
}catch(Exception e)
{
System.out.println("Error: " + e);
e.printStackTrace();
return new ModelAndView("hello", "message", "Error! " + e.getMessage());
}
}
Die Bohne ich Pooling:
package com.bean;
import java.util.Random;
public class SimpleBean
{
int randomNum;
String str;
SimpleBean()
{
Random randomGenerator = new Random();
randomNum = randomGenerator.nextInt(100);
//I'm printing this line just to check if a instance of this bean is created.
System.out.println("#####################A new SimpleBean was born: " + randomNum);
str = "This is a string.";
}
public int getRandomNum()
{
return randomNum;
}
public void setRandomNum(int randomNum)
{
this.randomNum = randomNum;
}
public String getStr()
{
if (str == null)
return "str is null";
return str;
}
public void setStr(String str)
{
this.str = str;
}
}
Der Körper meines web.xml:
<display-name>Spring3MVC</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
Haben überprüfen Sie für mehr als 2 Wünsche? – Kishore
Ja. Ich habe versucht, mehr als 2 Anfragen auszugeben, selbst die 'maxSize' meines Pools ist nur 2. Alle Anfragen, die ich gemacht habe, haben eine neue Instanz von' SimpleBean' erstellt, was ich nicht erwartet habe. Ich erwarte, dass vorherige Instanzen von SimpleBean wiederverwendet werden. – Arci
Ich habe gerade den Spring-Source-Code von Bean Kontext überprüft. Ich finde den Code nicht heraus, in dem 'ClassPathXmlApplicationContext' das Singleton zwischenspeichert. aber ich weiß, dass diese Klasse 'SingletonBeanFactoryLocator' den Anwendungskontext durch factoryKey zwischenspeichert, ich wickle ihn ein und benutze ihn oft in meinem System. –