Совет по Spring в Setter Not Triggered

AshishUpadhyay спросил: 13 июня 2018 в 03:19 в: spring

У меня этот код ниже. advice on setter не запускается, даже если вызывается setter. Я могу видеть его в консоли

, если i do advice на String getName () все работает только fine.but его не работает на setter public void setName (имя строки).

spring.xml

<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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.1.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">    <aop:aspectj-autoproxy />
    <bean id="cust" class="aspectJ.Customer">
        <property name="name" value="logging" />    </bean>
    <bean id="aspect" class="aspectJ.LoggingAspect"/>
</beans>

Запись ASPECT

@Aspect
public class LoggingAspect {    @Before("allgetters()")
    public void printAspect() {
        System.out.println("Aspect Running");
    }    @Before("allgetters()")
    public void printAspectTwo() {
        System.out.println("Aspect TWO Running");
    }    @Pointcut("execution(public void setName(*))")
    public void allgetters() {
    }
}

КЛИЕНТ КЛИЕНТА

package aspectJ;public class Customer {
    private String name;    public String getName() {
        return name;
    }    public void setName(String name) {
        this.name = name;
        System.out.println("SETTER CALLED");
    }}

Основной класс

public class MainClass {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        Customer obj = (Customer) context.getBean("cust");    }}

2 ответа

kkflf ответил: 17 июня 2018 в 10:56

Ваша аспектная подпись неверна.

* будет соответствовать уникальному полю

.. будет соответствовать нулю или нескольким полям

Пример 1

com.stackoverflow.*.Customer.setName(..)

Совпадает со всеми пакетами, начиная с com.stackoverflow и заканчивая Customer. Подстановочный знак будет соответствовать только одному имени пакета. Метод может принимать ноль или более аргументов. Ниже приведены три примера того, что он будет соответствовать:

com.stackoverflow.question.Customer.setName()
com.stackoverflow.question.Customer.setName(String arg1)
com.stackoverflow.question.Customer.setName(String arg1, String arg2)

Пример 2

com..Customer.setName(*, *)

Сопоставьте все пакеты, начиная с com и заканчивая Customer. Принять методы с двумя аргументами любого типа. Ниже приведены два примера того, что он будет соответствовать. Обратите внимание, что подстановочный знак будет принимать любое количество пакетов.

com.example.Customer.setName(String arg1, Object arg2)
com.stackoverflow.question.Customer.setName(Integer arg1, Double arg2)

Вы должны изменить свой allgetters() на следующее:

@Pointcut("execution(public void setName(..))")
public void allgetters() {
}

Spring AOP работает только с beans, управляемым Spring. Компонент не управляется до его инициализации, независимо от того, определен ли он в Java или XML.

//The Customer object returned by this method is managed.
//The Customer object within the method is not managed
@Bean
public Customer createCustomer(){
    //This is a pure Java object 
    Customer customer = new Customer();
    //The object is not yet managed. This method call will therefore never be intercepted by your Pointcut.
    customer.setName("John Doe");
    return customer;
}

Цитата из документации:

Spring AOP поддерживает только точки соединения метода для Springbeans, поэтому вы можете думать о pointcut как совпадении с выполнением методов в Spring beans.

javamusings ответил: 13 июня 2018 в 10:33
Совет вызывается только тогда, когда сеттер вызывается в классе Java. Он не вызывается, когда свойство инициализируется в аспекте j.xml.
AshishUpadhyay ответил: 14 июня 2018 в 06:28
@kkflf ваше решение не работает.
AshishUpadhyay ответил: 14 июня 2018 в 06:30
@javamusings он работает, когда я вызываю setter в своем классе java
kkflf ответил: 14 июня 2018 в 08:08
@AshishUpadhyay Я не заметил ваш компонент, определенный в XML. Я заметил только очевидную ошибку в сигнатуре Pointcut. Я обновил свой ответ с объяснением.
AshishUpadhyay ответил: 14 июня 2018 в 06:32

Просто отправьте, какой пользователь @javamusings сказал :

Совет вызывается только тогда, когда сеттер вызывается в классе Java. Он не вызывается, когда свойство инициализируется в аспекте j.xml

Дополнительное видео по вопросу: Совет по Spring в Setter Not Triggered

What Is Spring AOP? | Spring AOP (Aspect Oriented Programming) Tutorial | Spring Training | Edureka

AOP - 11 - The Basics of Spring Framework

Spring AOP Tutorial