Как заменить конфигурацию spring.xml на конфигурацию Java? - PullRequest
1 голос
/ 27 марта 2019

Я работаю с учебником 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(){}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...