前言:考虑到Spring的强大是尽人皆知的,所以能用就不必造轮子了,只需要改造即可。
1、web中如何控制ApplicationContext
在spring框架整合下,自己写的代码中要使用ApplicationContext是不方便的,但是在org.springframework.web.context.support.WebApplicationContextUtils 中有一方法 getWebApplicationContext
(
ServletContext sc)
可以得到ApplicationContext引用;但此方法有一参数ServletContext,它是Servlet容器提供的上下文,所以非Servlet环境下是得不到的。
我们可以定义一个servlet,该servlet配置为被容器第一个加载,它可以得到ServletContext,从而得到ApplicationContext的引用
import org.springframework.context.ApplicationContext; public class SpringBeanProxy { private static ApplicationContext applicationContext; public synchronized static void setApplicationContext(ApplicationContext arg) { applicationContext = arg; } public static Object getBean(String beanName){ return applicationContext.getBean(beanName); } }
import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.springframework.web.context.support.WebApplicationContextUtils; import SpringBeanProxy; public class SpringBeanInitServlet extends HttpServlet { public void init(ServletConfig arg) throws ServletException { SpringBeanProxy.setApplicationContext(WebApplicationContextUtils.getWebApplicationContext(arg.getServletContext())); } }
在web.xml中配置如下,即可
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>SpringBeanInitServlet</servlet-name> <servlet-class> SpringBeanInitServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
由于listener先于servlet加载,所以可以确保SpringBeanInitServlet加载时spring已经初始化好了,如果你使用的是servlet加载spring就要注意调整这两个servlet的启动顺序了。代码中使用 SpringBeanProxy.getBean("bean name")即可得到bean实例。
还有其他方式,如
从指定目录加载: ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml"); 从classpath路径加载: ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml")
2、web中如何控制基于ApplicationContext的配置文件读取信息值
关于程序中加载spring,自定义类实现spring 配置文件中通配符${jdbc.name}类似的正确解析;但是代码里如何使用读取到的配置文件呢?读源码 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 以及向上找父类和接口会发现,配置都定义好了,只是 protected Properties[] localProperties;
是继承使用,没法调用。
于是就只定义啦,配置如下:
<bean id="propertyConfigurer" class="com.jd.app.server.util.AutoPorpertiesConfigurer"> <property name="locations"> <list> <value>classpath:XXX.properties</value> </list> </property> <property name="propValueController" ref="genePropValueController"/> <property name="fileEncoding" value="GBK" /> </bean>
具体定制如下:
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * Created by on 2016/7/14. */ public class AutoPorpertiesConfigurer extends PropertyPlaceholderConfigurer { private static Map<String,Object> ctxPropertiesMap; private PropValueController propValueController; private PropValueController defaultPropValueController = new DefaultPropValueController(); @Override protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException { super.processProperties(beanFactoryToProcess, props); ctxPropertiesMap = new HashMap<String,Object>(); if (propValueController==null) propValueController = defaultPropValueController; long index=0; for (Object key : props.keySet()) { String keyStr = key.toString(); Object value = propValueController.transform(index,keyStr,props.getProperty(keyStr)); ctxPropertiesMap.put(keyStr, value); index++; } } public static Object getContextProperty(String name) { return ctxPropertiesMap.get(name); } public void setPropValueController(PropValueController propValueController) { this.propValueController = propValueController; } } /** * 配置值转化处理 */ interface PropValueController{ public Object transform(long index, String key, String value) throws BeansException; } /** * 配置默认返回原string */ class DefaultPropValueController implements PropValueController{ @Override public Object transform(long index, String key, String value) throws BeansException { return value; }
此类即完成了PropertyPlaceholderConfigurer的任务,同时又提供了上下文properties访问的功能;于是在Spring配置文件中把PropertyPlaceholderConfigurer改成AutoPorpertiesConfigurer 。 PropValueController 接口可以为以后方便定制属性文件值转换灵活使用;
定义使用即可:
String gene = (String) propertyConfigurer.getContextProperty(cateid);
其实,通过
ServletContext servletContext = servlet.getServletContext(); WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
也能获取上下文并取得配置,但是如上定义更直接明了,简单易使用。
相关推荐
Spring Boot支持使用YAML(或Properties)文件进行配置,并提供了`@ConfigurationProperties`注解来绑定配置值。虽然通常这个注解用于Spring管理的Bean,但也可以在非Spring管理的类中使用,只要确保配置的加载和...
### Java 类文件通过 $ 获取 properties 文件的属性值 在Java开发中,经常需要读取配置文件中的信息,例如数据库连接信息、系统环境变量等。这些配置通常存储在`.properties`文件中,便于维护和管理。本文将详细...
Spring的ResourceBundleMessageSource类将ResourceBundle与Spring的IoC容器集成,使得我们可以方便地从ApplicationContext中获取不同语言的字符串。配置ResourceBundleMessageSource可以通过XML或注解两种方式。XML...
加载Properties文件后,我们就可以在其他bean的配置中引用这些属性值。假设我们有一个数据源bean,其配置如下: ```xml class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${db.driver...
在Spring框架中,`applicationContext.xml`是核心的配置文件,它定义了应用上下文,即Spring容器,用来管理所有bean的创建、初始化、依赖注入以及生命周期。这个文件使用XML语法,遵循特定的命名空间和schema,以...
`propertyConfigurer`则告诉Spring使用解密器来处理配置文件中的加密属性。 最后,关于`junfeng`这个文件,它可能是作者在文章中提到的一种特定的加密方式或者一个工具的名称。由于没有具体的文件内容,这里无法给...
- Spring Expression Language (SpEL)在XML配置中同样适用,可用于动态计算属性值或在bean定义中进行条件判断。 8. **Profile特定的配置**: - XML配置也可以根据Spring的profile特性进行分段,通过`profile`属性...
配置文件存储在Git仓库中,客户端可以通过API动态获取配置。 这些方法各有优缺点,适用于不同的场景。选择哪种方法取决于你的项目需求,例如是否使用Spring框架、是否需要动态配置以及项目的规模等。理解并灵活运用...
为了使Spring能够自动识别这个后处理器,通常需要将其配置为一个普通的bean,并且需要使用`ApplicationContext`作为容器,因为`BeanFactory`无法自动识别BeanFactoryPostProcessor。 #### 四、内置的容器后处理器 ...
5. **获取属性值** 一旦属性被加载,我们可以通过键来获取对应的值: ```java String dbUrl = props.getProperty("database.url"); String username = props.getProperty("username"); String password = ...
在Spring框架中,Bean的生命周期管理和ApplicationContext的应用是两个核心概念,它们对于理解Spring如何管理和协调应用中的对象至关重要。本文将深入探讨这两个主题,并结合国际化(i18n)和事件传递来阐述它们在...
上述配置完成后,Spring会自动根据`jdbc.properties`中的属性值创建一个`DataSource`实例。这个数据源可以被Spring的其他组件,如`JdbcTemplate`或`JPA`,用来执行SQL查询和操作数据库。 通过这种方式,我们实现了...
而`placeholder`允许你使用`${property_name}`占位符,这些值可以从属性文件(如`application.properties`)中读取,这样可以在不修改XML配置的情况下轻松更改配置。 例如,你可以在配置文件中定义一个profile: `...
在Spring框架中,动态加载配置文件是一项重要的...总的来说,Spring动态加载配置文件涉及到IoC容器、属性源、配置加载策略和刷新机制等多个方面。理解和掌握这些知识点,可以帮助我们构建更加灵活和适应性强的应用。
Spring bean是存储在Spring IoC容器中的Java对象,可以通过容器来配置和管理。 18、spring提供了哪些配置方式? Spring提供了以下配置方式: - 基于XML的配置 - 基于注解的配置 - 基于Java类的配置 19、spring支持...
Spring Expression Language (SpEL)可以在配置文件中使用,允许在属性值中引用其他属性。例如: ```properties server.port=${random.int[1024,65535]} ``` 这里,`server.port`的值将是一个1024到65535之间的...
它还提供了命令行参数、环境变量和配置服务器等多种方式来动态获取配置。 总的来说,理解Spring MVC如何读取和使用配置文件对于构建高效、可维护的Web应用至关重要。熟练掌握配置文件的读取、bean的定义以及环境...
首先,`applicationContext.xml` 是 Spring 容器的配置文件,它定义了容器中 Bean 的实例化、装配和管理规则。在 Spring 3.1 中,XML 配置仍然是主流,尽管有基于注解的配置方式逐渐流行。Bean 的定义通常包括 ID...
它负责初始化Spring的ApplicationContext,并加载`src/main/resources/application.properties`或`application.yml`中的配置。`run()`方法是启动应用的主要入口。 4. **Actuator**:Spring Boot Actuator提供了多种...
4. **属性注入**:`@Value`注解允许注入基本类型的值或者从properties文件中读取的值。 5. **生命周期方法**:`@PostConstruct`和`@PreDestroy`注解分别标识初始化方法和销毁方法,Spring会在bean创建后和销毁前...