我想做一个添加用户的服务,这个服务里面有一个属性就是那个待添加的用户。
每次运行这个服务的时候我发现虽然在配置文件里面用户的bean定义的是prototype但是由于服务的bean是singleton所以致使他的这个属性也有了singleton的行为,该怎么办呢?
每次运行这个服务的时候我发现虽然在配置文件里面用户的bean定义的是prototype但是由于服务的bean是singleton所以致使他的这个属性也有了singleton的行为,该怎么办呢?
解决方案 »
- 如何html跳转action中的一个方法
- 求救:急急急急急!tomcat部署的项目在哪里?
- 请大家帮忙分析下问题出在哪? hibernate 中 得不到session 用的是hibernate+spring mvc
- 关于TELNET到TOMCAT服务器上的超时问题
- 为什么request.getParameter("XX")会为空??
- JSP有用到水晶報表嗎
- 高手请指点(关于存储过程操作)
- 求教关于决策支持系统中模型库的建立!!!(在线等待答复)
- 奇怪的问题
- jsp安装问题?
- 用jsp自定义标签实现if(obj !=null){}了,但是不知道怎么实现else,高手请指教,已附代码,来看看吧。。。
- 俄罗斯方块游戏java代码,有点看不懂
另外:有状态的对象一般不要被注入
陈雄华的书第110页给得例子, lookup-method就是用来解决这个问题的。我专门作了测试类,
User:表示User对象, 为了显示出它是个prototype的,我专门加了一个无意义的Date属性;public class User{
private String username;
private String password;
private Date date = new Date();
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String toString(){
return "\nUsername: " + username +" Password: " + password + " Date: " + date;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}Service:public abstract class Service { private User user; public abstract User getUser(); public void setUser(User user) {
this.user = user;
}
public void addUser(){
System.out.println("A user [" + getUser().toString() + "] will be added in.");
}}这里有个abstract方法, 将通过bean 配置文件的lookup标签来解决这个方法得返回值问题。
配置文件: <bean id="user" class="test.User" scope="prototype">
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
<bean id="service" class="test.Service">
<!--property name="user" ref="user"/-->
<lookup-method name="getUser" bean="user" />
</bean>测试文件:public class Test { public static void main(String[] args) throws ParseException, ServletException, IOException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("test-bean.xml");
Service s = (Service)ctx.getBean("service");
s.addUser();
try {
Thread.sleep(1000);//睡一觉,以便结果更明显;
} catch (InterruptedException e) {
}
Service s1 = (Service)ctx.getBean("service");
s1.addUser();
}
}输出结果:
A user [
Username: username Password: password Date: Fri Nov 14 15:22:02 CST 2008] will be added in.
A user [
Username: username Password: password Date: Fri Nov 14 15:22:03 CST 2008] will be added in.
Service可以不是abstract的,
getUser()也可以不是abstract的,<lookup-method name="getUser" bean="user" />这句话spring将通过动态代理修改getUser()方法。