2016-11-30 5 views
0

Я новичок в Spring AOP и аннотации. Я попытался написать простую программу, в которой используется Aspect. Я не могу понять, где я ошибся. Его не печатает то, что у меня есть в моем аспекте.Spring AOP - невозможно выполнить Aspect

package com.business.main; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.EnableAspectJAutoProxy; 

@EnableAspectJAutoProxy 
@Configuration 
public class PrintMain { 

    public static void main(String[] args) { 
     // Do I always need to have this. Can't I just use @Autowired to get beans 
     ApplicationContext ctx = new AnnotationConfigApplicationContext(PrintMain.class); 
     CheckService ck = (CheckService)ctx.getBean("service"); 
     ck.print(); 
    } 

    @Bean(name="service") 
    public CheckService service(){ 
     return new CheckService(); 
    } 

} 

package com.business.main; 

import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.springframework.stereotype.Component; 

@Aspect 
@Component 
public class SimpleAspect { 

    @Around("execution(* com.business.main.CheckService.*(..))") 
    public void applyAdvice(){ 
     System.out.println("Aspect executed"); 
    } 
} 

package com.business.main; 

import org.springframework.stereotype.Component; 

@Component 
public class CheckService{ 
    public void print(){ 
     System.out.println("Executed service method"); 
    } 
} 

Выход: Выполненный метод обслуживания

Я ожидаю, чтобы напечатать то, что у меня есть в моем Аспект

ответ

1

Я думаю, что ваш @Component не работает!
Может быть, вам нужен @ComponentScan

@EnableAspectJAutoProxy 
@ComponentScan 
@Configuration 
public class PrintMain { 

    public static void main(String[] args) { 
     // Do I always need to have this. Can't I just use @Autowired to get beans 
     ApplicationContext ctx = new AnnotationConfigApplicationContext(TNGPrintMain.class); 
     CheckService ck = (CheckService)ctx.getBean("service"); 
     ck.print(); 
    } 

    @Bean(name="service") 
    public CheckService service(){ 
     return new CheckService(); 
    } 

} 
+0

мне пришлось сделать два изменения, чтобы сделать его работу 1) Реализовать интерфейс 2) добавить @ ComponentScan. Но я хотел бы знать, почему он не работает без интерфейса ... Я читал что-то, связанное с CGLIB, которое нельзя принудить с помощью аннотаций. Во-вторых, почему он не работает без @ ComponentScan – karthik

+0

@karthik Поскольку вы просто используете Component, но Spring не используете его как bean-компонент, это означает, что ApplicationContext его не имеет. Когда ApplicationContext подключен, ему нужно знать, кто будет подключен как компонент. ApplicationContext не знает, нужен ли вам компонент или его использование, поэтому вам нужно использовать Xml или ComponentScan, чтобы сообщить Spring. Мне нужно, чтобы некоторые компоненты были подключены. – JonahCui

+0

@karthik Мой английский не очень хорош. Пожалуйста, прости меня. – JonahCui