私は次のコントローラーとサービスを持っています
@Controller
public class MyController
{
@Autowired
private MyService myService;
@RequestMapping(method=RequestMethod.GET, value="/connect.do")
public String connect(Model model)
{
invokeService();
return "xxx";
}
private void invokeService()
{
myService.test();
}
}
@Service
public class MyService
{
private int value1 = 200;
private int value2 = 333;
private String value3 ;
private String value4 ;
private String value5 ;
....
public void test()
{
System.out.println(value1++);
foo();
}
private void foo()
{
}
}
2つのブラウザーを使用してアプリケーションに接続すると、出力は「200」と「201」になります。これは、Springが異なる接続のために同じMyServiceインスタンスをコントローラーに注入することを意味します。
「test()」と「foo()」の間でvalues1、values2、value3などを共有する必要があるため、アプリケーションにアクセスするために2つの異なる接続を使用する場合、出力は「200」と「200」である必要があります。春にそれを行う方法は?基本的に、Springに異なる接続に対して異なるインスタンスを注入してもらいたいです。Service Beanで@Scope( "prototype")を試しましたが、機能しません。
私はそれを使用して動作させることができます:
@Controller
public class MyController
{
private void invokeService()
{
new MyService.test();
}
}
春にどうやってやるのか気になります。
この質問をする別の方法は次のとおりです。すべての接続に1つのコントローラーインスタンスを提供するのではなく、複数のコントローラーインスタンス(ユーザー接続ごとに1つ)を作成するにはどうすればよいですか。
編集:次のコードと2つのブラウザ接続を使用して、プロトタイプ(出力:200 200 200 200)とシングルトン(出力:200 201 202 203)の違いを確認できます
private void invokeService()
{
myService = applicationContext.getBean( MyService.class );
new MyService.test();
myService = applicationContext.getBean( MyService.class );
new MyService.test();
}
しかし、代わりにpostConstructorに「applicationContext.getBean(MyService.class)」を配置すると、次のようになります。
public class MyController implements ApplicationContextAware {
private SearchService searchService;
@PostConstruct
public void init() {
searchService = applicationContext.getBean( SearchService.class );
}
protected ApplicationContext applicationContext;
@Override
public void setApplicationContext( ApplicationContext applicationContext ) throws BeansException {
this.applicationContext = applicationContext;
}
}
MyServiceで「@Scope(BeanDefinition.SCOPE_PROTOTYPE)」を使用すると、2つのブラウザーを使用してアプリケーションに接続した場合、出力は「200」と「201」のままになります。