Как использовать AspectJ для условной регистрации различных данных?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать AspectJ для условной регистрации различных данных?

Сообщение Anonymous »

Я новичок в AspectJ и АОП в целом. Я знаю, что AspectJ имеет множество аннотаций (After, AfterReturning и т. д.) для выполнения кода до вызова метода, после его вызова, после его возврата, при возникновении исключения и т. д.
Я хотел бы использовать его для ведения журналов, довольно типичный вариант использования. Я просмотрел эту статью и думаю, что это большая часть того, что мне нужно. Для ведения журнала он использует AspectJ, а также «аспекты jcambi».

Но я хотел бы сделать что-то вроде следующего:

Код: Выделить всё

public void login(User user) {
String userType = user.getType();

if (!user.isActive()) {
// point cut 1 -- log inactive user
} else if (!user.isPasswordValid()) {
// point cut 2 -- log wrong password
} else {
// point cut 3 -- log successful login
}
}
У нас есть установленный формат журнала. Что-то вроде:
Все типы актеров, действия и коды ошибок содержатся в перечислениях.

Есть ли способ скажите AspectJ:

регистрируйтесь в 'ifs' и
регистрируйте различную информацию, в зависимости от того, что произошло? например, в точечном вырезе 1 запишите одно из следующего:

Код: Выделить всё

admin|login|001|Admin user inactive
user|login|001|Normal user inactive
... и в точечном вырезе 2 запишите одно из следующего:

Код: Выделить всё

admin|login|002|Invalid Admin password
user|login|002|Invalid normal user password
... и в точке вырезания 3 запишите одно из следующего:

Код: Выделить всё

admin|login|000|Successful Admin login
user|login|000|Successful Normal user login
Что-то мне подсказывает, что это невозможно. Или, по крайней мере, непросто. Но я не уверен, стоит ли вообще пытаться. Так что я разрываюсь. С одной стороны, я хотел бы «очистить» свой код всех журналов. С другой стороны, я не уверен, что реализация этого потребует слишком много усилий.

Есть идеи?

*************************************** РЕДАКТИРОВАТЬ ***** **********************************

Спасибо. вам обоим за ответы! Теперь я понимаю две вещи: 1. У меня впереди много работы. И 2. Я думаю, что придал слишком много внимания примеру «входа в систему».

Вход в систему — это всего лишь один крошечный вариант использования. Моя задача — добавить логирование везде... в кучу методов во многих-многих классах. Практически везде я вижу LOG.debug() или LOG.info(), в любом месте приложения, чтобы заменить его ведением журнала аспектов. Это также означает, что, как бы мне ни хотелось, я не могу просто провести рефакторинг всего кода, чтобы облегчить себе жизнь. Я бы хотел сделать вход в систему с использованием исключений, но это выходит за рамки моей задачи: добавить логирование.

И, конечно, в каждом методе бизнес-логика будет разной, и, как таковое, будет происходить и ведение журнала. Итак, у меня возникает вопрос: как лучше всего это сделать? Я имею в виду, что каждый метод будет иметь свою собственную логику, свои if... и будет условно регистрировать разные вещи. Так стоит ли мне создать аспектный класс для каждого из этих вариантов использования и, по сути, иметь там одни и те же «если»?

Пример (это не вход в систему !): метод, импортирующий данные.

Код: Выделить всё

public void import(String type) {
if (type.equals("people")) {
try {
int result = importPeople();
if (result > 0) {
// do some stuff
LOG.info("ok");
} else {
// do some stuff
LOG.info("problem");
}
} catch (Exception e) {
// do some stuff
LOG.debug("exception ...");
}
} else if (type.equals("places")) {
try {
int result = importPlaces();
if (result > 0) {
// do some stuff
LOG.info("ok");
} else {
// do some stuff
LOG.info("problem");
}
} catch (Exception e) {
// do some stuff
LOG.debug("exception ...");
}
}
}
Имейте в виду, это дрянной пример с повторяющимся кодом и т. д. Но суть вы поняли. Должен ли я также создать аспект «импорта» для регистрации этого метода... со всеми сопутствующими «если» для регистрации «ок», «проблема», «исключение»? И делать это для каждого варианта использования?

Я за то, чтобы избавиться от навязчивого кода ведения журналов, но... это похоже на что-то вроде запах кода, который должен иметь логику с ее «если» и т. д. как в исходном методе (потому что метод «делает больше вещей», чем протоколирование), так и в соответствующем аспекте...

В любом случае, вы оба ответили на мой первоначальный вопрос... но у меня может быть только один ответ, поэтому я приму ответ Кригаекса, потому что он кажется, в это вложено много труда!

Подробнее здесь: https://stackoverflow.com/questions/395 ... ditionally
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»