рдкреЗрд╢ рд╣реИ рдПрдУрдкреА

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди


рдЖрдИрдЯреА рд╡рд┐рдХрд╛рд╕ рдХреА рдЖрдзреБрдирд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд▓реЗрдЦрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ, рдЬрдмрдХрд┐ рдХрд┐рд╕реА рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд▓реЗрдЦрди рд╢реИрд▓реА рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдорд╛рди рдХреА рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЦреНрдп рдХрд╛рд░рдХ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдореВрд▓ рдЗрдХрд╛рдИ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ:

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рдорд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ: рдПрдХ рд╣реА рдкреАрдПрдЪрдкреА рдореЗрдВ, рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреЛрдиреЛрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдпреБрд╡рд╛, рд▓реЗрдХрд┐рди рдЕрддреНрдпрдВрдд, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЙрдкрдпреЛрдЧреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди - рдкрд╣рд▓реВ-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред



рдПрдУрдкреА рдореВрд▓ рдмрд╛рддреЗрдВ


рд╡реИрдХреНрдпреВрдо рдореЗрдВ рдХреБрдЫ рдЧреЛрд▓рд╛рдХрд╛рд░ рд╕реЗрд╡рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛) рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ:
public BookDTO getBook(Integer bookId) {
BookDTO book = bookDAO.readBook(bookId);
return book;
}

рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдХрд┐рд╕реА рдкреБрд╕реНрддрдХ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЙрд╕рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдирд╛ред рд▓реЗрдХрд┐рди рдЖрдЗрдП рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрдореА рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдореЗрдВ рдЖрдк рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
public BookDTO getBook(Integer bookId) {
LOG.debug( "Call method getBook with id " + bookId);

BookDTO book = bookDAO.readBook(bookId);

LOG.debug( "Book info is: " + book.toString());
return book;
}

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд░рддреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реБрдП, рд╕реЗрд╡рд╛ рдкрд░рдд рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдкрд╡рд╛рдж рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП):
public BookDTO getBook(Integer bookId) throws ServiceException {
LOG.debug( "Call method getBook with id " + bookId);
BookDTO book = null ;

try {
book = bookDAO.readBook(bookId);
} catch(SQLException e) {
throw new ServiceException(e);
}


LOG.debug( "Book info is: " + book.toString());
return book;
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
public BookDTO getBook(Integer bookId) throws ServiceException, AuthException {
if (!SecurityContext.getUser().hasRight("GetBook"))
throw new AuthException("Permission Denied");


LOG.debug( "Call method getBook with id " + bookId);
BookDTO book = null ;

try {
book = bookDAO.readBook(bookId);
} catch (SQLException e) {
throw new ServiceException(e);
}

LOG.debug( "Book info is: " + book.toString());
return book;
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:
public BookDTO getBook(Integer bookId) throws ServiceException, AuthException {
if (!SecurityContext.getUser().hasRight( "GetBook" ))
throw new AuthException( "Permission Denied" );

LOG.debug( "Call method getBook with id " + bookId);
BookDTO book = null ;
String cacheKey = "getBook:" + bookId;

try {
if (cache.contains(cacheKey)) {
book = (BookDTO) cache.get(cacheKey);
} else {

book = bookDAO.readBook(bookId);
cache.put(cacheKey, book);
}

} catch (SQLException e) {
throw new ServiceException(e);
}

LOG.debug( "Book info is: " + book.toString());
return book;
}

рдЖрдк рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╕реБрдзрд╛рд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╣рдорд╛рд░реЗ рд╕реБрдзрд╛рд░ рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рдореВрд▓ рдЖрдХрд╛рд░ рд╕реЗ 10 рдЧреБрдирд╛ (2 рд╕реЗ 20 LOC рддрдХ) рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рдХрд╛ рдЖрдпрддрди рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ - рдпрд╣ рдЕрднреА рднреА рд╡рд╣реА 1 рдкрдВрдХреНрддрд┐ рд╣реИред рдХреЛрдб рдХреЗ рдмрд╛рдХреА рдЖрд╡реЗрджрди рдХреА рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рд▓реЙрдЧрд┐рдВрдЧ, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг, рдХреИрд╢рд┐рдВрдЧ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реЗрд╡рд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рдЗрдВрдЯрд░рд▓рд╛рдХрд┐рдВрдЧ рдХрд░рдирд╛ рдЗрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рдЫреЛрдЯрд╛ рди рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЙрддрдиреА рд╣реА рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдордЧреНрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реАрд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рддреЗ рд╣реБрдП, рдкрд╣рд▓реЗ рд╣рдо рдлрд╝рдВрдХреНрд╢рди, рдлрд┐рд░ рдореЙрдбреНрдпреВрд▓, рдлрд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рддрд┐рдорд╛рди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ "рдкрд╛рд╕-рдереНрд░реВ" рдпрд╛ "рдмрд┐рдЦрд░рд╛ рд╣реБрдЖ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдмрд┐рдЦрд░реЗ рд╣реБрдП рд╣реИрдВред рдХреНрд░реЙрд╕-рдХрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рджреЗрдЦрд╛, рд╡реЗ рд╣реИрдВ:

рдкрд╣рд▓реВ-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдПрдУрдкреА) рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдЕрдВрдд-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдВрд╢реЛрдзрди рд╣реИ, рдЗрд╕рдХрд╛ рдЖрд╡рдВрдЯрди рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╣реИ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AOP рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдПрдВ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреВрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ:


рдХреЗрд╕ рд╕реНрдЯрдбреА (AspectJ)


рдкрд╣рд▓реВ рднрд╛рд╖рд╛ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рд▓реВ рдЙрдиреНрдореБрдЦ рд╡рд┐рд╕реНрддрд╛рд░ / рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдПрдУрдкреА рдЗрдВрдЬрди рд╣реИред

рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдкрд╣рд▓реВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
@Aspect
public class WebServiceLogger {
private final static Logger LOG =
Logger.getLogger(WebServiceLogger. class );

@Pointcut( "execution(* example.WebService.*(..))" )
public void webServiceMethod() { }

@Pointcut( "@annotation(example.Loggable)" )
public void loggableMethod() { }

@Around( "webServiceMethod() && loggableMethod()" )
public Object logWebServiceCall(ProceedingJoinPoint thisJoinPoint) {
String methodName = thisJoinPoint.getSignature().getName();
Object[] methodArgs = thisJoinPoint.getArgs();

LOG.debug( "Call method " + methodName + " with args " + methodArgs);

Object result = thisJoinPoint.proceed();

LOG.debug( "Method " + methodName + " returns " + result);

return result;
}
}

рдкрд╣рд▓рд╛ рдХрджрдо рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдПрдХ рдкрд╣рд▓реВ рдмрдирд╛рдирд╛ рд╣реИ - рд╡реЗрдмрд╕рд░реНрд╡рд░ рд▓реЛрдЬрд░ рд╡рд░реНрдЧ, рдЬреЛ рдХрд┐ рдРрд╕реНрдкреЗрдХреНрдЯ рдЕрдирд╛рдЙрдВрд╕рдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред рдЕрдЧрд▓рд╛, рдЬрдВрдХреНрд╢рди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рджреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: webServiceMethod (WebService рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓) рдФрд░ loggableMethod (@Loggable рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓)ред рдЕрдВрдд рдореЗрдВ, рдПрдХ рдЯрд┐рдк рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ (logWebServiceCall рдкрджреНрдзрддрд┐), рдЬрд┐рд╕реЗ ( рд▓рдЧрднрдЧ рдПрдиреЛрдЯреЗрд╢рди) рдХрдиреЗрдХреНрд╢рди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрдЬрд╛рдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ ("webServiceMethod () && loggableMethod ()"))ред

рдкрд░рд┐рд╖рдж рдХреЛрдб рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рд╡рд┐рдзрд┐ (рдХрдиреЗрдХреНрд╢рди рдмрд┐рдВрджреБ), рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ, рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд╕реАрдзреЗ рдХреЙрд▓рд┐рдВрдЧ, рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред

AspectJ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рдорд░реНрдерд┐рдд рд╕реНрд▓рд╛рдЗрд╕ рдХреА рдХрд╛рдлреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрдЦреНрдп рд╣реИрдВ:

рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ:

рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧ [ 1 , 2 ] рдореЗрдВ AspectJ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

AspectJ рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ AJC рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЦреНрдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд╕рд┐рд▓рдирд╛ рд╣реЛрдЧрд╛ ред

