АОП с Spring 3 с использованием аннотаций - PullRequest
1 голос
/ 21 сентября 2011

Я пытаюсь заставить Аспект работать с Spring 3 и аннотациями.

@Aspect
public class AttributeAspect {

  @Pointcut("@annotation(com.mak.selective.annotation.Attribute)")
  public void process(){
    System.out.println("Inside Process ....");
  }

  @Around("process()")
  public void processAttribute(){
    System.out.println("Inside Actual Aspect ..");
  }
}

XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans                 http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 <aop:aspectj-autoproxy proxy-target-class="false" />
<context:component-scan base-package="com.mak.selective.annotation.*" />
<bean name="attribute" class="com.mak.selective.annotation.AttributeAspect"/>
</beans>

МОЙ тест для проверки аспекта:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/springcontext/*.xml")
public class AttributeTest {

@Attribute(tableName = "firstTable", columnName = "New Column")
private void getAttribute() {
    System.out.println("Inside Attribute call...");
}

@Test
public void testAttributeAspect() {
    getAttribute();
}

}

С помощью этого кода я могу видеть только "Внутренний вызов атрибута ...", но ничего из Аспекта. Пожалуйста, руководство.

Получил эту работу, создав новый объект (компонент) и внедрив его в тестовый класс Junit.

Ответы [ 3 ]

1 голос
/ 21 сентября 2011

Приятно видеть, что вы работаете с XML, но вы могли бы сделать это и из аннотаций.

Проблема в том, что аннотация @Aspect не является стереотипом Spring, поэтому сканер не регистрирует аспект как Spring Bean. Просто добавьте @Service или @Component выше или ниже @Aspect, и он будет зарегистрирован.

Кроме того, либо непосредственно присвойте имя бину (например, @Service("myNamedService")), либо попросите его реализовать интерфейс (например, public class AttributeAspect implements IAspect {) в соответствии со стандартным дизайном Spring.

0 голосов
/ 21 сентября 2011

Несколько вещей:

Во-первых, когда вы занимаетесь советом, вы должны написать метод совета следующим образом:

@Around(...)
public void aroundAdviceMethod(ProceedingJoinPoint pjp) throws Throwable {
    try {
        System.out.println("before...");
        pjp.proceed();
    }
    finally {
        System.out.println("After...");
    }
}

Но также (и это по крайней мере применимо, когда вы 'Если вы используете прокси-серверы, не совсем уверенные в вашем случае), метод, которому вы даете советы, должен быть общедоступным (ваш - нет), пружинным (через @Component или иным способом) и вызываться из класса external, чтобы прокси могвступить в силу (также не так в вашем примере).Итак, вам нужно что-то вроде этого:

@Component
public class SomeClass {
    @Attribute
    public void someMethodCall() {
        System.out.println("In method call");
    }
}

public class SomeUnitTest {
    @Autowired SomeClass someClass;
    @Test 
    public void testAspect() {
        someClass.someMethodCall();
    }
}
0 голосов
/ 21 сентября 2011

Вам нужно использовать реальный AspectJ, если вы хотите перехватывать вызовы методов в той же самой форме компонента, где он вызывается.(То, что вы сделали, должно работать, если метод testAttributeAspect () находится в другом bean-компоненте.)


Как создать настоящий AspectJ?

Использование компилятора AspectJа weaver позволяет использовать полный язык AspectJ и обсуждается в разделе 7.8, «Использование AspectJ с приложениями Spring».

@ См. Ссылка на Spring

...