分类: Spring

Spring MVC Interceptor 实现性能监控

利用Spring MVC 的 Interceptor 实现个简易的性能监控,计算一下每个url的执行时间。在 preHandle 方法中记录当前的时间戳到线程局部变量里,然后在afterCompletion方法中,用当前的时间戳剪掉线程局部变量里的时间戳得出个运行时间,并记录到log里。这只是个简易的性能监控,如果想长期正式的监控性能,请选择其它成熟的产品。Interceptor1234567891011121314151617181920212223242526272829303132333435363738import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.NamedThreadLocal;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class PerformanceInterceptor implements HandlerInterceptor { private final static Logger LOGGER = LoggerFactory.getLogger(PerformanceInterceptor.class); private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("performance"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { startTimeThreadLocal.set(System.currentTimeMillis()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { return; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long currentTime = System.currentTimeMillis(); long executeTime = currentTime - startTimeThreadLocal.get(); LOGGER.info("uri:{} 执行了 {} 毫秒", request.getRequestURI(), executeTime); }}

Spring IOC 的 alias 正确用法

Spring IOC 的 alias 有些人甚至都没听过,即使听过,也未必知道它真正的用途。定义 Bean 的时候,id 必须是唯一的,要保证在整个IOC容器内的唯一性,name 可以重复,并且可以指定多个,用逗号分隔。获取bean的时候用 id 或 name都可以。示例:1applicationContext.getBean("defaultMessageService", MessageService.class);很多人对 alias 的了解仅限于此,下面说一下它真正的用途。例如有一个工程A,代码如下1234567public interface MessageService { void send(); void send(String content);}

Spring IOC 容器启动时候初始化sql脚本Spring Boot版

之前没用 Spring Boot 的时候用 jdbc:script 标签设置初始化 sql 脚本,如下1234<jdbc:initialize-database data-source="dataSource" enabled="true" ignore-failures="NONE"> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/prod-data.sql" /> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/dev-data.sql" /></jdbc:initialize-database>

Spring IOC 容器启动时候初始化sql脚本

先说一下背景,项目中每个人都承担了一些模块的开发工作,而这些模块之间耦合性又比较大。例如,A的功能需要从B和C的模块获取数据。因此我们设计了一个数据导入功能,每个人开发完自己的功能模块后,把测试用的数据写入sql脚本,这样其他人更新了代码后,执行导入就可以用别人的模块了。配置如下,测试环境使用h2数据库并在IOC容器启动的时候初始化一些数据1234567<beans profile="test"> <context:property-placeholder location="classpath:config-global.properties,classpath:config-env-test.properties" file-encoding="UTF-8" /> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/prod-data.sql" /> <jdbc:script execution="INIT" encoding="utf-8" location="classpath:sql/dev-data.sql" /> </jdbc:embedded-database></beans>

Spring 动态读取属性文件中的内容

如题,有时候我们想动态的根据参数获取属性文件里的内容,而不是通过注入的方式。具体如下:school1024.properties12site.url=http://www.school1024.comsite.title=\u7A0B\u5E8F\u5458\u7B14\u8BB0site.title的中文是程序员笔记spring-properties.xml123456<util:properties id="cfg" location="classpath:school1024.properties" /><bean id="cfg2" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:school1024.properties" /> <property name="fileEncoding" value="UTF-8" /></bean>测试类如下:

SpringMVC 引用Jar中的 jQuery、BootStrap 和 Font Awesome

无意中在Maven公服中发现bootstrap经被打包到jar中了。http://mvnrepository.com/artifact/org.webjars/bootstrap123456789101112131415<dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>1.11.1</version></dependency><dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>3.3.5</version></dependency><dependency> <groupId>org.webjars</groupId> <artifactId>font-awesome</artifactId> <version>4.6.3</version></dependency>

获取 Spring ApplicationContext

总有一些类不在Spring容器的控制范围内,又想用其中的bean。上一次遇到场景是在项目中定义Hibernate拦截器。这次是在 HttpSessionListener 中保存数据到DB。在Web中获取ServletContext 中 ApplicationContext1ApplicationContext ac = WebApplicationContextUtils.getRequiredW