为什么只在主方法放在类的开头时才创建bean?

时间:2017-11-12 17:39:10

标签: java spring

我有一个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实例化中起作用?

0 个答案:

没有答案