Я довольно новичок в AspectJ и AOP в целом. Я знаю, что у AspectJ есть много аннотаций (After, AfterReturning и т. Д.) Для выполнения кода перед вызовом метода после его вызова после его возврата, когда возникает исключение и т. Д.Как использовать AspectJ для регистрации разных данных, условно?
Я бы хотел использовать это для ведения журнала, довольно типичный вариант использования. Я смотрел эту статью, и я думаю, что это большая часть того, что мне нужно. Он использует 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
}
}
У нас есть установленный формат журнала. Что-то вроде:
<actor>|<action_code>|<error_code>|<extra_info>
Все типы действующих лиц, действия и коды ошибок содержатся в перечислениях.
Есть ли способ сказать AspectJ к:
войти в «если» и журнал отличается информация, в зависимости от того, что случилось? например, в точке вырезать 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
... и в точке-вырезать журнал одно из следующего:
admin|login|000|Successful Admin login
user|login|000|Successful Normal user login
Что-то подсказывает мне, что это невозможно. Или, по крайней мере, нелегко. Но я не уверен, что это даже стоит попробовать. Поэтому я порван. С одной стороны, я хотел бы «дезинформировать» мой код всех протоколов. С другой стороны, я не уверен, что это будет слишком много, чтобы реализовать это.
Любые идеи?
*************************************** EDIT ****** *********************************
Благодарим вас обоих за ответы! Теперь я понимаю две вещи: 1. У меня впереди много работы. И 2. Думаю, я уделяю слишком много внимания примеру «входа».
Войти только один крошечный прецедент. Моя задача - добавить журнал всюду ... в кучу методов во многих, многих классах. В основном везде я вижу LOG.debug() или LOG.info() в любом месте приложения, чтобы заменить его регистрацией Aspect. Это также означает, что, насколько я бы хотел, я не могу просто реорганизовать весь код, чтобы облегчить мою жизнь. Я хотел бы использовать Исключения для входа в систему, но это выходит за рамки моей задачи: добавьте протоколирование.
И, конечно, в каждом методе бизнес-логика будет отличаться, и как таковой, так будет вести журнал. Поэтому мой вопрос: какова наилучшая практика? Я имею в виду, что каждый метод будет иметь свою собственную логику, ее ifs ... и будет регистрировать разные вещи условно. Итак, я продолжу и создаю класс аспект для каждого из этих вариантов использования и в основном имею то же самое «ifs» там?
Пример (это не логин!): Метод, который импортирует данные.
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 ...");
}
}
}
Помните, что это пример дерьма, с повторяющимся кодом и т. Д. Но вы получаете идею. Должен ли я также создать аспект «импорта» для регистрации этого метода ... со всеми сопровождающими «ifs» для регистрации «ok», «problem», «exception»? И сделать это для каждый прецедент?
Я все для того, чтобы избавиться от интрузивного кода регистрации, но ... похоже, что что-то вроде запаха кода, чтобы иметь логику с ее «ifs» и т. Д., Как в оригинальном методе (потому что метод «делать больше материала», чем в каротаже), а также в соответствующем аспекте ...
В любом случае, вы оба ответили на мой первоначальный вопрос ... но я могу только иметь 1 ответ, поэтому я Я собираюсь принять kriegaex, потому что он, кажется, положил лот работы в него!
Извините, забыли добавить ссылку на статью: http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html –