如何使用Spring AOP建议Object.equals方法

时间:2016-10-11 13:22:11

标签: spring spring-aop

我有一个班级Book

package book;
public class Book {
    private String title;
    public Book(String title) {
        this.title = title;
    }
    public boolean equals(Object object) {
        if(object instanceof Book) {
             Book book = (Book) object;
             return this.title.equals(book.title);
        }
        return false;
    }
}

这是我的Aspect类和Configuration类:

package book;
@Aspect
@Component
public class Logging {
    @Pointcut("execution(* java.lang.Object.equals(..))")
    private void equals() {}

    @Before("equals()")
    public void log() {
        System.out.println("logging...");
    }
}

package book;
@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class Config {
}

这是我的测试课程:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = Config.class)
public class LoggingTest {
    @Value("#{new book.Book('book1')}")
    private Book book;

    @Value("#{new book.Book('book2')}")
    private Book book2;

    @Test
    public void test() {
        assertFalse(book.equals(book2));
    }
}

此测试类成功运行。但是没有打印预期的logging...。你能告诉我我的代码有什么问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

Spring AOP与AspectJ不同。与AspectJ相比,Spring AOP有很多限制,它只适用于Spring托管bean。使用带有Book注释的脚本表达式创建的@Value对象不是Spring托管bean,因此不会对它们应用AOP功能。