Java 如何调试spring依赖项顺序?
在这个问题背后,我想了解和调试Springbean是如何实例化的(以什么顺序)以及依赖关系是如何解析的 上下文 我正在使用:Java 如何调试spring依赖项顺序?,java,spring,spring-security,spring-boot,Java,Spring,Spring Security,Spring Boot,在这个问题背后,我想了解和调试Springbean是如何实例化的(以什么顺序)以及依赖关系是如何解析的 上下文 我正在使用: 弹簧靴 春季安全 spring数据JPA 我在DAO安全性注释中添加了如下内容: @PreAuthorize("hasRole('ROLE_ADMIN') OR hasPermission(#entity, 'save')") <S extends T> S save(S s); 显然,自动连线bean不依赖于具有安全注释的DAO 如果我运行main方法
- 弹簧靴
- 春季安全
- spring数据JPA
@PreAuthorize("hasRole('ROLE_ADMIN') OR hasPermission(#entity, 'save')")
<S extends T> S save(S s);
显然,自动连线bean不依赖于具有安全注释的DAO
如果我运行main方法(使用springboot),不管它是编译的jar还是在我的IDE中,它都可以正常工作。但在某些情况下(例如junit测试),我会遇到以下异常:
java.lang.IllegalStateException: Cannot apply org.springframework.security.config.annotation.authentication.configurers.userdetails.DaoAuthenticationConfigurer@362b384c to already built object
我假设在Spring创建和配置我的安全配置之前,调用了AuthenticationManagerBuilder.build()方法。但是为什么呢?WebSecurityConfigureAdapter的顺序设置为100,应该在执行其他操作之前完成
问题:
我如何理解为什么Spring在配置之前创建其他bean(DAO和服务)?如何检查配置服务与服务/dao之间是否没有依赖关系?
谢谢,将在实例化该配置类后立即调用
@Autowired
方法(该方法将由web容器启动时创建的安全筛选器触发)。这很早,但对于您的用例来说还不够早,因为您需要首先使用AuthenticationManagerBuilder
。我建议您使用globalaauthenticationconfigureradapter
(即一个新的bean),就像在Spring引导示例中一样(Spring Security将在更早的时候查找该类型的bean)。这就行了!但是为什么WebSecurityConfigureAdapter是在GlobalAuthenticationConfigurerAdapter之后实例化的(有时是在一些基本服务之后)?Spring Security控制全局身份验证与web安全的顺序(我想是全局关注)。早期创建的任何其他内容通常是因为其他早期内容之一需要它(例如作为@Autowired
依赖项)。好的。但是,如果它是一个依赖项,那么无论上下文如何(junit、depoyed等等),它都不会工作。事实上,它在某些情况下起作用。有没有办法让Spring显示它是如何计算依赖关系树的?我知道一些像intelliJ这样的工具可以做到这一点,但它没有向我显示不需要的依赖性。我想要的是真正的Spring树。你可以打开调试日志来查看创建的bean。顺序可能取决于环境(例如,嵌入式servlet容器强制提前创建过滤器)。
java.lang.IllegalStateException: Cannot apply org.springframework.security.config.annotation.authentication.configurers.userdetails.DaoAuthenticationConfigurer@362b384c to already built object