Почему мой аспект АОП возвращает ноль? - PullRequest
0 голосов
/ 29 мая 2018

Это до выполнения кода не работает?Возвращается null, потому что datap не устанавливается из метода my_int_it_method().@Before должен был бы выполнить my_int_it_method(), тогда работал бы только send().

Аспект AOP-код здесь:

package org.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class data {
    Connection con = new db_connect().connect();
    String datap;
    String test;

    @Before("execution(public String send())")
    public void my_int_it_method() {

        String query = "Select * from shapes where shape_id=?";
        PreparedStatement pstmt;
        try {
            pstmt = con.prepareStatement(query);
            pstmt.setInt(1, 2);
            ResultSet rs = pstmt.executeQuery();

            if(rs.next()) {
                datap=rs.getString("type");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public String send() {
        return datap;
    }   
}

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">
    <aop:aspectj-autoproxy/>
    <bean name = "data" class="org.main.data" autowire="byName"/>
</beans>

Выполнениекод здесь:

package org.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml");
        data dataa = ctx.getBean("data",data.class);
        dataa.send();
    }
}

1 Ответ

0 голосов
/ 29 мая 2018

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

Из документации AOP Spring

В Spring AOP это не таквозможно, чтобы сами аспекты были целью советов от других аспектов.Аннотация @Aspect для класса помечает его как аспект и, следовательно, исключает его из автоматического проксирования.

Другими словами, в тот момент, когда класс помечается @Aspect, он не может быть проксирован,что необходимо для работы АОП.

Решением для этого является извлечение вашего аспекта в новый класс.Это, однако, вызовет некоторые другие проблемы, поскольку у вас не будет доступа к datap, который вы хотели установить.

Я должен быть честным, я не уверен, что ваш текущий пример лучше всего решается с помощью AOP,

Если вы хотите узнать больше об АОП, посмотрите документацию AOP Spring .Это довольно ясно с множеством примеров.

...