- 
                Notifications
    
You must be signed in to change notification settings  - Fork 38.8k
 
Open
Labels
status: waiting-for-triageAn issue we've not yet triaged or decided onAn issue we've not yet triaged or decided on
Description
spring version: 6.2.10
two circular reference:
@Component
@Order(1)
public class TestA {
    @Autowired
    private TestB testB;
    private String name;
// get and set
    public String hello () {
        return "hello A" + this.getName();
    }
    public String otherName () {
        return testB.getName();
    }
}
@Component
@Order(1)
public class TestB {
    @Autowired
    private TestA testA;
    private String name;
// get and set
    public String hello () {
        return "hello B" + this.getName();
    }
    public String otherName () {
        return testA.getName();
    }
}postprocessor:
@Component
public class BugPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (TestA.class.isAssignableFrom(bean.getClass())) {
            System.out.println("Modifying TestA bean before initialization");
            return new TestA(); // use another object to replace it
        }
        if (TestB.class.isAssignableFrom(bean.getClass())) {
            System.out.println("Modifying TestB bean before initialization");
            return new TestB(); // use another object to replace it
        }
        return bean; // return original bean
    }
}AOP:
@Aspect
@Component
public class AOPConfig {
    @Pointcut("execution(* com.voidvvv.issue.service.*.*(..))" )
    public void pointCut() {}
    @Before("pointCut()")
    public void before() {
        System.out.println("AOP before");
    }
}controller
@RestController
@Lazy
@RequestMapping("/test")
public class TestController {
    @Autowired
    private TestA testA;
    @Autowired
    private TestB testB;
    @GetMapping("/show")
    public String show() {
        StringBuilder sb = new StringBuilder();
        sb.append("show TestA: " + testA.hello() + "\t\n");
        sb.append(System.lineSeparator());
        sb.append("show TestB: " + testB.hello() + "\t");
        sb.append(System.lineSeparator());
        sb.append("show TestB in TestA: " + testA.otherName() + "\t");
        sb.append(System.lineSeparator());
        sb.append("show TestA in TestB: " + testB.otherName() + "\t");
        sb.append(System.lineSeparator());
        return sb.toString();
    }
}confiuration:
spring.main.allow-circular-references=trueexception:
we can successfully start up the application. then we request : http://localhost:8080/test/show, we will get a NPE in TestA, the TestB object in TestA is null.
expectation:
we need get an error when we start up the application since we have illegal beans in our application.
minimal demo:
https://github.com/voidvvv/spring_bean_issue
I use springboot 3.5.5 in this demo to represent this issue.
Metadata
Metadata
Assignees
Labels
status: waiting-for-triageAn issue we've not yet triaged or decided onAn issue we've not yet triaged or decided on