Spring: Solve the circular dependency problem in the form of constructor method through @Lazy

1. Define 2 circularly dependent classes

package cn.edu.tju.domain2;

import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

@Component
public class A  {
    private final B b;

    public B getB() {
        return b;
    }


    @Lazy
    public A(B b){
        this.b = b;
        //System.out.println(b);
    }
}

package cn.edu.tju.domain2;

import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

@Component
public class B {
    private final A a;

    public A getA() {
        return a;
    }



    @Lazy
    public B(A a){
        this.a =a;
        //System.out.println(a);
    }
}

2. Define the configuration file (spring09.xml):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="cn.edu.tju.domain2"/>



</beans>

3. Define the test class:

package cn.edu.tju;


import cn.edu.tju.domain.Husband;

import cn.edu.tju.domain2.A;
import cn.edu.tju.domain2.B;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.sql.SQLException;

public class Test09 {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("spring09.xml");

         A a = ctx.getBean("a", A.class);
         B b = ctx.getBean("b", B.class);

        System.out.println(a.getClass().getName());
        System.out.println(a.getB().getA() == a);
        System.out.println(a.getB().getClass().getName());
        System.out.println(b.getA().getClass().getName());


    }
}

4. Execution results:

Insert image description here

Guess you like

Origin blog.csdn.net/amadeus_liu2/article/details/133563030