2012-06-25 2 views
4

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

@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); 
    } 
} 

ответ

11

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

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

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

+0

спасибо (еще раз), чтобы сделать их чистыми без гражданства, я мог бы использовать локальные методы метода dao и т. Д., Но это было бы намного медленнее и ресурс тяжелым, поскольку новый новый объект будет создан для каждого запроса/потока и, следовательно, плохо как я знаю, они не изменятся? – NimChimpsky

+0

@NimChimpsky: в этом случае нет смысла использовать локальные переменные (и как вы их получите из контекста)? –

+0

Я ошибочно думал, что они будут введены во время выполнения, но вы не можете комментировать их в методах. – NimChimpsky

Смежные вопросы