Не согласен с тем, что Spring разрывает инкапсуляцию. Даже если у вас есть pojo, где вы получаете и выставляете на показ в классе, и третья сторона использует ваш jar, все же есть вероятность, что потребитель jar сделает то же самое, что возможно с конфигурацией bean-компонента Spring. (верно для любого другого языка ООП)
Spring просто предоставляет способ, который может быть реализован через код, и этот элемент управления перемещен из кода (IOC).
Потребитель (учтите, что другой программист использует вашу библиотеку), создает bean-компонент с помощью весенней конфигурации, но ваш код все еще имеет контроль. Никакое тело не мешает вам проверять ввод, данный пользователем (Spring IOC Framework также проходит через тот же код, который выполняется другим классом, вызывающим ваш установщик) в установщике.
public void setAge(int age) {
if ( age < 0 ) {
throw new AppException("invalid age!");
}
this.age=age;
}