如果给定条件为假,如何编写注释/方面以不输入方法但返回 null?

Posted

技术标签:

【中文标题】如果给定条件为假,如何编写注释/方面以不输入方法但返回 null?【英文标题】:How to write an annotation/aspect to not enter a method but return null if a given condition is false? 【发布时间】:2018-12-15 01:18:52 【问题描述】:

我目前有一个要求,如果给定条件为假,我需要从 100 个方法中返回 null。我正在考虑为此使用 Java Annotations 或 Spring Aspects,这样我就不必到处编写 if-else 代码块了。关于我们如何使用 Java Annotations 或 Spring Aspects 来做到这一点的任何想法?

任何指针都可能会有所帮助。

【问题讨论】:

AOP 将是一个选项,但如果没有更多信息,答案将只是猜测。你想返回的方法有什么共同点?如果要编写 AOP 切入点,这是必要的知识。 Ist 是方法签名、包名、类名模式、基类/接口、公共注解、其他东西还是它们的组合?此外,为了决定是使用 Spring AOP 还是 AspectJ:有问题的方法都是公开的吗?请显示示例代码,最好是MCVE。 @kriegaex,感谢您回复,关于“您想要返回的方法有什么共同点?” --> 所有方法基本上都检查一个条件,如果该条件为 TRUE,它们应该返回 null 而不是进一步处理任何事情。 我已经知道了,但这并不能回答我的问题。我询问了这些方法在技术上的共同点,以便能够通过 AOP 将它们挑选出来,而不是关于方面应该添加到这些方法中的行为。 @kriegaex,只有 if 条件检查对他们来说是通用的,没有别的。它们也在同一个 java 类中,否则其他一切都不同 - 它们的参数、返回类型、方法签名等 - 一切都不同。 看看我的新问题是否清楚 - ***.com/questions/53791423/… 【参考方案1】:

如果我理解正确,Spring @Conditional 注释就是你想要的。 您创建了一些实现 Spring 的 Condition 接口的公共类:

public class Test implements Condition 
...

然后你将前面提到的注释与作为公共类参数的参数一起使用。

@Conditional(Test.class)
public Object someMethod(boolean context)
/*and so do some logics; if the value of 'context' variable is false, you can return 
null; otherwise, just return like this*/
return new someMethodImpl1();

希望我能帮上忙。我很高兴任何形式的更正。干杯!

【讨论】:

嗨@dima_mayd,你能举个例子吗 - 关于测试中应该包含什么,即我的用例的“匹配”方法的示例实现? 我不想注册任何组件/bean,只想执行一个基于布尔值的方法。如果这更清楚,请参阅我的这个新问题 - ***.com/questions/53791423/…【参考方案2】:

没有 spring 你可以使用纯 AspectJ:

Demo.java : 我们要修改的方法示例

public class Demo 
    public String boom(String base) 
        return base;
    

DemoAspect.aj : 配置文件。 Getting started。在 AspectJ 中,pointcuts 在程序流中挑选出某些连接点。为了实际实现横切行为,我们使用建议。 Advice 汇集了一个切入点(用于挑选连接点)和一段代码(在每个连接点处运行):之前、周围、之后...

public aspect DemoAspect 
    pointcut callBoom(String base, Demo demo) : 
            call(String Demo.boom(String)) && args(base) && target(demo);

    String around(String base, Demo demo) : callBoom(base, demo)
        if ("detonate".equals(base)) 
            return "boom!";
         else 
            return proceed(base, demo);
        
    

DemoTest.java

public class DemoTest 
    @Test
    void name() 
        Demo demo = new Demo();
        assertEquals("boom!", demo.boom("detonate"));
        assertEquals("fake", demo.boom("fake"));
    

将依赖添加到pom.xml

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.13</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.13</version>
    </dependency>

还有插件,注意版本。例如 1.11 插件需要 1.8.13 库。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.11</version>
    <configuration>
        <complianceLevel>1.8</complianceLevel>
        <source>1.8</source>
        <target>1.8</target>
        <showWeaveInfo>true</showWeaveInfo>
        <verbose>true</verbose>
        <Xlint>ignore</Xlint>
        <encoding>UTF-8 </encoding>
    </configuration>
    <executions>
        <execution>
            <goals>
                <!-- use this goal to weave all your main classes -->
                <goal>compile</goal>
                <!-- use this goal to weave all your test classes -->
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

更多细节的好例子,Baeldung。 Official documentation.

【讨论】:

如果需要spring AOP的例子,请留言。 是的@uli,我正在寻找一个spring AOP 示例。谢谢。 如果这有助于您提供更好的清晰度,请检查我的这个问题。我的问题 - ***.com/questions/53791423/… 我在你的第二个问题下添加了 spring 示例。

以上是关于如果给定条件为假,如何编写注释/方面以不输入方法但返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

Opengl着色器:如果条件错误地评估为假

IF 语句:如果条件为假,如何将单元格留空(“”不起作用)

如何编写自定义的 gradle 任务以不忽略 Findbugs 违规但在分析完成后失败

如果条件为假,我可以在Rust中使用什么运算符来返回特定错误?

如何在 Python 中编写 if-else 条件(Google App Engine)

如果条件为假,则阻止默认