知识点②:springboot 注入 / 静态注入

springboot 注入 / 静态注入

  1. 参数配置:application.properties
sc.crm.upDirPath=
  1. 注入:

spring boot 的任意组件都能使用,这里声明了一个简单组件 @Component,该注解通常用来定义一些需要配置的常量或者用于注入的工具类,而不用手动去 new 了

@Component
public class CrmProperties {

    @Value("${sc.crm.upDirPath}")
    private String uploadPath;

    public String getUploadPath() {
        return uploadPath;
    }

    public void setUploadPath(String uploadPath) {
        this.uploadPath = uploadPath;
    }

}
  1. 使用:直接注入
@Service
public class CustomerServiceImpl implements CustomerService {

    @Autowired
    private CrmProperties crmProperties;

    //也可以定义为属性/字段直接使用
    @Value("${sc.crm.upDirPath}")
    private String uploadPath;

}
  1. 静态注入:

4.1. 实现 spring 的一个获取上下文的工具类

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Spring工具类,获取Spring上下文对象等
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringContextUtil.applicationContext == null){
            SpringContextUtil.applicationContext  = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    public static  T getBean(Class clazz){
        return getApplicationContext().getBean(clazz);
    }

    public static  T getBean(String name,Class clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}

4.2. 静态注入:

public final class UpDownLoadUtil {

    private static String uploadPath ;
    //通过静态代码块,给变量赋值
    static{
        CrmProperties crmProperties = SpringContextUtil.getBean(CrmProperties.class);
        uploadPath = crmProperties.getUploadPath();
    }

    //将构造方法私有化,所有静态工具只能通过静态调用
    private UpDownLoadUtil(){
        throw new AssertionError();
    }

    public static void testUtil(){
        systom.out.println(uploadPath);
    }

}

到这里,就可以在静态方法中正常使用该配置常量了

=============== 分割线 ===============

==注意:典型错误示例,这样写虽然不会报错,但是根据类的加载机制,这里不能正确的获取到想要的参数,最后输出只有null,切记==
“`
//错误的使用方法
@Value(“${sc.gp.url.db}”)
private static String url_DB;
@PostMapping(“/rest1”)
public static void test1() {
String s = url_DB;
System.out.println(s);
}

你可能感兴趣的:(spring,boot)