小提莫来报到
美好的事情值得等待

需求

  为部署到服务器的项目在启动时添加一个打印自定义信息的功能

相关的环境

  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注释即可,方便非开发人员维护

posted on 2017-08-22 17:13  小提莫来报到  阅读(561)  评论(0编辑  收藏  举报