@Scope("protype") bean 스코프가 새로운 bean을 생성하지 않음
컨트롤러에 주석이 달린 시제품 콩을 사용하고 싶다.하지만 봄은 대신 싱글톤 콩을 만들어 내고 있다.그 코드는 다음과 같습니다.
@Component
@Scope("prototype")
public class LoginAction {
private int counter;
public LoginAction(){
System.out.println(" counter is:" + counter);
}
public String getStr() {
return " counter is:"+(++counter);
}
}
컨트롤러 코드:
@Controller
public class HomeController {
@Autowired
private LoginAction loginAction;
@RequestMapping(value="/view", method=RequestMethod.GET)
public ModelAndView display(HttpServletRequest req){
ModelAndView mav = new ModelAndView("home");
mav.addObject("loginAction", loginAction);
return mav;
}
public void setLoginAction(LoginAction loginAction) {
this.loginAction = loginAction;
}
public LoginAction getLoginAction() {
return loginAction;
}
}
속도 템플릿:
LoginAction counter: ${loginAction.str}
봄config.xml
는 컴포넌트 스캔을 유효하게 하고 있습니다.
<context:annotation-config />
<context:component-scan base-package="com.springheat" />
<mvc:annotation-driven />
매번 카운트가 증가합니다.내가 어디서 잘못하고 있는지 모르겠어!
갱신하다
@gkamal님의 제안대로HomeController
webApplicationContext
- 인식했고 문제를 해결했습니다.
업데이트된 코드:
@Controller
public class HomeController {
@Autowired
private WebApplicationContext context;
@RequestMapping(value="/view", method=RequestMethod.GET)
public ModelAndView display(HttpServletRequest req){
ModelAndView mav = new ModelAndView("home");
mav.addObject("loginAction", getLoginAction());
return mav;
}
public LoginAction getLoginAction() {
return (LoginAction) context.getBean("loginAction");
}
}
스코프 프로토타입은 인스턴스에 대해 spring(getBean 또는 의존관계 주입)을 요청할 때마다 새 인스턴스가 생성되어 참조가 제공됨을 의미합니다.
이 예에서는 LoginAction의 새로운 인스턴스가 생성되어 HomeController에 주입됩니다.LoginAction을 주입하는 다른 컨트롤러가 있는 경우 다른 인스턴스가 생성됩니다.
각 콜에 대해 다른 인스턴스를 필요로 하는 경우(getBean을 매번 호출해야 합니다), 싱글톤빈에 주입해도 이러한 인스턴스는 실현되지 않습니다.
Spring 2.5 이후로는 매우 쉬운(그리고 우아한) 방법이 있습니다.
그냥 파라메스를 바꾸면 돼proxyMode
그리고.value
의@Scope
주석입니다.
이 트릭을 사용하면 추가 코드를 작성하거나 싱글톤빈 내부에 프로토타입이 필요할 때마다 ApplicationContext를 삽입하지 않아도 됩니다.
예:
@Service
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class LoginAction {}
상기의 설정에서는LoginAction
(비활성화)HomeController
)는 컨트롤러가 싱글톤인 경우에도 항상 프로토타입입니다.
컨트롤러에 주입된 콩이 시제품 범위라고 해서 컨트롤러가 시제품 범위인 것은 아닙니다.
@controller는 싱글톤 오브젝트이며, 싱글톤클래스에 프로토타입 빈을 삽입하면 실제로 발신하는 모든 콜에 대해 새로운 프로토타입 빈 인스턴스를 생성하는 룩업 스위칭 속성을 사용하지 않는 한 프로토타입 빈도 싱글톤으로 됩니다.
니콜라스가 말한 것처럼.스프링 콘텍스트를 주입하는 것은 좋은 생각이 아닙니다.이 경우 @Scope("request")로 해결하면 됩니다.단, 예를 들어 몇 가지 인스턴스가 필요하다고 가정해 보겠습니다.LoginAction
컨트롤러 메서드로 설정합니다.이 경우 공급업체의 핵심(스프링 4 솔루션)을 작성할 것을 권장합니다.
@Bean
public Supplier<LoginAction> loginActionSupplier(LoginAction loginAction){
return () -> loginAction;
}
그런 다음 컨트롤러에 주입합니다.
@Controller
public class HomeController {
@Autowired
private Supplier<LoginAction> loginActionSupplier;
사용.ApplicationContextAware
당신을 봄과 연결시키고 있습니다(그것은 문제가 될 수도 있고 아닐 수도 있습니다.합격할 것을 권합니다.LoginActionFactory
를 할 수 .LoginAction
필요할 때마다.
범위 사용@Scope("request")
하다, "bean"을 취득하다@Scope("session")
싱글톤 콩 안에 주입된 프로토이페 콩은 get bean을 통해 새로운 인스턴스를 만들라고 완전히 요청될 때까지 싱글톤처럼 행동할 것이다.
context.getBean("Your Bean")
기본적으로는 봄콩은 싱글톤입니다.이 문제는 다른 범위의 콩을 배선하려고 할 때 발생합니다.예를 들어 콩의 원형을 싱글톤으로 만들 수 있습니다.이것은 스코프 콩 주입 문제로 알려져 있습니다.
이 문제를 해결하는 또 다른 방법은 @Lookup 주석을 사용한 메서드 주입입니다.
여기 여러 솔루션이 포함된 싱글톤 인스턴스에 시제품 콩을 주입하는 문제에 대한 좋은 기사가 있습니다.
https://www.baeldung.com/spring-inject-prototype-bean-into-singleton
의 @Configuration
@Bean
@RequestScope //composed annotation for @Scope(value=...proxyMode=...)
public LoginAction requestScopedBean() {
return new LoginAction ();
}
@Controller
public class HomeController {
@Resource(name = "requestScopedBean")
private LoginAction loginAction;
//...your code here
@컴포넌트
@Scope(값="프로토타입")
퍼블릭 클래스 테니스 코치는 코치 {}를 구현합니다.
// 일부 코드
}
에는 ""도 합니다.@Scope("prototype")
되어 있다
다음과 같습니다.
@Controller
@Scope("prototype")
public class HomeController {
.....
.....
.....
}
언급URL : https://stackoverflow.com/questions/7621920/scopeprototype-bean-scope-not-creating-new-bean
'source' 카테고리의 다른 글
Google이 JSON 응답 앞에 (1)을 추가하는 이유는 무엇입니까? (0) | 2023.03.15 |
---|---|
get_module은 플러그인에서 "구체 분류법"을 제공합니다. (0) | 2023.03.15 |
PyMongo를 사용하여 regex 쿼리 수행 (0) | 2023.03.15 |
현재 날짜가 두 날짜 사이의 Oracle SQL인지 확인합니다. (0) | 2023.03.15 |
Angular.js에서 AJAX 콜을 발신하기 위한 베스트 프랙티스는 무엇입니까? (0) | 2023.03.15 |