SpringBoot使用@PostConstruct注解导入配置方式
目录
- 使用@PostConstruct注解导入配置
- 使用@PostConstruct注解,完成静态对象注入
- 为什么static对象不可直接使用@Autowired注入?
- @PostConstruct和@PreDestroy
使用@PostConstruct注解导入配置
通过@PostConstruct注解能够通过一种更友好的方式将配置进行导入
代码如下:
/** * 引导类 * * @author zhangzhixiang * @date 2018/09/18 14:51:39 */ @Configuration public class BootstrapConsts { @Value("${file.client.type}") private String fileClientType; @Value("${file.oss.endPoint}") private String endPoint; @Value("${file.oss.accessKeyId}") private String accessKeyId; @Value("${file.oss.accessKeySecret}") private String accessKeySecret; @Value("${file.oss.bucketName}") private String bucketName; @Value("${file.oss.rootDir}") private String rootDir; /** * 文件客户端类型 */ public static String file_client_type; /** * OSS地址(不同服务器,地址不同) */ public static String end_point; /** * OSS键id(去OSS控制台获取) */ public static String access_key_id; /** * OSS秘钥(去OSS控制台获取) */ public static String access_key_secret; /** * OSS桶名称(这个是自己创建bucket时候的命名) */ public static String bucket_name; /** * OSS根目录 */ public static String root_dir; @PostConstruct private void initial() { file_client_type = fileClientType; end_point = endPoint; access_key_id = accessKeyId; access_key_secret = accessKeySecret; bucket_name = bucketName; root_dir = rootDir; } }
使用@PostConstruct注解,完成静态对象注入
为什么static对象不可直接使用@Autowired注入?
Spring/SpringBoot正常情况下不能支持注入静态属性(会报空指针异常)。主要原因在于:Spring的依赖注入实际上是使用Object.Set()进行注入的,Spring是基于对象层面的依赖注入,而静态属性/静态变量实际上是属于类的。
@PostConstruct和@PreDestroy
@PostConstruct
为JavaEE5规范开始后Servlet中新增@PostConstruct和@PreDestroy被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。@PostConstruct 在构造函数之后执行,init()方法之前执行。@PreDestroy()
方法在destroy()方法之后执行
执行顺序:Constructor >> @Autowired >> @PostConstruct
使用示例
package com.sijing.codeRecord.httpUtil; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import com.alibaba.fastjson.JSONObject; @Component public class HttpStaticUtil { @Autowired RestTemplate restTemplate; private static RestTemplate staticRestTemplate; @SuppressWarnings("static-access") @PostConstruct public void staticVarAssignment() { this.staticRestTemplate = restTemplate; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static void Post() { HttpEntity requestEntity = null; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.valueOf("application/json")); requestEntity = new HttpEntity(String.format(""), headers); JSONObject response = staticRestTemplate.postForObject("http://www.baidu.com", requestEntity, JSONObject.class); System.out.println(response); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
赞 (0)