потокобезопасный дизайн без сохранения состояния с использованием Spring

Я предположил, что если переменные экземпляра управляются Spring IOC и являются синглтонами, дизайн можно назвать безстоятельным и потокобезопасным. Следовательно, этот тип дизайна можно масштабировать до кластерных серверов. Прав ли я в своих предположениях, изложенных ниже?

@Repository("myDao")
public class MyDao implements Dao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Value("${sqlFoo}")
    private String foo;

    @Override
    public Integer getMyInt(String str) {
      return jdbcTemplate.queryForInt(foo, str);
    }

который затем вводится в:

@Service("myService")
public class MyServiceImpl {

    @Resource(name = "myDao")
    Dao dao;

    @Override
    @Transactional(readOnly = true)
    public int getScore(String str) {
      return dao.getMyInt(str);
    }
}

person NimChimpsky    schedule 25.06.2012    source источник


Ответы (1)


Спринг-бины не являются апатридами, потому что у них есть состояние (поля). Технически они даже не являются неизменяемыми, потому что вы можете изменить вставленные поля в любое время.

Однако вы можете легко сделать bean-компоненты Spring неизменяемыми, используя поля final и внедрение конструктора. Также такое состояние не является проблематичным с точки зрения масштабируемости. Если ваши bean-компоненты содержат изменяемые значения, которые меняются со временем, это является серьезной проблемой при кластеризации. Но в службах Spring обычно содержатся только зависимости, внедряемые во время начальной загрузки. Таким образом, они фактически не имеют гражданства и неизменны.

Неважно, на скольких серверах вы запускаете одно и то же приложение Spring — сами bean-компоненты и зависимости в безопасности. Но если ваши Spring bean-компоненты содержат счетчики, кэши, изменяемые карты и т. д., вам нужно подумать о них.

person Tomasz Nurkiewicz    schedule 25.06.2012
comment
спасибо (еще раз), чтобы сделать их чистыми без гражданства, я мог бы использовать локальные экземпляры метода dao и т. д., но поэтому это было бы намного медленнее и ресурсоемче, поскольку новый объект будет создаваться для каждого запроса/потока, и, таким образом, не рекомендуется, поскольку я знаете, они не изменятся? - person NimChimpsky; 25.06.2012
comment
@NimChimpsky: в этом случае нет смысла использовать локальные переменные (и как их получить из контекста)? - person Tomasz Nurkiewicz; 25.06.2012
comment
Я ошибочно думал, что они будут введены во время выполнения, но вы не можете аннотировать методы. - person NimChimpsky; 25.06.2012
comment
Означает ли это, что при разработке контроллера, который используется для обработки отправки формы, вы должны беспокоиться о контроллере и сервисе, который внедряется с помощью аннотации Autowired? - person Daniel Newtown; 16.09.2015