私はこの簡単な例を書きました:
//file TestController.java
public interface TestController {
public List<Test> findAll();
}
//file TestControllerImp.java
@Controller
public class TestControllerImp implements TestController{
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory=sessionFactory;
}
public List<Test> findAll() {
return sessionFactory.getCurrentSession().createQuery("from Test").list();
}
}
//file TestService.java
@Service
public class TestService {
@Autowired
private TestController controller;
public boolean flag=true;
public void setController(TestController controller){
this.controller=controller;
}
@Transactional
public List<Test> useController(){
flag=false;
return controller.findAll();
}
}
そして、これは私の試みです:
TestService s1=context.getBean(TestService.class);
TestService s2=context.getBean(TestService.class);
List<Test> list=s1.useController();
System.out.println(s1.flag+" "+s2.flag);
今、奇妙な振る舞い(私は春に非常に新しいです):
@Transactional
メソッド「useController()」を宣言すると、出力は次のようになります。true true@Transactional
からTestService
に移動しTestControllerImp
、「findAll()」をで宣言すると@Transactional
、出力はfalsefalseになります。
なぜ私はこの振る舞いをするのですか?デフォルトでクラスがシングルトーンであることは知っています@Autowired
が、最初のケースでフラグがまだ真のままであるのはなぜですか?
皆さんありがとう。