我有一个普通的POJO在Spring中自动装配,其属性似乎仍然存在。
我发现幸福的路径是好的 - 设置bean属性然后返回,但是当我不在快乐的路径而我不再希望设置属性(在这种情况下是responseCode)时,我发现它仍然是设置为上一个值(当呼叫成功时)。
我希望这个值不被设置,并且等于我目前在模型中指定的值。
我有以下POJO原型bean
package com.uk.jacob.model;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("prototype")
public class Website {
public String url;
public boolean response;
public int responseCode = 0;
}
我在服务类中设置它的信息
package com.uk.jacob.service;
import java.net.HttpURLConnection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.uk.jacob.adapter.HttpAdapter;
import com.uk.jacob.model.Website;
@Component
public class PingerService {
@Autowired
HttpAdapter httpAdapter;
@Autowired
Website website;
public Website ping(String urlToPing) {
website.url = urlToPing;
try {
HttpURLConnection connection = httpAdapter.createHttpURLConnection(urlToPing);
website.response = true;
website.responseCode = connection.getResponseCode();
} catch (Exception e) {
website.response = false;
}
return website;
}
}
从RestController中调用
package com.uk.jacob.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.uk.jacob.model.Website;
import com.uk.jacob.service.PingerService;
@RestController
@RequestMapping("api/v1/")
public class PingController {
@Autowired
PingerService pingerService;
@RequestMapping(value = "ping", method = RequestMethod.GET)
public Website getPing(@RequestParam String url){
return pingerService.ping(url);
}
}
答案 0 :(得分:0)
你的Website
bean是@Scope("prototype")
的事实意味着每次在这个bean的创建时它被作为依赖项注入另一个bean时,就会创建并注入一个新实例。在这种情况下,PingerService
会获得Website
的新实例。如果同时将Website
注入另一个名为Website2
的bean,则会注入另一个(新)实例。
如果您在Website
内的每次调用时预期Website
是新的,那么仅使用原型注释就无法做到这一点。您需要公开上下文并调用ApplicationContext#getBean("website")
。
答案 1 :(得分:0)
对于您的用例,我了解您需要为每个请求提供一个新的Website bean实例。
使用@Scope("请求")。
另一方面,原型范围意味着它将为每个到处都看到的每个自动装配网站创建一个单独的实例。例如,PingerService将拥有自己的网站bean,并且不会在具有相同自动装配的其他类上共享,但其值将在PingerService上的http请求中保持不变。