Environment 的使用


date: 2019-06-21 11:35
status: draft
title: ‘Environment 的使用’

Environment 的使用有两种方式

  • 一种是通过@Autowired 的形式进行自动注入
  • 另一种是通过实现 EnvironmentAware 接口的方式进行实现
  1. 通过@Autowired 的形式进行注入
    官方网站的样例
package org.exam.config;
import org.exam.service.TestBeanFactoryPostProcessor;
import org.exam.service.UserServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import javax.annotation.Resource;
@Configuration
@ComponentScan(basePackages = {"org.exam.service"})
@PropertySource("classpath:config.properties")
public class AppConfigOld {
    @Resource
    private Environment env;
    @Bean
    public UserServiceImpl userService(){
        System.out.println(env);
        return new UserServiceImpl();
    }
    /*
    未加入这个BeanFactoryPostProcessor一切都很正常,一旦加入这个@Bean,env就变为null
    @Bean
    public TestBeanFactoryPostProcessor testBeanFactoryPostProcessor(){
        System.out.println(env);
        return new TestBeanFactoryPostProcessor();
    }
    */
}

产生这种现象的原因,根据测试的方式可以确定,在Spring整合mybatis的时候,BeanFactoryPostProcessor 这个bean比较早的被创建,这个时候的private Environment evn 还没有被赋值,而这个bean 有没有表明要依赖 evn 而创建,那么就传进一个null 变量,
首先,我想想到的是通过构造器或者set方法注入,但是这种想法被打断了,因为这个bean还会再注入,比较乱没有调通。
没有办法了,换成EnvironmentAware 接口的形式,调通了。
2. 通过实现EnvironmentAware 接口的形式实现

package org.exam.config;
import org.exam.service.TestBeanFactoryPostProcessor;
import org.exam.service.UserServiceImpl;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
@Configuration
@ComponentScan(basePackages = {"org.exam.service"})
@PropertySource("classpath:config.properties")
public class AppConfig implements EnvironmentAware {
    private Environment env;
    @Override
    public void setEnvironment(Environment environment) {
        this.env=environment;
    }
    @Bean
    public UserServiceImpl userService(){
        System.out.println(env);
        return new UserServiceImpl();
    }
    @Bean
    public TestBeanFactoryPostProcessor testBeanFactoryPostProcessor(){
        System.out.println(env);
        return new TestBeanFactoryPostProcessor();
    }
}

这种方式就避免了建立一个Environment 的ApplicationContext的方式,个人不推荐将其设置为ApplicationContext。

你可能感兴趣的:(程序设计成长之路)