我有一个spring应用程序,其入口点如下:
@SpringBootApplication
@EnableAutoConfiguration(exclude = { HypermediaAutoConfiguration.class })
public class Application {
@Bean(name = "firstApi")
private static RestApiProxy getFirstApi(@Value("${midtier.host}") String host,
@Value("${midtier.port}") int port) {
String baseURI = "/cesmidtier/api";
return new FirstApi("http", host, port, baseURI, new RequestContextHolder());
}
@Bean(name = "secondApi")
private static RestApiProxy getSecondApi(@Value("${yodlee.host}") String host,
@Value("${yodlee.port}") int port, @Value("${yodlee.baseURI}") String baseURI,
@Value("${proxy}") String proxyURI) {
return new SecondApi("https", host, port, baseURI, proxyURI);
}
@Bean(name = "thirdApi")
private static RestApiProxy getThirdApi(@Value("${amexopen.host}") String host,
@Value("${amexopen.port}") int port, @Value("${proxy}") String proxyURI) {
return new ThirdApi("https", host, port, "/", proxyURI);
}
@Bean
@Profile("Test-Mocked")
public CommonsRequestLoggingFilter logger() {
CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
filter.setIncludeQueryString(true);
filter.setIncludePayload(true);
filter.setMaxPayloadLength(5120);
return filter;
}
@Bean
@Autowired
@ConditionalOnProperty(name = "security.enabled", havingValue = "true")
public AuthorizeHelper authorizeHelper(final ProfileService profileService, final JWTHandler jwtHandler,
final APIGatewayHandler apiGatewayHandler,
@Value("${security.permittedClientServices}") String[] permittedClientServices) {
System.out.println("######################################### 111111111111 ");
return new DefaultAuthorizeHelper(profileService, jwtHandler, apiGatewayHandler, permittedClientServices);
}
@Bean
@ConditionalOnProperty(name = "security.enabled", havingValue = "false")
public AuthorizeHelper authorizeHelper() {
System.out.println("######################################### 2222222222222 ");
return new NullAuthorizeHelper();
}
public static void main(String[] args) {
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
SpringApplication.run(Application.class, args);
}
}
正如您所看到的,该类有两个名称相似的方法:
(i)使用参数authorizeHelper(...)
(ii)authorizeHelper()不带参数
当我使用security = false启动应用程序时,一切都按预期工作(应用程序进入第二个authorizeHelper方法,没有参数的方法)。
问题: 但是,当我使用security = true启动应用程序时,应用程序不会创建预期的bean(它不会进入第一个authorizeHelper方法,即带参数的方法)。
解决方案我发现:
1.如果我以不同的方式命名两种方法,那么这个问题就会消失。
2.如果我将main方法放在类的开头(而不是类的末尾)那么问题也会消失!
问题 当authorizeHelper方法具有相同的名称时,为什么main方法的位置似乎在bean实例化中起作用?