Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AOP没有';行不通_Java_Spring_Spring Aop - Fatal编程技术网

Java Spring AOP没有';行不通

Java Spring AOP没有';行不通,java,spring,spring-aop,Java,Spring,Spring Aop,我正在使用SpringAOP作为我的应用程序的日志系统。但是我有一些麻烦 我有简单的课程 @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class MessageReceiverImpl implements MessageReceiver { final private BufferedReader reader; public MessageReceiverImpl(BufferedReader reade

我正在使用SpringAOP作为我的应用程序的日志系统。但是我有一些麻烦

我有简单的课程

@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;
    }
}
以及带有用于MessageReceiverImpl的piontcut的记录器类

@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>
使用

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;
        ...
    }
}

到目前为止,您的代码似乎正在混乱bean创建配置。试试这些:

    @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;
    }

您有重复的
aop:aspectj autoproxy
条目,应该删除该条目。还要保留
proxy target class=“true”
以及如何创建
MessageRecieverImpl
类的实例?如何加载此配置?这里的信息太少了。。。请提供一个复制此内容的示例,而不仅仅是片段。@M.Deinum我添加了一些您自己创建新实例的更多信息,spring将只提供它所知道的建议bean。您必须在应用程序上下文中注册bean,并使用
ApplicationContext.getBean
获取一个新实例,然后该实例将被代理。@M.Deinum ohhh,您是对的。谢谢
    @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;
    }