Spring AOP setAdvice 仅针对一种特定方法

发布于 2024-12-18 10:25:00 字数 468 浏览 2 评论 0原文

我有以下课程:

package x.y.z;

public class MyClass{
public void someMethod(SomeObject object){
//do somethinng
}

public void {
//do somethinng
}

}

现在我想仅在方法 someMethod(SomeObject object, int param1) 上设置 @PointCut

我该怎么做?

更新我正在尝试

@Pointcut("execution(x.y.z.MyClass.someMethod(x.y.z.SomeObject))") but I'm getting not well formed pointcut exception.

I have the following class:

package x.y.z;

public class MyClass{
public void someMethod(SomeObject object){
//do somethinng
}

public void {
//do somethinng
}

}

Now I would like to set @PointCutonly on method someMethod(SomeObject object, int param1)

How can I do it?

Update I'm trying

@Pointcut("execution(x.y.z.MyClass.someMethod(x.y.z.SomeObject))") but I'm getting not well formed pointcut exception.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁月苍老的讽刺 2024-12-25 10:25:00

切点应该是:

target(x.y.z.MyClass) && execution(<RETURN TYPE> someMethod(x.y.z.SomeObject))

Point cut should be:

target(x.y.z.MyClass) && execution(<RETURN TYPE> someMethod(x.y.z.SomeObject))
源来凯始玺欢你 2024-12-25 10:25:00

将 AspectJ 附加到您的类路径并使用 maven AOP 插件将此 Aspect 编译为字节码,请看这个示例:

@Aspect
public class IOControlAspect {
    @Around("execution(com...SomeClass.someMethod(*))")
    public Object ioControlWrapper(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        {your code here}
        return thisJoinPoint.proceed();
    }
}

Attach AspectJ to your classpath and use maven AOP plugin to compile this Aspect to bytecode, look at this example:

@Aspect
public class IOControlAspect {
    @Around("execution(com...SomeClass.someMethod(*))")
    public Object ioControlWrapper(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        {your code here}
        return thisJoinPoint.proceed();
    }
}
唠甜嗑 2024-12-25 10:25:00

假设我们有一个 @Controller 类:

package co.gg.controller;

@Controller
public class LoginController {

    @GetMapping(value="/getTenantRoles")
    @ResponseBody
    public String getTenantRoles(@RequestParam("tenant_id") String tenant_id) throws SQLException {

        sqlConnection = con.makeconnection(dbName, dbPort, dbUserName, dbPass, dbHost);

        String sql = "select * from tenant_role where tenant_id = "+tenant_id+" and is_active = 1 and is_deleted = 0;";
        PreparedStatement preparedStatement = sqlConnection.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery();

        ArrayList<TenantRoleModel> tenantRoleModelList = new ArrayList<>();
        while(rs.next()) {
            TenantRoleModel currentModel = new TenantRoleModel(
                                                                    rs.getInt("tenant_role_id"),
                                                                    rs.getInt("is_deleted"),
                                                                    rs.getInt("is_active"),
                                                                    rs.getInt("tenant_id"),
                                                                    rs.getString("role_name"),
                                                                    rs.getString("create_date")
                                                                );

            tenantRoleModelList.add(currentModel);
        }

        return new Gson().toJson(tenantRoleModelList);
    }
}

然后我们必须像这样拦截该方法:

package co.gg.AOP;


@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class Aspects {

    @AfterReturning(value = "execution(* co.fdbk.controller.LoginController.getTenantRoles(..))", returning = "result")
    public void afterAPICall(JoinPoint joinPoint,Object result){

        System.out.println("AOP Method Name :"+ joinPoint.getSignature().getName());
        System.out.println("AOP Return Value  :"+ result);


    }
}

这就是我们拦截特定方法的方式。

Suppose we have a @Controller class :

package co.gg.controller;

@Controller
public class LoginController {

    @GetMapping(value="/getTenantRoles")
    @ResponseBody
    public String getTenantRoles(@RequestParam("tenant_id") String tenant_id) throws SQLException {

        sqlConnection = con.makeconnection(dbName, dbPort, dbUserName, dbPass, dbHost);

        String sql = "select * from tenant_role where tenant_id = "+tenant_id+" and is_active = 1 and is_deleted = 0;";
        PreparedStatement preparedStatement = sqlConnection.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery();

        ArrayList<TenantRoleModel> tenantRoleModelList = new ArrayList<>();
        while(rs.next()) {
            TenantRoleModel currentModel = new TenantRoleModel(
                                                                    rs.getInt("tenant_role_id"),
                                                                    rs.getInt("is_deleted"),
                                                                    rs.getInt("is_active"),
                                                                    rs.getInt("tenant_id"),
                                                                    rs.getString("role_name"),
                                                                    rs.getString("create_date")
                                                                );

            tenantRoleModelList.add(currentModel);
        }

        return new Gson().toJson(tenantRoleModelList);
    }
}

Then We have to intercept that method like this:

package co.gg.AOP;


@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class Aspects {

    @AfterReturning(value = "execution(* co.fdbk.controller.LoginController.getTenantRoles(..))", returning = "result")
    public void afterAPICall(JoinPoint joinPoint,Object result){

        System.out.println("AOP Method Name :"+ joinPoint.getSignature().getName());
        System.out.println("AOP Return Value  :"+ result);


    }
}

This is how we can intercept specific method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文