gpt4 book ai didi

java - 没有 xml 配置的非 Spring 轻量级 AOP,用于将注释编织到方法中

转载 作者:行者123 更新时间:2023-11-30 05:48:23 24 4
gpt4 key购买 nike

需要在某些注释的方法之前和之后运行。

不使用 spring,没有 xml。是否可以从 main() 设置某种 AOP 引擎,以便在需要时可以调用它?我也可以放入一个方法来手动调用评估方法。

示例:

public void doThis(@RequiredSecurityRole("admin") user){
doAOPStuff();
}

before() 从数据库获取并检查用户是否是管理员,如果不是管理员则抛出异常。

after() 将操作登录到数据库。

如何实现这一目标?

最佳答案

您可以使用 java.lang.reflex.Proxy 类自己完成此操作。它确实需要在接口(interface)中定义您代理的代码。

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DoItYourAop {

public static void main(String[] args) {
SaysHello saysHello = new SaysHelloImpl();
InvocationHandler logger = new LoggingProxy(saysHello);
SaysHello proxy = (SaysHello) Proxy.newProxyInstance(SaysHello.class.getClassLoader(),
new Class[]{SaysHello.class}, logger);
proxy.sayHello();
}

public interface SaysHello {

void sayHello();

void sayGoodbye();
}

public static class SaysHelloImpl implements SaysHello {
@Log
@Override
public void sayHello() {
System.out.println("Says Hello");
}

@Override
public void sayGoodbye() {
System.out.println("Says Goodbye");
}
}

@Retention(RUNTIME)
@interface Log {
}

public static class LoggingProxy implements InvocationHandler {

private final Object proxied;

public LoggingProxy(Object proxied) {
this.proxied = proxied;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Method proxiedMethod = proxied.getClass().getMethod(method.getName(), method.getParameterTypes());
boolean log = proxiedMethod.isAnnotationPresent(Log.class);
if (log) {
System.out.println("Before");
}

Object result = method.invoke(proxied, args);

if (log) {
System.out.println("After");
}

return result;
}
}
}

关于java - 没有 xml 配置的非 Spring 轻量级 AOP,用于将注释编织到方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54431730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com