는 여기이 클래스 자,이 요청이있을 때 (당신이 기본 범위를 사용하는 경우) 생성 및 사용 단지 빈입니다 JSF의 ManagedBean은,에 의해 사용되는내가 작성한 클래스는 스레드 안전성 측면에서 깨졌습니까? ManagedBeans는 다른 쓰레드에서 사용 되는가?
@Component
public class LoginDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> getUser(final String username, final String password) {
return jdbcTemplate.queryForList("select * from users where username=? and password=?", new Object[]{username, password});
}
}
을 썼다.
@ManagedBean
public class Login implements Serializable {
@ManagedProperty("#{loginDao}")
private LoginDao loginDao;
//..do something with loginDao
}
나는이 완전히 때문에 파괴되는 것을 무서워 무엇을 JSF에 의해 생성 된 로그인 콩 사용 갈 때 만약 그 loginDao의 필드 JdbcTemplate을가 null로 볼 삽입 된 객체이며, loginDao?
웹 서버가 해당 요청을 처리하기 위해 별도의 스레드를 사용하고 LoginDao의 jdbcTemplate 필드가 final이 아니고 이전에 생성자에 설정되어 있기 때문에 Login Bean이 요청을 처리하는 데 사용되면 별도의 스레드에서 실행됩니다 Login bean의 실행은 jdbcTemplate을 Login 인스턴스에서 null로 볼 수 없습니까? 이 문제를 해결하여 jdbcTemplate을 휘발성으로 만드는 방법이 있습니까?
또한, 지금이 날 내가 봄과 JSF와 함께 쓴 모든 의문을 제기한다. 해당 필드에서 volatile 키워드를 사용하지 않으면 @Autowired 주석을 사용할 때 스레드 안전 클래스를 작성할 수 있습니까?지금은 의존성 주입 프레임 워크를 사용하는 것이 정말 걱정됩니다. 컨테이너에 의해 주입 된 객체가 참조 또는 비 최신 상태로 null로 간주되지 않는다는 보장이 있습니까?
모두 범위에 따라 달라집니다 ... – Kukeltje
나는 그들이 없다고 말할 것입니다 ... 빈에 상태가 없습니다 ... 'JdbcTemplate'은 스레드 안전하며 가능한 상태로 간주되지 않습니다. 수정할 수 있습니다. –