2013-03-27 8 views
2

Мой класс Аспект будет,AOP с использованием AspectJ не работает весной?

@Configuration 
@EnableAspectJAutoProxy 
@Component 
@Aspect 
public class AspectClass { 

    @Before("execution(* com.pointel.aop.test1.AopTest.beforeAspect())") 
    public void logBefore(JoinPoint joinPoint) { 

     System.out.println("Before running the beforeAspect() in the AopTest.java class!"); 
     System.out.println("Hijacked Method name : " + joinPoint.getSignature().getName()); 
     System.out.println("************************"); 
    } 

} 

Мой другой класс Java

public class AopTest { 

    public void beforeAspect() { 
     System.out.println("This is beforeAspect() !"); 
    } 
} 

Мой главный класс

public class MainMethod { 

    public static void main(String[] args) {  
     ApplicationContext context = new FileSystemXmlApplicationContext("ApplicationContext/applicationContext.xml"); 
     AopTest test = (AopTest)context.getBean("bean1"); 
     test.beforeAspect(); 
    } 
} 

Мой applicationContext.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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> 

    <bean id="bean1" class="com.pointel.aop.test1.AopTest" /> 

</beans> 

В этом @Before("execution(* com.pointel.aop.test1.AopTest.beforeAspect())") в AspectClass не будет выполняться до beforeAspect() в AopTest при запуске основного метода.

Хорошие ответы определенно оценены.

+2

Не делайте свой класс конфигурации таким же, как ваш класс Aspect. Кроме того, вам нужно '@ ComponentScan' пакет, в котором находится ваш Aspect. –

+0

Я удалил' @ Configuration' и включил '@ ComponentScan', но все еще не работал. –

+0

Посмотрите ниже, есть несколько вещей, которые вам не хватало. –

ответ

3

Прежде всего, если вы собираетесь использовать конфигурацию на основе аннотаций, используйте AnnotationConfigApplicationContext вместо FileSystemXmlApplicationContext. И избавитесь от файла applicationContext.xml и просто добавьте метод @Bean в свой класс конфигурации. Что-то вроде этого:

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan(basePackages = "your.aspect.package") 
public class AspectConfig { 
    @Bean 
    public AopTest aopTest() { 
     return new AopTest(); 
    } 
} 

в главном

public class MainMethod { 

    public static void main(String[] args) {  
     AnnotationConfigApplicationContextcontext = new AnnotationConfigApplicationContext(AspectConfig.class); 
     // don't forget to refresh 
     context.refresh(); 
     AopTest test = (AopTest)context.getBean("aopTest"); 
     test.beforeAspect(); 
    } 
} 

В AspectClass вы должны иметь @Component, @Aspect, и ваш метод должен иметь совет или с пересечениями аннотацию, как @Before. Он должен быть @Component, так что Spring знает, что его сканировать.

+0

Спасибо за ваш ответ ... Я хочу удалить четыре аннотации в 'AspectClass'? –

+0

В 'AspectClass' вы должны иметь' @ Component', '@ Aspect', и ваш метод должен иметь рекомендацию или аннотацию pointcut, например' @ Before'. Он должен быть '@ Component', так что Spring знает, что нужно его сканировать. Обновлен мой ответ –

+0

В чем необходимость 'context.refresh();'? Получил решение без '' context.refresh(); '. –

1

Здесь код необходимо добавить в xml для использования аннотаций - 1. для аннотации @component.

xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd" 

2.after, которые используют компонент сканирования, чтобы получить все аннотированный класс компонента, которые используют @component аннотацию, а также использовать АОП autoproxy-

<context:annotation-config/> 
<context:component-scan base-package="mypackage"></context:component-scan> 
<aop:aspectj-autoproxy> 
</aop:aspectj-autoproxy> 

для примеров visit- www.technicaltoday.com/p/spring.html

+0

Спасибо за ваш ответ ... Мне не нужны сделать это с помощью 'xml' и просто искать аннотацию на основе' AspectJ'. –

0

У вас не хватает определение точки в вашем классе аспектов.

Например,

@Pointcut("execution(* *.advice(..))") 
public void logBefore(){} 

@Before("logBefore()") 
public void beforeAdvicing(){ 
System.out.println("Listen Up!!!!"); 
} 

Прежде всего, вам нужно определить точку, чтобы сплести ваш аспект. Вы делаете это, используя Point cuts.It имя точки, вы указываете в своей аннотации @Before. Взгляните на мое сообщение в блоге для получения дополнительной информации @http://dinukaroshan.blogspot.com/2010/06/aop-with-spring.html

0

Я не вижу ваш AspectClass в конфигурации боба. Вы также должны объявить его как Боб.

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