为什么我的AOP方面返回null?

时间:2018-05-29 11:17:44

标签: java spring aop aspectj spring-aop

这在执行代码不起作用之前?它返回null,因为datap未设置my_int_it_method()方法。 @Before应该已执行my_int_it_method(),只有send()才有效。

Aspect 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 :(得分:1)

问题是你在同一个类中定义了方面和目标(发送方法)。

来自AOP Spring文档

  

在Spring AOP中,不可能将方面本身作为其他方面建议的目标。类上的@Aspect注释将其标记为方面,因此将其从自动代理中排除。

换句话说,当一个类用@Aspect注释时,它无法被代理,这是AOP工作所需要的。

解决方法是将您的方面提取到新班级。但是,这会导致您遇到其他问题,因为您无法访问要设置的datap

我必须说实话,我不确定你目前的例子最好用AOP解决。

如果您想了解有关AOP的更多信息,请查看AOP Spring Documentation。很多例子都很清楚。