当前位置: 首页 > news >正文

wordpress怎么做商城网站厦门u 网站建设

wordpress怎么做商城网站,厦门u 网站建设,毕业设计代做网站 知乎,access 网站源码spring通过Environment对象来存储上下文环境变量信息,即包含当前系统环境变量也包含配置文件配置变量。Environment作为一个bean被存放在容器中,可以在需要的地方进行依赖注入直接使用。 Environment的创建 以AnnotationConfigApplicationContext容器类…

spring通过Environment对象来存储上下文环境变量信息,即包含当前系统环境变量也包含配置文件配置变量。Environment作为一个bean被存放在容器中,可以在需要的地方进行依赖注入直接使用。

Environment的创建

以AnnotationConfigApplicationContext容器类来看,在其构造函数总会初始化reader = new AnnotatedBeanDefinitionReader(this);然后会调用重载构造函数AnnotatedBeanDefinitionReader(registry, getOrCreateEnvironment(registry)),最后通过getEnvironment获取environment。

AbstractApplicationContext#getEnvironment

public ConfigurableEnvironment getEnvironment() {if (this.environment == null) {this.environment = createEnvironment();}return this.environment;
}protected ConfigurableEnvironment createEnvironment() {return new StandardEnvironment();}

这里最后看到创建了一个StandardEnvironment类型的实例。

Environment放入容器

在使用中,可以直接通过注解注入的方式将environment注入直接使用,如下:

@Autowired
private Environment env;

那么environment什么时候装载到容器中,成为一个bean的呢?

这里还要回到容器初始化的Refresh方法,在初始化扫描到的bean前,会调用prepareBeanFactory()方法。

AbstractApplicationContext#prepareBeanFactory

//...
// Register default environment beans.
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
}

这一步发生在所有的bean实例化之前,beanFactory.registerSingleton方法会将当前对象放到容器单例池里。也就是单例bean。可以说上面几个bean是最早一批bean。这里看到有environment、systemProperties、systemEnvironment和applicationStartup。

属性文件加载

在上一篇文章中介绍@Configuration时候可以通过@PropertySource进行属性配置文件的引入,引入的配置文件最终会放入environment中,可以通过environment对象获取属性文件内容。

如下:

    @Autowiredprivate Environment env;@PostConstructpublic void init(){log.info("property name:{}",env.getProperty("name"));}

那么配置文件是怎么被存放到environment中的呢?在上面一步将environment放入spring容器的一步,所有的bean都还未实例化,@PropertySource也未初始化,这时候还未加载自定义引入的properties配置文件。

还是上一篇文章说的,容器会引入ConfigurationClassPostProcessor类来解析处理@Configuration注解,该类

不仅是一个bean定义后置处理器,还继承了EnvironmentAware接口。这样当ConfigurationClassPostProcessor在被容器实例化的时候,initializeBean()方法会调用invokeAwareInterfaces方法,这里会调到setEnvironment方法将容器的environment传递给当前ConfigurationClassPostProcessor。这样ConfigurationClassPostProcessor就拥有了容器的environment。

ApplicationContextAwareProcessor#invokeAwareInterfaces

private void invokeAwareInterfaces(Object bean) {if (bean instanceof EnvironmentAware) {((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());}//...
}

下一步在ApplicationContextAwareProcessor中会使用ConfigurationClassParser类进行@PropertySource的解析,将解析到的property追加到environment的propertySources中。

具体逻辑在ConfigurationClassParser#addPropertySource()中。

最后来看下environment内部存储结构吧:

{//存储Profileprivate final Set<String> activeProfiles = new LinkedHashSet<>();private final Set<String> defaultProfiles = new LinkedHashSet<>(getReservedDefaultProfiles());//内部使用List<PropertySource<?>> propertySourceList来存储多个PropertySourceprivate final MutablePropertySources propertySources;private final ConfigurablePropertyResolver propertyResolver;
}

Profile怎么理解呢,可以理成剖面,环境。举例说明就好理解了。

bean可以通过@Profile进行修饰,例如在数据源datasources初始化时候可以指定不同的Profile。

@Profile("dev")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource getDuridSource(){return new DruidDataSource();
}
@Profile("sit")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource getDuridSource(){return new DruidDataSource();
}

如果一个bean被@Profile修饰,则只有当只有@Profile指定的值在activeProfiles之内,bean才会被加载。

profile的取值设定在

AbstractEnvironment#doGetActiveProfiles

protected Set<String> doGetActiveProfiles() {synchronized (this.activeProfiles) {if (this.activeProfiles.isEmpty()) {String profiles = doGetActiveProfilesProperty();if (StringUtils.hasText(profiles)) {setActiveProfiles(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(profiles)));}}return this.activeProfiles;}
}protected String doGetActiveProfilesProperty() {return getProperty(ACTIVE_PROFILES_PROPERTY_NAME);}

这里ACTIVE_PROFILES_PROPERTY_NAME = “spring.profiles.active"。可以在启动时候通过-Dspring.profiles.active=xx来指定,也可以配置到properties文件中。都可以解析的到。

http://www.yayakq.cn/news/426540/

相关文章:

  • 上饶有哪些做网站的店团员注册网站
  • 哪个网站做推销产品网站建设公司广告标题语
  • 没网站做cpa广告联盟wordpress简洁博客模板
  • 君隆做网站怎么样国内做市场调查专业网站
  • 免费网站服务器域名劳务派遣和外包一样吗
  • 大庆做流产油城女子网站怎样进入医院公众号
  • 电子商务网站排名西安招聘网最新招聘
  • c 新手一个人做网站wordpress更换帝国
  • wordpress更改主站点2345网址导航官网下载大全
  • 沈阳市和平区网站建设外贸建设网站公司哪家好
  • 如何创建一个网站的流程知晓小程序商店
  • 如何建立一个免费网站软文广告例子
  • 北京市丰台区建设部官方网站中国临海建设规划局网站
  • iis7配置asp网站聚化网网站
  • 做设计做网站浅谈国内高校英文网站的建设现状
  • 做旅游产品的网站有哪些无极网站招聘信息
  • 西安做网站的云阔建筑招工人在哪个网站比较好找
  • 开源程序网站软件工程课程设计课程网站建设
  • 电子商务网站建设方案推荐纯静态网站怎么做
  • 推广业务网站建设邓亚萍近况 做网站败光20亿
  • 网站多长时间到期wordpress 食品
  • 如何推广自己网站的关键词拿自己爱人做网站
  • 网站建设指导免费的电脑编程软件
  • 网站推广公司新锐cos wordpress
  • 国外市场网站推广公司中国建设造价信息网站
  • 河源市建设厅网站html代码怎么写
  • 网站服务器一年多少钱企业如何注册网站
  • 怎样网站设计wordpress启用多站点
  • 连云港建设局电力网站建设龙卡e付卡网站
  • 厦门做网站培训北京网站