2016-10-11 2 views
0

У меня есть класс 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... не был напечатан. Не могли бы вы рассказать мне, что не так в моем коде?

Заранее благодарен!

ответ

1

Spring AOP - это не то же самое, что AspectJ. Spring AOP имеет множество ограничений по сравнению с AspectJ и применяется только к управляемым фасолью Spring. Объекты Book, созданные с помощью выражений сценария с аннотациями @Value, не являются управляемыми компонентами Spring, поэтому функциональность AOP не применяется.

+0

Я добавляю два компонента типа 'Book', используя' @ Bean' в класс 'Config' и заменяю' @ Value' '@ Autowired', но ожидаемый' logging ...' также не печатается. – walsh

+0

Я бы рекомендовал использовать AspectJ вместо Spring AOP, тем более, что вам это понадобится для не связанных с весной классов. Но если вы хотите придерживаться Spring AOP, вам нужно будет изменить '@ EnableAspectJAutoProxy' на' @EnableAspectJAutoProxy (proxyTargetClass = true) ', так как метод' equals', который вы пытаетесь перехватить, не является частью какого-либо интерфейса вашего «Книга» «услуга» будет реализована. –

+0

Спасибо за быстрый ответ! Я добавляю атрибут 'proxyTargetClass = true', но также не работает. Я также изменяю выражение pointcut из '@Pointcut (« выполнение (* java.lang.Object.equals (..)) »)' to '@Pointcut (" выполнение (* book.equals (..)) ")' , к несчастью, он тоже не работает. – walsh

Смежные вопросы