source

@Scope("protype") bean 스코프가 새로운 bean을 생성하지 않음

nicesource 2023. 3. 15. 19:44
반응형

@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

반응형