这在执行代码不起作用之前?它返回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();
}
}
答案 0 :(得分:1)
问题是你在同一个类中定义了方面和目标(发送方法)。
来自AOP Spring文档
在Spring AOP中,不可能将方面本身作为其他方面建议的目标。类上的@Aspect注释将其标记为方面,因此将其从自动代理中排除。
换句话说,当一个类用@Aspect
注释时,它无法被代理,这是AOP工作所需要的。
解决方法是将您的方面提取到新班级。但是,这会导致您遇到其他问题,因为您无法访问要设置的datap
。
我必须说实话,我不确定你目前的例子最好用AOP解决。
如果您想了解有关AOP的更多信息,请查看AOP Spring Documentation。很多例子都很清楚。