Spring beans, вдогонку, или чем думают разработчики
Для начала проясню для несведущих что такое бин а то уже много вопросов задаётся.
Для хранения структурированной информации, не заморачиваясь с индексами массивов, можно использовать два основных варианта: массив хешей и массив бинов. Что такое хеш, думаю понятно
$USER['id']=666;
$USER['name'] = 'Василий';
$USER['lastname'] = 'Пупкинд';
Что такое бин:
User {
private Integer id;
private String name;
private String lastname;
public Integer getId();
public String getName();
public String getLastname();
public void setId(Integer id);
public void setName(String name);
public void setLastname(String lastname);
}
плюсы бина очевидны, самых очевидных как минимум два:
1) программа не выполняет поиск по строке, ей достаточно иметь pointer на getter значения (getter - процедура значение возвращающая)
2) при изменении структуры хранимых данных, мы просто переписываем getter и setter, не меняя в программе ничего более.
Теперь пример.
В Spring есть отличная штука Form Objects. Когда вызывается вебовский POST-метод, мы имеем не абстрактный набор переменных а уже готовый объект (напр. как в примере выше, User), аналогичный объект мы имеем в базе.
представим ситуацию:
- в базе есть полный объект User, с заполненными полями id, name, lastname.
- через форму мы получили так же объект User но с заполненными полями name (мы редактировали имя) и id (собственно кого).
после авторизаций, проверок может ли юзер писать в данный объект и прочей ерунды, у нас стоит совершенно понятная задача:
1) подгрузить объект userFromDB из базы по id = userFromForm.getId()
2) скопировать все поля, которые пришли по форме в объект userFromDB
3) записать объект userFromDB в базу откуда он пришел
пункты 1 и 3. совершенно элементарно выполняются. это всем понятно.
пункт 2....
в данном пункте мы естественно должны скопировать все not null (не пустые) поля одного объекта в поля другого. на рынке существует куча библиотек копирования бинов, включая BeanUtils от Spring и библиотеку с аналогичным названием от Apache.
Вы думаете хоть в одной библиотеке есть функция копирования всех not null полей? хахаха. Мозх разработчиков до такой елементарщины не додумался. Предлагаются варианты индивидуальных копирований с XML-конфигами, интерфейсами и прочей лабуденью. А функция-то простая как двери.
public class AlterBeans {
public static void copy(Object s, Object d, boolean ignoreNull, boolean ignoreMissing) throws
InvocationTargetException, NoSuchMethodException, IllegalAccessException {
Method[] methods = s.getClass().getMethods();
for (Method method : methods) {
String getter = method.getName();
if (getter.startsWith("get") && getter.length() > 3 && !getter.equals("getClass")) {
Object[] data = {method.invoke(s)};
if ((data.length != 0 && data[0] != null) || !ignoreNull) {
String setter = "set" + getter.substring(3, getter.length());
Method methodD;
if (ignoreMissing) {
try {
methodD = d.getClass().getMethod(setter, method.getReturnType());
} catch (NoSuchMethodException e) {
methodD = null;
}
} else {
methodD = d.getClass().getMethod(setter, method.getReturnType());
}
if (methodD != null) {
methodD.invoke(d, data);
}
}
}
}
}
}
мораль такая - не обязательно использовать труЪ way, если его разработчики не являются персонами поклонения популярных религий.
********
Мобильная версия переводчика PROMT 6.0 позволит вам овладевать познаниями в иностранном языке по пути на работу, в общественном транспорте. Купить PROMT Mobile 6.0 в Киеве можно на портале Softlist.com.ua, занимающемся реализацией программного обеспечения.
Недавно ездил на дачу – гляжу, неподалеку начали возводить новый коттеджный поселок. Дома деревянные, симпатичные, украшенные резьбой – неплохо в таком жить, наверное.

Оставить комментарий