У меня есть класс Book
:Как посоветовать метод Object.equals с Spring AOP
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;
}
}
Это мой Аспект класс и класс конфигурации:
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...
не был напечатан. Не могли бы вы рассказать мне, что не так в моем коде?
Заранее благодарен!
Я добавляю два компонента типа 'Book', используя' @ Bean' в класс 'Config' и заменяю' @ Value' '@ Autowired', но ожидаемый' logging ...' также не печатается. – walsh
Я бы рекомендовал использовать AspectJ вместо Spring AOP, тем более, что вам это понадобится для не связанных с весной классов. Но если вы хотите придерживаться Spring AOP, вам нужно будет изменить '@ EnableAspectJAutoProxy' на' @EnableAspectJAutoProxy (proxyTargetClass = true) ', так как метод' equals', который вы пытаетесь перехватить, не является частью какого-либо интерфейса вашего «Книга» «услуга» будет реализована. –
Спасибо за быстрый ответ! Я добавляю атрибут 'proxyTargetClass = true', но также не работает. Я также изменяю выражение pointcut из '@Pointcut (« выполнение (* java.lang.Object.equals (..)) »)' to '@Pointcut (" выполнение (* book.equals (..)) ")' , к несчастью, он тоже не работает. – walsh