调用层
RabbitAutoConfiguration
// 这个是自动配置引入RabbitAnnotationDrivenConfiguration
@EnableRabbit
RabbitBootstrapConfiguration
RabbitListenerAnnotationBeanPostProcessor
- xx 略
- 说明:
- 加
@RabbitListener
注解的类本身没有被 AOP 代理 - 只是 Spring 内部记录下
- 然后收到消息通过反射调用被注解的方法
- 类似 SpringMVC 对
@RequestMapping
映射的处理
最终调用
SimpleMessageListenerContainer.AsyncMessageProcessingConsumer
循环监听
receiveAndExecute(this.consumer)
类似 socket 阻塞式监听BlockingQueueConsumer
- 内部再是通过阻塞队列,实现生产者、消费者模式
- 默认
1
秒试拉 1
次
MessagingMessageListenerAdapter
具体调用
测试 AOP 导出
static void setProxySavePath() throws Exception {
System.setProperty( "jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true" );
Path path = Paths.get( Consumer1MainApplication.class.getResource( "/" ).toURI() );
Path savePath = path.resolve( "../export/spring-aop-proxy" )
.normalize()
.toAbsolutePath();
Files.createDirectories( savePath );
System.out.println( "class 存放路径:" );
System.out.println( savePath );
System.out.println( "----------------------" );
// 设置将 cglib 生成的代理类字节码生成到指定位置
System.setProperty( DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, savePath.toString() );
}
最后
看源码的一些忠告
- 用 IDEA 看源码,查看被调用的地方比较方便
- 用 Eclipse 看被调用的点时,有时很坑