在springboot框架中,aop切面方法对数据库的增删操作进行增强,对标记了@Data的方法切入,我希望能够在不影响正常业务的情况下将数据取出的代码实现
时间: 2023-05-23 19:06:44 浏览: 146
A:可以使用AspectJ的@Around注解,在切入点方法执行前后进行代码增强,同时可以通过反射获取到标记了@Data的类的所有字段,利用这些信息将数据取出。具体实现如下:
```java
@Aspect
@Component
public class MyAspect {
@Autowired
private DataSource dataSource;
@Around(value = "@annotation(MyAnnotation)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取目标方法参数
Object[] args = joinPoint.getArgs();
// 获取标注了@Data的类实例
for (Object arg : args) {
if (arg != null && arg.getClass().isAnnotationPresent(Data.class)) {
// 反射获取DTO的所有字段
Field[] fields = arg.getClass().getDeclaredFields();
for (Field field : fields) {
// 获取字段名
String fieldName = field.getName();
// 拼接查询SQL
String sql = "select " + fieldName + " from " + arg.getClass().getSimpleName() + " where id=?";
// 获取连接
Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 设置参数
preparedStatement.setLong(1, (Long) ReflectionUtils.invokeGetterMethod(arg, "id"));
ResultSet resultSet = preparedStatement.executeQuery();
// 从结果集中获取到值
if (resultSet.next()) {
Object value = resultSet.getObject(fieldName);
ReflectionUtils.invokeSetterMethod(arg, fieldName, value);
}
// 关闭连接
resultSet.close();
preparedStatement.close();
connection.close();
}
}
}
// 执行目标方法
Object result = joinPoint.proceed(args);
return result;
}
}
```
阅读全文