Давайте определим некоторые хорошо известные проблемы
- Некоторые задачи программирования не могут быть аккуратно заключены в объекты, но должны быть разбросаны по всему коду
- Примеры:
- Ведение журнала (отслеживание поведения программы в файле)
- Профилирование (определение того, где программа проводит свое время)
- Трассировка (определение того, какие методы вызываются, когда)
- Управление транзакциями
- Управление безопасностью
- В результате получается перекрестный код — необходимый код « пересекает » множество различных классов и методов.
Вышеупомянутые проблемы легко решаются с помощью АОП.
Теперь давайте определим некоторые концепции АОП
- Аспектно-ориентированное программирование (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!
Примечание. Попробуйте использовать советы, которые подходят для вашего конкретного случая (до, после, броски)
Найдите прикрепленный пример в разделе Ресурсы.