Java spring IOC限定符和自动连线的奇怪行为

Java spring IOC限定符和自动连线的奇怪行为,java,spring,autowired,qualifiers,Java,Spring,Autowired,Qualifiers,我已经在两个autowired et bean方法上指定了限定符 那么我错过了什么 @Configuration @EnableWebSecurity public class CustomSecurityCOnfig { @Bean @Qualifier("entryPoint") AuthenticationEntryPoint loginUrlAuthenticationEntryPoint() { return new LoginUrlAuth

我已经在两个autowired et bean方法上指定了限定符

那么我错过了什么

@Configuration
@EnableWebSecurity
public class CustomSecurityCOnfig  {

    @Bean
    @Qualifier("entryPoint")
    AuthenticationEntryPoint loginUrlAuthenticationEntryPoint() {
        return new LoginUrlAuthenticationEntryPoint("/login");
    }

}
我用这种方式自动连接字段

@Autowired
    @Qualifier("entryPoint")
    private AuthenticationEntryPoint loginUrlAuthenticationEntryPoint;
错误跟踪:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.core.env.Environment' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1716) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1272) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1226) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
编辑 我有另一个
AuthenticationEntryPoint
接口的实现:

@Component
public class CustomAuthenticationEntryPoint extends BasicAuthenticationEntryPoint

但在我看来,这并不能解释错误(只要我指定限定符)

您混合了bean名称和限定符

@Bean(name="someFancyBean")
public ClassXyx fooBar(){
    return new ClassXyz()
}
在本例中,方法
fooBar
创建类型为
ClassXyx
的bean,并将其命名为
someFancyBean
。如果你想自动连接这个bean,那么你必须使用

@Service
class SomeFancyService{
  @Autowired @Qualifier("someFancyBean") ClassXyx xyz;
}
配置类可以创建相同类型的多个bean,但它们的名称是从函数名派生的。除非您想重命名该Bean,否则将
Bean
注释与
name=“XYZ”
一起使用是没有意义的

限定符
注释用于引用相同类型的bean之一

现在回到你的代码

@Configuration
@EnableWebSecurity
public class CustomSecurityCOnfig  {

    @Bean
    public AuthenticationEntryPoint entryPoint() {
        return new LoginUrlAuthenticationEntryPoint("/login");
    }

}
在您的服务中,您必须自动连接为

@Autowired
@Qualifier("entryPoint")
private AuthenticationEntryPoint loginUrlAuthenticationEntryPoint;
此外,我还想指出一点,即跨包/类的bean可访问性

通常,SpringIOC创建的所有bean都是公共的,但它具有与Java类相同的访问修饰符。如果您正在创建一个具有包范围的bean,那么您不能在另一个包中自动连接。类似地,如果一个bean是使用private创建的,那么该bean只能在该类中自动连接