рдЙрддреНрдкрд╛рдж рдореБрдлреНрдд рд╣реИред рдЧреНрд░рд╣рдг рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред



рдХреЗрд╕ рд╕реНрдЯрдбреА (рдкреЛрд╕реНрдЯрд╢реЗрдпрд░)


PostSharp .NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рд▓реВ-рдЙрдиреНрдореБрдЦ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред .NET рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп AOP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐, PostSharp рд╕рд╛рдЗрдЯ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдХреЗ, рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдкреНрд░рдореБрдЦ рд╕реНрдерд╛рди рд░рдЦрддрд╛ рд╣реИред

рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдкрд╣рд▓реВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рдХрджрдо рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкрд╣рд▓реВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

public class ExceptionDialogAttribute : OnExceptionAspect
{
public override void OnException(MethodExecutionEventArgs eventArgs)
{
string message = eventArgs.Exception.Message;
Window window = Window.GetWindow((DependencyObject)eventArgs.Instance);
MessageBox.Show(window, message, "Exception" );
eventArgs.FlowBehavior = FlowBehavior.Continue;
}
}


рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдкреЛрд╕реНрдЯрд╢рд╛рд░реНрдк рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдкрд╣рд▓реВ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдУрдкреА рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдПрдХ рдкрд╣рд▓реВ рдФрд░ рд╕рд▓рд╛рд╣ред

рдЗрд╕ рдкрд╣рд▓реВ рдХреЗ рд▓рд┐рдП рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ (AssemblyInfo.cs):

[assembly: ExceptionDialog ( AttributeTargetTypes= "Example.WorkflowService.*" ,
AttributeTargetMemberAttributes = AttributeTargetElements.Public )]


рдпрд╛, ExceptionDialog рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрдХреА рд░реБрдЪрд┐ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ:

[ExceptionDialog]
public BookDTO GetBook(Integer bookId)


рдпрд╣ рд╕рдм рд╣реИ: рдЕрдм рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдмрдирд╛рдП рдЧрдП рдкрд╣рд▓реВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ PostSharp рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд▓рд╛рд╣ рдФрд░ рдкрд╣рд▓реВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рдХрд╛рдлреА рдХрдо рд╣реИред рд╡рд┐рд╡рд░рдг рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрдЦреНрдп рд╣реИрдВ:

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PostSharp рдХреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд┐рд▓рд╛рдИ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдмрд╛рдпреЛрдЯреЗрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдЙрддреНрдкрд╛рдж рдХрд╛ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред



рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдЕрднреНрдпрд╛рд╕ рддрдХ


рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ "рдмреНрд░реИрдХреЗрдЯреНрд╕ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрдиреЗ" рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд┐рддрдиреА рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдФрд░ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдм рдПрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИред рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ :)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдФрд░ рдкрд╣рд▓реБрдУрдВ рдХреА "рдмреБрдирд╛рдИ" рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ: рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдкрд╣рд▓реВ-рдорд╛рд╡реЗрди-рдкреНрд▓рдЧ-рдЗрди рдкреНрд▓рдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛), рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред (рдПрдХ рд╣реА рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рдВрдХрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рддрд░рдг рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдХреНрд╕рд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдбрд░рд╛рддрд╛ рд╣реИред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ [ 1 , 2 ] рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрди рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╣рдо рдЗрд╕рдХреЗ рдПрдУрдкреА рдШрдЯрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░реЙрдХреНрд╕реА рдкрд╛рд░реНрдЯреА (JDK рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреНрд░реЙрдХреНрд╕реА, CGLIB) рдмрдирд╛рдХрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ (C #) рдореЗрдВ AOP рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдУрдкреА рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ "рд╡рд┐рдзрд┐ рдирд┐рд╖реНрдкрд╛рджрди" рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдмрд┐рдВрджреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ @AspectJ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдПрдХреАрдХрд░рдг рд╕реАрдзреЗ рдПрд╕реНрдкреЗрдХреНрдЯрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ AOP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдЕрдиреНрдп рдпреЛрдЧреНрдпрддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ AOP рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдордВрдЪ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд▓реЛрдХрдкреНрд░рд┐рдпрдХрд░рдг рдФрд░ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИред



рд╕рд╛рд░рд╛рдВрд╢


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ AOP рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреАрди рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:


рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ


Source: https://habr.com/ru/post/In114649/


All Articles