date: 2019-06-21 11:35
status: draft
title: ‘Environment 的使用’
Environment 的使用有两种方式
- 一种是通过@Autowired 的形式进行自动注入
- 另一种是通过实现 EnvironmentAware 接口的方式进行实现
- 通过@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。