View Javadoc
1   /*
2   * Copyright 2020-2026 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.bremersee.spring.boot.autoconfigure.minio;
18  
19  import io.minio.MinioClient;
20  import okhttp3.HttpUrl;
21  import org.apache.commons.logging.Log;
22  import org.apache.commons.logging.LogFactory;
23  import org.bremersee.minio.MinioErrorHandler;
24  import org.bremersee.minio.MinioOperations;
25  import org.bremersee.minio.MinioTemplate;
26  import org.springframework.beans.factory.ObjectProvider;
27  import org.springframework.boot.autoconfigure.AutoConfiguration;
28  import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
29  import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
30  import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
31  import org.springframework.boot.context.event.ApplicationReadyEvent;
32  import org.springframework.boot.context.properties.EnableConfigurationProperties;
33  import org.springframework.context.annotation.Bean;
34  import org.springframework.context.event.EventListener;
35  import org.springframework.util.ClassUtils;
36  
37  /**
38   * The minio autoconfiguration.
39   *
40   * @author Christian Bremer
41   */
42  @AutoConfiguration
43  @ConditionalOnClass(name = {
44      "io.minio.MinioClient",
45      "org.bremersee.minio.MinioTemplate"
46  })
47  @ConditionalOnProperty(
48      prefix = "bremersee.minio",
49      name = {"url", "access-key", "secret-key"})
50  @EnableConfigurationProperties(MinioProperties.class)
51  public class MinioAutoConfiguration {
52  
53    private static final Log log = LogFactory.getLog(MinioAutoConfiguration.class);
54  
55    private final MinioProperties properties;
56  
57    /**
58     * Instantiates a new minio autoconfiguration.
59     *
60     * @param properties the properties
61     */
62    public MinioAutoConfiguration(MinioProperties properties) {
63      this.properties = properties;
64    }
65  
66    /**
67     * Init.
68     */
69    @EventListener(ApplicationReadyEvent.class)
70    public void init() {
71      log.info(String.format("""
72              
73              *********************************************************************************
74              * %s
75              *********************************************************************************
76              * properties = %s
77              *********************************************************************************""",
78          ClassUtils.getUserClass(getClass()).getSimpleName(),
79          properties));
80    }
81  
82    /**
83     * Creates minio client.
84     *
85     * @return the minio client
86     */
87    @ConditionalOnMissingBean
88    @Bean
89    public MinioClient minioClient() {
90  
91      log.info("Creating MinioClient ...");
92      MinioClient minioClient = MinioClient.builder()
93          .credentials(properties.getAccessKey(), properties.getSecretKey())
94          .endpoint(HttpUrl.get(properties.getUrl()))
95          .build();
96      minioClient.setTimeout(
97          properties.getConnectTimeout().toMillis(),
98          properties.getWriteTimeout().toMillis(),
99          properties.getReadTimeout().toMillis()
100     );
101     return minioClient;
102   }
103 
104   /**
105    * Creates minio template.
106    *
107    * @param minioClient the minio client
108    * @param errorHandlerProvider the error handler provider
109    * @return the minio template
110    */
111   @ConditionalOnMissingBean(MinioOperations.class)
112   @Bean
113   public MinioTemplate minioTemplate(
114       MinioClient minioClient,
115       ObjectProvider<MinioErrorHandler> errorHandlerProvider) {
116 
117     log.info("Creating MinioTemplate ...");
118     MinioTemplate minioTemplate = new MinioTemplate(minioClient);
119     minioTemplate.setErrorHandler(errorHandlerProvider.getIfAvailable());
120     return minioTemplate;
121   }
122 
123 }