需求
为部署到服务器的项目在启动时添加一个打印自定义信息的功能
相关的环境
spring
分析
1.服务器在启动时,打印一些重要的信息,意味着在整个项目的生命周期中只存在一次运行
2.这个自定义的信息必须是灵活的,所以采用.peoperties的方式配置,再用代码来读取打印
3.如果突然就不想要,想抽掉这个打印信息,这就必须设计时不能与其他业务相关的代码参在一起,应该独立设计
实现
一、加载本地配置文件
声明初始化PropertyPlaceholderConfigurerUtil,我们后续将用这个来读取.properties配置信息,如果已经实现了,可以直接跳到第四点
<bean id="springConfigurerUtil" class="myUtil.PropertyPlaceholderConfigurerUtil"> <property name="locations"> <list> <!-- 加载本地公用的配置文件 --> <value>classpath:*.properties</value> </list> </property> </bean>
二、实现PropertyPlaceholderConfigurerUtil和使用
继承PropertyPlaceholderConfigurer类,重写processProperties方法,读取配置文件的key和value
public class PropertyPlaceholderConfigurerUtil extends PropertyPlaceholderConfigurer { private static final Logger logger = LoggerFactory .getLogger(PropertyPlaceholderConfigurerUtil.class); private static Map<String, Object> ctxPropertiesMap; @Override protected void processProperties( ConfigurableListableBeanFactory beanFactory, Properties props) throws BeansException { super.processProperties(beanFactory, props); ctxPropertiesMap = new HashMap<String, Object>(); for (Object key : props.keySet()) { String keyStr = key.toString(); String value = props.getProperty(keyStr); ctxPropertiesMap.put(keyStr, value); } } public static Object getContextProperty(String name) { return ctxPropertiesMap.get(name); } }
由于我们在spring的配置文件中已经配置了该类可以扫描所有.properties文件,所以,只要使用这句代码就可以读取配置文件里key是context的value
PropertyPlaceholderConfigurerUtil.getContextProperty("context").toString()
三、资源信息配置文件
test.properties的内容
date = 20170101
context = Hello World...
如果要读取.pom中的信息,只需在test.properties中这样写
version = ${project.version}
testDate = ${versionDate}
.pom中必须存在标签version和testDate
... <version>11.1.6</version> <packaging>war</packaging> <name>test</name> <description>test</description> <parent> ... </parent> <properties> //时间格式 <maven.build.timestamp.format>yyyy-MM-dd</maven.build.timestamp.format> //打印部署的当前时间 <testDate>${maven.build.timestamp}</testDate> </properties> ...
四、自定义serverlet
继承HttpServlet,重写public void init(ServletConfig config)方法,在这里实现打印输出的业务
public class PrintInfoServerlet extends HttpServlet{ private static final long serialVersionUID = 2411736854665271958L; private static Logger logger = Logger.getLogger(VersionServerlet.class); @Override public void init(ServletConfig config) throws ServletException { logger.info(PropertyPlaceholderConfigurerUtil.getContextProperty("date").toString()); logger.info(PropertyPlaceholderConfigurerUtil.getContextProperty("context").toString()); logger.info(PropertyPlaceholderConfigurerUtil.getContextProperty("version").toString()); logger.info(PropertyPlaceholderConfigurerUtil.getContextProperty("testDate").toString()); } }
最后别忘了要在web.xml中配置
<servlet> <servlet-name>PrintInfoServerlet</servlet-name> <servlet-class> myServlet.printInfoServerlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
总结
这样实现的有点在于,如果不想要在启动时打印信息,只需将web.xml配置自定义serverlet注释即可,方便非开发人员维护