2017-02-01 5 views
0

Я использую Spring AOP для регистрации системы моего приложения. Но у меня есть некоторые проблемы с этим.Spring AOP не работает

У меня есть простой класс

@Component 
@Scope(BeanDefinition.SCOPE_PROTOTYPE) 
public class MessageReceiverImpl implements MessageReceiver { 
    final private BufferedReader reader; 

    public MessageReceiverImpl(BufferedReader reader) { 
     this.reader = reader; 
    } 
    public String receive(){ 
     String msg = null; 
     try { 
      msg = reader.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return msg; 
    } 
} 

И Logger класс с piontcut для MessageReceiverImpl

@Aspect 
public class LoggerMessage { 

    private static final Logger log = Logger.getLogger("listenerLogger"); 

    @Before("execution(* server.logic.listener.message.MessageReceiverImpl.receive(..))") 
    public void logMessageReceiver() { 
     log.info("INFO : LoggerMessage -> new Client"); 
    } 
} 

И мой bean.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 "> 

    <aop:aspectj-autoproxy> 
     <aop:include name="loggerMessage"/> 
    </aop:aspectj-autoproxy> 
    <aop:aspectj-autoproxy proxy-target-class="true"/> 

    <!-- Aspect --> 
    <bean id="loggerMessage" class="service.logger.listener.LoggerMessage" /> 

</beans> 

Но он не работает до выполнения приема(). Другой класс журнала работает хорошо. Где у меня проблемы?

Дополнительная информация. Создание instatnce

@Bean 
@Scope(BeanDefinition.SCOPE_PROTOTYPE) 
UploadSession getSession(Socket socket) { 
    UploadSessionImpl uploadSession = null; 
    try { 
     uploadSession = new UploadSessionImpl(socket); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     MessageReceiver receiver = new MessageReceiverImpl(reader); 
     uploadSession.setReceiver(receiver); 

     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     MessageSender sender = new MessageSenderImpl(out); 
     uploadSession.setSender(sender); 

     uploadSession.setBaseDir(context.getEnvironment().getProperty("listener.test-runs-folder")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return uploadSession; 
} 

Использование

public class UploadSessionImpl implements UploadSession,  ApplicationContextAware { 

private MessageReceiver receiver; 

public UploadSessionImpl(Socket socket) throws IOException { 
    this.socket = socket; 
} 

public void process() throws IOException { 
    String msg; 

    while (true) { 
     msg = receiver.receive(); 
     if (msg.equals("close")) break; 
     ... 
    } 
} 
+0

У вас есть двойная запись для 'aop: aspectj-autoproxy', которую необходимо удалить. Также сохраняйте 'proxy-target-class =" true "' –

+0

И как вы создаете экземпляры класса MessageRecieverImpl? Как загружается эта конфигурация? Здесь слишком мало информации ... Пожалуйста, предоставьте образец, который воспроизводит это, а не только фрагменты. –

+0

@M. Deinum я добавил дополнительную информацию. –

ответ

0

так далеко от вашего кода, похоже, вы перепутали конфигурации создания боб. Попробуйте с этим:

@Bean 
    @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
    public BufferedReader bufferedReader(Socket socket) throws Exception { 
     return new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } 

    @Bean 
    @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
    public MessageReceiver receiver(BufferedReader bufferedReader) { 
     return new MessageReceiverImpl(bufferedReader); 
    } 

    @Bean 
    @Scope(BeanDefinition.SCOPE_PROTOTYPE) 
    UploadSession getSession(Socket socket, MessageReceiver receiver) { 
     UploadSessionImpl uploadSession = null; 
     try { 
      uploadSession = new UploadSessionImpl(socket); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      uploadSession.setReceiver(receiver); 

      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      MessageSender sender = new MessageSenderImpl(out); 
      uploadSession.setSender(sender); 

      uploadSession.setBaseDir(context.getEnvironment().getProperty("listener.test-runs-folder")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return uploadSession; 
    } 
Смежные вопросы