ããã°ã©ãã³ã°ãã©ãã€ã
ITéçºã®çŸä»£äžçã§ã¯ãããã°ã©ã ãäœæããããã®éåžžã«å€ãã®ç°ãªãã¢ãããŒãããããŸãã ãã®ãããããšãã°ã誰ããããã°ã©ã ãäžé£ã®ã¢ã¯ã·ã§ã³ã®åœ¢åŒã§æ瀺ããã®ã奜ãäžæ¹ã§ã誰ããããã°ã©ã ã¯äºãã«éä¿¡ãããªããžã§ã¯ãã®ã»ããã§ãããšèããŠããŸãã ãããã®ã¢ã€ãã¢ãšæŠå¿µã®çµã¿åããã¯ãããã°ã©ã ã®äžçš®ã®å·çã¹ã¿ã€ã«ã圢æããŸã ãããã¯äžè¬ã«ããã°ã©ãã³ã°ãã©ãã€ã ãšåŒã°ããŸã ã
åãã©ãã€ã ã«ã¯ç¬èªã®ç¹æ§ããããŸãããããããåºå¥ããäž»ãªèŠå ã¯ãããã°ã©ã ã®åºæ¬åäœã®æŠå¿µã§ãã æã人æ°ã®ãããã®ã¯æ¬¡ã®ãšããã§ãã
- åœä»€ïŒåœä»€åããã°ã©ãã³ã°ãFORTRAN / C / PHPïŒã
- é¢æ°ïŒé¢æ°åããã°ã©ãã³ã°ãHaskell / Lisp / FïŒ/ ScalaïŒã
- ãããã¿ã€ãïŒãããã¿ã€ãããã°ã©ãã³ã°ãJavaScriptïŒã
- ãªããžã§ã¯ãïŒãªããžã§ã¯ãæåããã°ã©ãã³ã°ãC ++ /ãžã£ã¯ïŒã
- äºå®ïŒè«çããã°ã©ãã³ã°ãPROLOGïŒã
äžè¬çãªå Žåãããã°ã©ãã³ã°èšèªã¯äœ¿çšããããã©ãã€ã ãäžæã«æ±ºå®ããªãããšã«æ³šæããŠãã ãããåãPHPã§ãåœä»€åããã°ã©ã ãšãªããžã§ã¯ãæåããã°ã©ã ã®äž¡æ¹ãäœæã§ããŸãã
ãã®èšäºã§ã¯ãæ¯èŒçè¥ãããéåžžã«æçšãªããã°ã©ãã³ã°ãã©ãã€ã ã§ããã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ã«ã€ããŠèª¬æããŸãã
AOPã®åºæ¬
次ã®ã¡ãœãããå®è£ ããç空å ã®çç¶ã®ãµãŒãã¹ïŒWebãµãŒãã¹ãªã©ïŒãæ€èšããŠãã ããã
public BookDTO getBook(Integer bookId) {
BookDTO book = bookDAO.readBook(bookId);
return book;
}
ãã®æ¹æ³ã¯éåžžã«ã·ã³ãã«ã§æçœã§ããæ¬ã®æ å ±ãæ¬ã®èå¥åã§èªãããšã§ãã ããããããã§äœãæ¬ ããŠããã®ãèããŠã¿ãŸãããã ãŸãããã®ã³ã°ã«ã€ããŠèããå¿ èŠããããŸãããã®ã³ã°ããªããšããåãã®ãšãããWebãµãŒãã¹ã§ã¯ã©ãã«ãè¡ããŸããã
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ïŒã®äž»ãªç®çã¯ããšã³ãããŒãšã³ãæ©èœã®ã¢ãžã¥ãŒã«åãã¢ã¹ãã¯ããžã®å²ãåœãŠã§ãã ãããè¡ãããã«ãAOPã®æŠå¿µããµããŒãããèšèªã¯ã次ã®ããŒã«ãå®è£ ããŠããšã³ãããŒãšã³ãã®æ©èœã匷調ããŠããŸãã
- ã¢ã¹ãã¯ã-ãšã³ãããŒãšã³ãæ©èœãå®è£ ããã¢ãžã¥ãŒã«ãŸãã¯ã¯ã©ã¹ã ã¢ã¹ãã¯ãã¯ãã¹ã©ã€ã¹ã«ãã£ãŠå®çŸ©ãããçµåãã€ã³ãã«ã¢ããã€ã¹ãé©çšããããšã«ãããæ®ãã®ã³ãŒãã®åäœãå€æŽããŸãã ã¢ã¹ãã¯ãã䜿çšããŠæ©èœãå®è£ ããããšãã§ããŸãã
- ã¢ããã€ã¹-è¿œå ããžãã¯-æ¥ç¶ãã€ã³ãããåŒã³åºãå¿ èŠã®ããã³ãŒãã ãã³ãã¯ãçµåãã€ã³ãã®åãåŸããŸãã¯ä»£ããã«å®è¡ã§ããŸãã
- çµåç¹ïŒçµåç¹ïŒ-ã¢ããã€ã¹ãé©çšããããå®è¡äžã®ããã°ã©ã å ã®ç¹ïŒã¡ãœããåŒã³åºãããªããžã§ã¯ãäœæãå€æ°ã¢ã¯ã»ã¹ïŒã
- ã¹ã©ã€ã¹ïŒãã€ã³ãã«ããïŒ-æ¥ç¶ãã€ã³ãã®ã»ããã ã¹ã©ã€ã¹ã¯ãç¹å®ã®æ¥ç¶ãã€ã³ããç¹å®ã®ãããã«é©åãããã©ããã決å®ããŸãã
- å°å ¥-ã¯ã©ã¹æ§é ã®å€æŽããã³/ãŸãã¯ç¶æ¿éå±€ã®å€æŽã«ãããå€éšã³ãŒããžã®ã¢ã¹ãã¯ãæ©èœã®è¿œå ã
- target-ãã³ããé©çšããããªããžã§ã¯ãã
- ãŠã£ãŒãã³ã°-ãªããžã§ã¯ããé¢é£ããåŽé¢ãšãªã³ã¯ããŸãïŒã³ã³ãã€ã«ãããŒãããŸãã¯ããã°ã©ã å®è¡ã®æ®µéã§ïŒã
䜿çšäŸïŒAspectJã®ïŒ
AspectJã¯ãJavaèšèªã®ã¢ã¹ãã¯ãæåã®æ¡åŒµæ©èœ/ãã¬ãŒã ã¯ãŒã¯ã§ãã çŸæç¹ã§ã¯ãããã¯ããããæã人æ°ãããéçºäžã®AOPãšã³ãžã³ã§ãã
ãã®å©ããåããŠããã®ã³ã°ã®åŽé¢ã®å®è£ ãæ€èšããŠãã ããã
@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;
}
}
æåã®ã¹ãããã¯ããµãŒãã¹ã¡ãœããã®ãã®ã³ã°ã®ã¢ã¹ãã¯ã ãã€ãŸãAspectã¢ãããŒã·ã§ã³ã§ããŒã¯ãããWebServiceLoggerã¯ã©ã¹ãäœæããããšã§ãã 次ã«ãæ¥åç¹ã®2ã€ã®ã¹ã©ã€ã¹ãå®çŸ©ãããŸãïŒwebServiceMethodïŒWebServiceã¯ã©ã¹ã«å±ããã¡ãœãããåŒã³åºãïŒãšloggableMethodïŒ@Loggableã¢ãããŒã·ã§ã³ã§ããŒã¯ãããã¡ãœãããåŒã³åºãïŒã æåŸã«ããã³ãã宣èšããïŒlogWebServiceCallã¡ãœããïŒãã¹ã©ã€ã¹ãæºããæ¥ç¶ãã€ã³ãïŒ Aroundã¢ãããŒã·ã§ã³ïŒã®ä»£ããã«å®è¡ãããŸãïŒ "webServiceMethodïŒïŒ&& loggableMethodïŒïŒ"ïŒã
è©è°äŒã³ãŒãã§ã¯ãçŸåšã®ã¡ãœããïŒæ¥ç¶ãã€ã³ãïŒãã¡ãœããã®éå§ã®ãã°ãèŠæ±ãããã¡ãœããã®çŽæ¥åŒã³åºããäœæ¥ã®çµæã®ãã°ãšè¿éã«é¢ããæ å ±ãåãåããŸãã
AspectJã«ã¯ããµããŒããããŠããæ¥ç¶ãã€ã³ãã®ã¹ã©ã€ã¹ãããªã倧éã«ãããŸãã äž»ãªãã®ã¯æ¬¡ã®ãšããã§ãã
- executionïŒstatic * com.xyz .. *ã*ïŒ..ïŒïŒ-com.xyzããã±ãŒãžå ã®ä»»æã®éçã¡ãœããã®ã³ãŒãã®å®è¡ã
- callïŒvoid MyInterfaceã*ïŒ..ïŒïŒ-MyInterfaceã€ã³ã¿ãŒãã§ãŒã¹ã®voidãè¿ãã¡ãœããã®åŒã³åºãã
- åæåïŒMyClass || MyOtherClassïŒ-MyClassãŸãã¯MyOtherClassã¯ã©ã¹ã®åæåã
- staticinitializationïŒMyClass + &&ïŒMyClassïŒ-MyClassã§ã¯ãªãMyClassã§å§ãŸãååã®ã¯ã©ã¹ã®éçåæåã
- handlerïŒArrayOutOfBoundsExceptionïŒ-äŸå€ãã³ãã©ãŒã®å®è¡ArrayOutOfBoundsException;
- get / setïŒstatic int MyClass.xïŒ-ã¯ã©ã¹MyClassã®ããããã£xã®èªã¿åã/æžã蟌ã¿ã
- this / targetïŒMyClassïŒ-ã¿ã€ãMyClassã®ãªããžã§ã¯ãã«å¯Ÿå¿ããæ¥ç¶ââãã€ã³ãã®å®è¡ã
- argsïŒæŽæ°ïŒ-æŽæ°åã®åŒæ°ãå©çšå¯èœãªæ¥ç¶ãã€ã³ãã®å®è¡ã
- ifïŒthisJoinPoint.getKindïŒïŒãequalsïŒ "call"ïŒïŒ-æå®ãããåŒãçã§ãããã¹ãŠã®æ¥ç¶ãã€ã³ãã«äžèŽããŸãã
- within / withincodeïŒMyClassïŒ-æå®ãããã¯ã©ã¹ã®ã³ãŒãã§èŠã€ãã£ããã¹ãŠã®æ¥ç¶ãã€ã³ãã«äžèŽããŸãã
- cflow / cflowbelowïŒcallïŒvoid MyClass.testïŒïŒïŒïŒ-æå®ãããã¹ã©ã€ã¹ã®å®è¡ã¹ã¬ããã§æ€åºããããã¹ãŠã®æ¥ç¶ãã€ã³ãã«äžèŽããŸãã
- @annotationïŒMyAnnotationïŒ-ã¿ãŒã²ããã@MyAnnotationã¢ãããŒã·ã§ã³ã§ããŒã¯ãããŠããçµåãã€ã³ããå®è¡ããŸãã
ãã³ãã«ã€ããŠã¯ããã®æ°ã¯ã¯ããã«å°ãªãã§ãããå¿ èŠãªå€ãã®ç¶æ³ããã¹ãŠç¶²çŸ ããŠããŸãã
- å - æ¥ç¶ãã€ã³ãã«ããŒãã®ç«ã¡äžãã
- æ»ã£ãåŸ-æ¥ç¶ãã€ã³ãã®éåžžã®å®è¡åŸã«ããŒããèµ·åãã
- ã¹ããŒåŸ-çµåãã€ã³ãã®å®è¡äžã«äŸå€ãã¹ããŒããåŸã«ã¢ããã€ã¹ãéå§ããŸãã
- after-æ¥ç¶ãã€ã³ãã®å®è¡åŸã«ããŒããèµ·åããŸãã
- around-ãžã£ã³ã¯ã·ã§ã³ãå®è¡ãã代ããã«ã«ãŠã³ã·ã«ãèµ·åããŸãïŒãžã£ã³ã¯ã·ã§ã³ã®å®è¡ã¯ãã«ãŠã³ã·ã«å ã§åŒã³åºãããšãã§ããŸãïŒã
AspectJãã¶ã€ã³ã®è©³çŽ°ã«ã€ããŠã¯ã å ¬åŒããã¥ã¡ã³ãã®å¯Ÿå¿ããã»ã¯ã·ã§ã³[ 1ã2 ]ãåç §ããŠãã ããã
AspectJã¢ã¹ãã¯ãã䜿çšããã«ã¯ãç¹å¥ãªAJCã³ã³ãã€ã©ã䜿çšããŠã³ã³ãã€ã«ããã¡ã€ã³ã¯ã©ã¹ã«çž«ãä»ããå¿ èŠããããŸãã
補åã¯ç¡æã§ãã Eclipseã©ã€ã»ã³ã¹ã®äžã§é åžãããŸãã
䜿çšäŸïŒPostSharpïŒ
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;
}
}
å³å¯ã«èšãã°ãPostSharpã®çšèªã®åŽé¢ã¯ãèŠãŠãããããã«ãAOPã®çšèªã®åŽé¢ãšã¢ããã€ã¹ã§ãã
ãã®ã¢ã¹ãã¯ãã®äº€å·®ç¹ã®ã¹ã©ã€ã¹ãæå®ããã«ã¯ãã¢ã»ã³ããªèšå®ãã¡ã€ã«ïŒAssemblyInfo.csïŒã«æ¬¡ã®è¡ãè¿œå ããŸãã
[assembly: ExceptionDialog ( AttributeTargetTypes= "Example.WorkflowService.*" ,
AttributeTargetMemberAttributes = AttributeTargetElements.Public )]
ãŸãã¯ãExceptionDialogå±æ§ã䜿çšããŠãç®çã®ã¡ãœãããæ瀺çã«ããŒã¯ããŸãã
[ExceptionDialog]
public BookDTO GetBook(Integer bookId)
ããã ãã§ãã察å¿ããã¡ãœããã§ã¹ããŒããããã¹ãŠã®äŸå€ã¯ãäœæãããã¢ã¹ãã¯ãã«ãã£ãŠåŠçãããŸãã
PostSharpãã¢ããã€ã¹ãšã¢ã¹ãã¯ãã®æŠå¿µãéšåçã«æ¥çããŠãããšããäºå®ã®ãããåŸè ã«ã¯ããªãã®æ°ããããŸãã 詳现ã¯ããã¥ã¡ã³ãã«èšèŒãããŠããŸã ã äž»ãªãã®ã¯æ¬¡ã®ãšããã§ãã
- OnMethodBoundary / OnMethodInvocation-ã¡ãœããã®åŒã³åºãïŒéå§ãçµäºãçµäºãäŸå€ä»ãã§çµäºïŒ;
- OnFieldAccess-ããããã£ãžã®ã¢ã¯ã»ã¹ã
- onExceptionã - äŸå€åŠçã
- æ§æ-ã³ãŒãã€ã³ãžã§ã¯ã·ã§ã³ã
PostSharpãæ©èœãããã«ã¯ããããžã§ã¯ãã«æ¥ç¶ããå¿ èŠã®ããã³ã³ãã€ã©ãšã©ã€ãã©ãªãå¿ èŠã§ãã ã¹ãããã³ã°ã®åŽé¢ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã«ãäžã«åŸåŠçãã€ãã³ãŒãã«åºã¥ããŠããŸãã
補åã¯æ¯æãããŸãã ã³ãã¥ããã£çããããŸãã
çè«ããå®è·µãž
ããã§ãã¢ããªã±ãŒã·ã§ã³ã®ãšã³ãããŒãšã³ãæ©èœã®ãæ¬åŒ§ããæãåºãããšããåé¡ãã©ãã»ã©çŸããå¹æçã«è§£æ±ºã§ããããèŠãŠããŸããã ãã ããããã¯ãã¹ãŠçè«ã§ãã å®éã«ã¯ããã¡ããããã¹ãŠãå°ãç°ãªããŸã:)
ãŸããã©ã¡ãã®å Žåããã¢ã¹ãã¯ãã®ã³ã³ãã€ã«ãšããŠã£ãŒãã³ã°ãã®ããã«ãç¹å¥ãªã³ã³ãã€ã©ã䜿çšãããããžã§ã¯ããšãšãã«è¿œå ã®ã©ã€ãã©ãªããã©ãã°ããå¿ èŠããããŸãã ããã¯åé¡ã§ã¯ãªãããã§ãïŒã³ã³ãã€ã©ã¯ç°¡åã«ããŠã³ããŒãããŠç°å¢ã«çµ±åã§ããŸãïŒããšãã°ãmavenã䜿çšããå Žåãã¿ã¹ã¯ã¯ã¢ã¹ãã¯ãj-maven-pluginãã©ã°ã€ã³ã®è¿œå ã«åæžãããŸãïŒãå°ãªããšãJavaã¢ããªã±ãŒã·ã§ã³ã§ã¯å€ãã®äŸåé¢ä¿ãäžè¬çã§ãïŒåãMavenã䜿çšããŠè§£æ±ºïŒã ãã ãããããžã§ã¯ãã«åå¥ã®ã³ã³ãã€ã«ãå¿ èŠãªãã®ãå«ããå¿ èŠããããæœåšçãªå©ç¹ã«ãããããããã¹ãŠã®éçºè ãæããããããšããããŸãã
ãã®å ŽåãSpring Framework [ 1ã2 ]ãåé¡ã®è§£æ±ºçã«ãªãå¯èœæ§ããããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯å€ãã®å©ç¹ããããŸããããã®èšäºã®ãã¬ãŒã ã¯ãŒã¯å ã§ã¯ãAOPã³ã³ããŒãã³ãã«é¢å¿ããããŸãã Spring Frameworkã¯ããããã·ãªããžã§ã¯ãïŒJDK Dynamic ProxyãCGLIBïŒãäœæããããšã«ããããµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããã«ãPure JavaïŒCïŒïŒã§å¶éãããAOPæ©èœãå®è£ ããŸãã ã€ãŸããSpring AOPã§ã¯ããã¡ãœããå®è¡ãã¿ã€ãã®çµåãã€ã³ãã®ã¿ã䜿çšã§ããŸãã ãã ããå®è·µã瀺ãããã«ãã»ãšãã©ã®åé¡ã解決ããã«ã¯ãã®ã¿ã€ãã®æ¥ç¶ãã€ã³ããå¿ èŠãªã®ã§ããã®å¶éã¯éèŠãªåœ¹å²ãæãããŸããã
ããã«ãSpring Frameworkã¯ã@ AspectJã¢ãããŒã·ã§ã³ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®æ§æãããã³AspectJã䜿çšããŠçŽæ¥ã³ã³ãã€ã«ãããã¢ã¹ãã¯ãã®çµ±åããµããŒãããŸãã
åœç€Ÿã§ã¯ãSpring AOPã䜿çšããŠããŸãã ç§ã®æèŠã§ã¯ãSpring Frameworkã®ãã®ä»ã®ã¡ãªãããèæ ®ãããšãAOPã䜿çšããã®ã«æãã¢ã¯ã»ã¹ãããã䟿å©ãªãã©ãããã©ãŒã ã§ããããã®æ®åãšéçºã«å€§ããè²¢ç®ããŠããŸãã
ãŸãšã
èŠçŽãããšãAOPã«é¢ãã3ã€ã®äž»ãªèãã匷調ããããšæããŸãã
- AOPã®äž»ãªç®çã¯ããäžè¬çãªãïŒãšã³ãããŒãšã³ãïŒæ©èœããæ¬åŒ§ããå€ããããšïŒãšã³ãããŒãšã³ãæ©èœã®ã¢ãžã¥ãŒã«åïŒãåãé€ãããšã§ãã
- Javaã®å ŽåãAOPã¯AspectJãããžã§ã¯ãããã.NETã®å Žåã¯PostSharpããå ¥æã§ããŸãã
- AOPã®æãåçŽã§å®çžŸã®ããå®è£ ã¯ãSpring AOPã§ãã