Spring-让你彻底搞懂Spring如何解决循环依赖?3

简介: Spring-让你彻底搞懂Spring如何解决循环依赖?3

三、AOP依赖注入


修改MyConfig


package com.woniu;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@ComponentScan(value = {"com.woniu"})
@EnableAspectJAutoProxy
@Configuration
public class MyConfig {
}
复制代码


创建MyAop类


import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class MyAop {
    //用来定义切入点表达式的方法,方法名就是切入点表达式的名称
    @Pointcut("execution(* com.woniu.service..*.*(..))")
    public void pt1(){ }
    @Before("pt1()")
    public void Before() throws Throwable {
        System.out.println("before aop...");
    }
}
复制代码


Eservice


package com.woniu.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Eservice {
    @Autowired
    private Fservice fservice;
}
复制代码


Fservice


package com.woniu.service;
import org.springframework.stereotype.Component;
@Component
public class Fservice {
    public void print(){
        System.out.println("fservice");
    }
}
复制代码


启动类


package com.woniu;
import com.woniu.service.*;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    }
}


image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png


此时fservice的原生bean已经实例已经创建完成,initializeBean这个方法将会做初始化,在这里,将会给fservice生成一个代理对象


image.png

image.png


这个BeanPostProcessor会为Fservice生成代理对象,并且放置在二级缓存


image.png

earlyProxyReferences可以帮助判断是否已经生成过代理对象,wrapIfNecessary这个方法就是生成代理对象的方法


image.png

image.png


创建代理工厂

image.png

image.png

image.png

image.png


fservice的代理对象已经被创建出来


image.png

image.png

image.png

initializeBean方法调用完毕,Fservicve代理对象创建完毕


image.png

image.png

image.png

image.png

image.png


此时的一级缓存如下

image.png

image.png

image.png


至此Eservice对象的initializeBean方法执行完毕,fservice的代理对象已经被注入到eservice中


image.png

image.png


四、循环依赖


  1. 非单例V.S非单例


  1. 单例构造函数V.S单例构造函数


  1. 单例构造函数V.S单例普通依赖注入


  1. 单例普通依赖注入V.S单例普通依赖注入


  1. AOP单例普通依赖注入V.SAOP单例普通依赖注入****



五、相关代码


相关代码





相关文章
|
1天前
|
人工智能 Java Spring
Spring Boot循环依赖的症状和解决方案
Spring Boot循环依赖的症状和解决方案
|
1天前
|
缓存 Java 开发工具
【spring】如何解决循环依赖
【spring】如何解决循环依赖
13 0
|
1天前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
24 0
|
1天前
|
存储 缓存 Java
【spring】06 循环依赖的分析与解决
【spring】06 循环依赖的分析与解决
9 1
|
1天前
|
存储 缓存 Java
Spring解决循环依赖
Spring解决循环依赖
|
1天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
56 0
|
1天前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
138 0
|
1天前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
46 2
|
1天前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
|
1天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置