Статьи

Весенний АОП

 Давайте определим некоторые хорошо известные проблемы

  • Некоторые задачи программирования не могут быть аккуратно заключены в объекты, но должны быть разбросаны по всему коду
  • Примеры:
    • Ведение журнала (отслеживание поведения программы в файле)
    • Профилирование (определение того, где программа проводит свое время)
    • Трассировка (определение того, какие методы вызываются, когда)
    • Управление транзакциями
    • Управление безопасностью
  • В результате получается перекрестный код — необходимый код « пересекает » множество различных классов и методов.

 Вышеупомянутые проблемы легко решаются с помощью АОП.

 Теперь давайте определим некоторые концепции АОП

  • Аспектно-ориентированное программирование (AOP) обеспечивает упрощенное применение сквозных задач
  • Точка соединения — точка исполнения до цели
    • Как правило, методы
  • Совет — действие, предпринятое в определенной точке соединения.
  • Pointcut — набор точек соединения, указывающих, где следует применять рекомендации (например, регулярное выражение)

 

 Теперь пришло время перейти к Spring AOP

  • Обычно Spring AOP использует следующие методы.
    • Использует динамические прокси, если интерфейс доступен, в противном случае CGLIB
    • CGLIB создает производный класс, который передает запросы
  • Менее способный, чем AspectJ
    • не имеет перехвата поля
    • доступно только ткацкое решение во время выполнения

 Давайте посмотрим реальный пример Logger

// Biz Interface
public interface MyBiz {
public void doBizMethod();
}

//Biz Interface Impl
public class MyBizImpl implements MyBiz {
public void doBizMethod() {
System.out.println("Business Method");
}

}
//Around Advice Class
public class MethodLogger implements MethodInterceptor {

public MethodLogger() {}
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
// same with MethodBeforeAdvice
System.out.println("AOP: Before method call!");
try {
// proceed to original method call
Object result = methodInvocation.proceed();
// same with AfterReturningAdvice
System.out.println("AOP: After method call!");
return result;
} catch (IllegalArgumentException e) {
// same with ThrowsAdvice
System.out.println("AOP: Throw exception!");
throw e;
}
}

}

 Файл конфигурации Spring

<beans xmlns="http://www.springframework.org/schema/beans“ xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:aop=http://www.springframework.org/schema/aop xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<!-- business beans -->
<bean id="myBiz" class="com.attask.seminar.aop.spring.MyBizImpl"/>
<!-- aop -->
<bean id="methodLogger" class="com.attask.seminar.aop.spring.MethodLogger" />
<bean id="myBizProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="myBiz" />
<property name="interceptorNames">
<list> <value>methodLogger</value></list>
</property>
</bean>

</beans>
// Simple Usage
public static void main(String[] args) {
ClassPathXmlApplicationContext ctxt = new ClassPathXmlApplicationContext("SpringBeans.xml");
MyBiz bizInstance = (MyBiz)ctxt.getBean("myBizProxy");
bizInstance.doBizMethod();
}

// Result will be
AOP: Before method call!
Business Method
AOP: After method call!

 Примечание. Попробуйте использовать советы, которые подходят для вашего конкретного случая (до, после, броски)

 Найдите прикрепленный пример в разделе Ресурсы.