Я работаю с учебником Spring AOP, предназначенным для перехвата и определения времени вызовов методов. Он использует конфигурацию XML, но в структуре моей компании используется конфигурация Java. Я новичок в Spring и мог бы использовать некоторую помощь, преобразовывая это из конфигурации xml в конфигурацию java
Содержимое spring.xml выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<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-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- Enable AspectJ style of Spring AOP -->
<aop:aspectj-autoproxy />
<!-- Configure Employee Bean and initialize it -->
<bean name="employee" class="com.journaldev.spring.model.Employee">
<property name="name" value="Dummy Name"></property>
</bean>
<!-- Configure EmployeeService bean -->
<bean name="employeeService" class="com.journaldev.spring.service.EmployeeService">
<property name="employee" ref="employee"></property>
</bean>
<!-- Configure Aspect Beans, without this Aspects advices wont execute -->
<bean name="employeeAroundAspect" class="com.journaldev.spring.aspect.EmployeeAroundAspect" />
<bean name="employeeAnnotationAspect" class="com.journaldev.spring.aspect.EmployeeAnnotationAspect" />
<bean name="employeeXMLConfigAspect" class="com.journaldev.spring.aspect.EmployeeXMLConfigAspect" />
<!-- Spring AOP XML Configuration -->
<aop:config>
<aop:aspect ref="employeeXMLConfigAspect" id="employeeXMLConfigAspectID" order="1">
<aop:pointcut expression="execution(* com.journaldev.spring.model.Employee.getName())" id="getNamePointcut"/>
<aop:around method="employeeAroundAdvice" pointcut-ref="getNamePointcut" arg-names="proceedingJoinPoint"/>
</aop:aspect>
</aop:config>
</beans>
Как включить стиль AspectJ в конфигурации Java?
Блок XML:
<!-- Enable AspectJ style of Spring AOP -->
<aop:aspectj-autoproxy />
Требуется ли для этого простой импорт библиотек AspectJ в файлы Java?
Как инициализируются bean-компоненты Employee и Employee Service?
блок xml:
<!-- Configure Employee Bean and initialize it -->
<bean name="employee" class="com.journaldev.spring.model.Employee">
<property name="name" value="Dummy Name"></property>
</bean>
<!-- Configure EmployeeService bean -->
<bean name="employeeService" class="com.journaldev.spring.service.EmployeeService">
<property name="employee" ref="employee"></property>
</bean>
<!-- Configure Aspect Beans, without this Aspects advices wont execute -->
<bean name="employeeAroundAspect" class="com.journaldev.spring.aspect.EmployeeAroundAspect" />
<bean name="employeeAnnotationAspect" class="com.journaldev.spring.aspect.EmployeeAnnotationAspect" />
<bean name="employeeXMLConfigAspect" class="com.journaldev.spring.aspect.EmployeeXMLConfigAspect" />
Возможен ли блок Java Config? не знаете, как передать имена и значения свойств - используя Application.config? Также может быть проще поместить компоненты в один файл конфигурации?
package com.journaldev.spring.*;
import org.springframework.context.annotation.*;
@Configuration
public class EmployeeConfig {
@Bean
public Employee employee(){
return new Employee();
}
@Bean
public EmployeeService employeeService(){
return new EmployeeService();
}
@Bean
public EmployeeAroundAspect employeeAroundAspect(){
return new EmployeeAroundAspect();
}
@Bean
public EmployeeAnnotationAspect employeeAnnotationAspect(){
return new EmployeeAnnotationAspect();
}
@Bean
public EmployeeXMLConfigAspect employeeXMLConfigAspect(){
return new EmployeeXMLConfigAspect();
}
Как настроить XML-блок Spring AOP:
<!-- Spring AOP XML Configuration -->
<aop:config>
<aop:aspect ref="employeeXMLConfigAspect" id="employeeXMLConfigAspectID" order="1">
<aop:pointcut expression="execution(* com.journaldev.spring.model.Employee.getName())" id="getNamePointcut"/>
<aop:around method="employeeAroundAdvice" pointcut-ref="getNamePointcut" arg-names="proceedingJoinPoint"/>
</aop:aspect>
</aop:config>
</beans>
Блок Java Config:
Нужно ли создавать «ConfigAspect.java» с интерфейсом «Around Advice» и «ProceedingJoinPoint», который ссылается на метод в AspectPointCut.java?
package com.journaldev.spring.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
public class ConfigAspect {
public Object AroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("ConfigAspect:: Before invoking getName() method");
Object value = null;
try {
value = proceedingJoinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("ConfigAspect:: After invoking getName() method. Return value="+value);
return value;
}
}
Создайте файл AspectPointCut.java с аннотацией Pointcut, аналогичной -
package com.journaldev.spring.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AspectPointcut {
@Before("getNamePointcut()")
public void loggingAdvice(){
System.out.println("Executing loggingAdvice on getName()");
}
@Before("getNamePointcut()")
public void secondAdvice(){
System.out.println("Executing secondAdvice on getName()");
}
@Pointcut("execution(public String getName())")
public void getNamePointcut(){}
@Before("allMethodsPointcut()")
public void allServiceMethodsAdvice(){
System.out.println("Before executing service method");
}
//Pointcut to execute on all the methods of classes in a package
@Pointcut("within(com.journaldev.spring.service.*)")
public void allMethodsPointcut(){}
}