Java Spring AOP没有';行不通
我正在使用SpringAOP作为我的应用程序的日志系统。但是我有一些麻烦 我有简单的课程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
@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;
}