Webapp mit Spring3 und JSF2
Singleton oder nicht?
HelloWorldBean verwendet MyReverseService
Annotation:
@javax.inject.Named
@javax.faces.bean.RequestScoped
public class HelloWorldBean
{
private String name = "";
@javax.inject.Inject
private MyReverseService service;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public void setService(MyReverseService service)
{
this.service = service;
}
public String getReverseName()
{
return service.reverse(name);
}
}
public interface MyReverseService
{
public String reverse(String name);
}
@javax.inject.Named
@javax.faces.bean.ApplicationScoped
public class MyReverseServiceImpl implements MyReverseService
{
public String reverse(String name)
{
return new StringBuffer(name).reverse().toString().toLowerCase();
}
}
ExpressionLanguage greift auf HelloWorldBean zu
<h:form id="reverseForm">
Input: <h:inputText id="name" value="#{helloWorldBean.name}" />
<h:commandButton id="submit" type="submit" action="spring" />
</h:form>
Reverse: <h:outputText id="reverse" value="#{helloWorldBean.reverseName}" />
Problem:
HelloWorldBean wird ein Singleton, da Spring wohl den javax.faces.bean.RequestScoped nicht unterstützt.
Lösung 1:
Eine von Spring unterstützte Annotation:
@org.springframework.context.annotation.Scope(value="request")
Lösung 2:
XML-basierte Spring-Configuration (Vorteil: es können alle Annotations gelöscht werden und somit sind alle Klassen wieder POJOs (Plain Old Java Objects):
<bean id="helloWorldBean" class="bean.HelloWorldBean" scope="request"> <property name="service" ref="myReverseServiceImpl" /> </bean> <bean id="myReverseServiceImpl" class="service.impl.MyReverseServiceImpl" scope="singleton" />