• 添加项目在启动时打印自定义信息的功能


    需求

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

    相关的环境

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

  • 相关阅读:
    【题解】NOIP2016换教室
    【题解】平面最近点对(加强版)
    [atcoder002E] Candy Piles [博弈论]
    [AGC002D] Stamp Rally [并查集+整体二分]
    [ACG001E] BBQ hard [dp]
    [BJOI2006][bzoj1001] 狼抓兔子 [最小割]
    [usaco jan 09] 安全路径 travel [最短路径树]
    [usaco jan 09] 气象牛 baric [dp]
    [poj1741] tree [点分治]
    [NOI2009] 植物大战僵尸 [网络流]
  • 原文地址:https://www.cnblogs.com/maixiaodou/p/7412334.html
Copyright © 2020-2023  润新知