Как написать аннотацию / аспект, чтобы не вводить метод, а возвращать ноль, если данное условие ложно? - PullRequest
0 голосов
/ 15 декабря 2018

В настоящее время у меня есть требование, где мне нужно вернуть ноль из сотен методов, если данное условие ложно.Я думал об использовании Java-аннотаций или Spring Aspect для этого, чтобы мне не приходилось везде писать этот блок кода if-else.Любая идея относительно того, как мы можем сделать это, используя аннотации Java или аспекты Spring?

Любые указатели могут быть полезны.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Без пружины вы можете использовать чистый AspectJ:

Demo.java: пример метода, который мы хотим изменить

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

DemoAspect.aj: файл конфигурации. Начало работы .В AspectJ pointcuts выбирают определенные точки соединения в потоке программы.Для реализации сквозного поведения мы используем совет. Совет объединяет pointcut (для выбора точек соединения) и тело кода (для запуска в каждой из этих точек соединения): до, вокруг, после ...

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 . Официальная документация .

0 голосов
/ 15 декабря 2018

Если я правильно вас понял, аннотация 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();
}

HopeЯ помог.И я рад любым исправлениям.Ура!

...