小编Yev*_*i N的帖子

Spring AOP对于具有接口的类无能为力

我知道Spring AOP的功能非常有限(它只能切入Spring bean的类的公共方法,并且只有在从类外部调用这些方法时).但是现在我发现了涉及接口的另一个令人困惑的限制.

通常,如果一个类被子类化,Spring AOP可以切入所有方法(甚至是被覆盖的方法):

public class A {
    public void methodA() { } //OK, can cut in
}

public class B extends A {
    @Override
    public void methodA() { } //OK, can cut in

    public void methodB() { } //OK, can cut in
}
Run Code Online (Sandbox Code Playgroud)

但是当我们在混合中添加一个接口时,对于Spring AOP来说,事情变得非常糟糕:

public interface I {
    public void methodA();
}

public class A implements I {
    @Override
    public void methodA() { } //OK, can cut in

    public void methodB() { } //Fail, cannot see or …
Run Code Online (Sandbox Code Playgroud)

java inheritance aop spring spring-aop

4
推荐指数
1
解决办法
879
查看次数

javascript 的异步函数实际上是同步的吗?

我想弄清楚异步代码在 Javascript 中是如何工作的。现在,我明白在 JS 中实际上有一个线程执行队列中的作业,并且只有在当前作业完成后(即如果所有同步代码或异步函数都完成),它才能开始执行下一个作业.

现在,令人困惑的部分是实际算作异步函数的部分 - 实际放入队列中单独作业的内容,以及未放入的内容。

首先,我们有async函数的关键字。那么这是否意味着这些函数将被放入队列中的一个单独的作业中并在将来的某个地方执行?好吧,事实证明答案是否定的。但请耐心等待,我将解释。

据我所知,理论上,JS 线程应该首先执行所有同步代码,直到它完成,同时通过将它们作为作业放置到队列末尾来延迟所有异步函数、承诺和回调的执行。然后,一旦所有同步代码完成,它将开始执行所有堆积的工作。

所以如果我有以下代码:

async function asyncFunc() {
    console.log("executing async function");
}

console.log("starting sync code");
asyncFunc().then(() => {
    console.log("executing callback of async function")
});
console.log("sync code completed");
Run Code Online (Sandbox Code Playgroud)

那么理论上,它应该先执行所有同步代码,然后才开始执行异步函数,然后是回调:

starting sync code
sync code completed
executing async function
executing callback of async function
Run Code Online (Sandbox Code Playgroud)

但现实是不同的!实际上,它实际上是同步执行 async 函数,以及其余的同步代码。实际放入作业队列的唯一位是异步函数的回调

starting sync code
executing async function
sync code completed
executing callback of async function
Run Code Online (Sandbox Code Playgroud)

那是什么意思呢?那个async函数其实是骗人的?看起来是这样,因为它们实际上是正常的同步函数,您可能会碰巧将 …

javascript asynchronous node.js async-await

3
推荐指数
1
解决办法
781
查看次数