• eclipse-搭建maven的war项目集合spring注解方式


    工具:eclipse 4.4.2 版本号:20150219-0600

    jdk:1.7

    1.下图创建maven工程,然后next

    下图选择工程保存位置(这里选择默认),next

    下图选择webapp项目(war包,mvaen默认选择的quickstart一般为jar工程),next

    下图,其中

    group ID:一般设置起点报名,随便定义

    artifact ID:项目名称

    Version:版本号名称

    package:初始化类文件名称

    其他暂不填finish

    项目新建完成

    结构

    2.接下来到需要的jar

    jdk=修改成官方的1.7,finish

    还有

    解下来下面两个版本号不太好改,直接在eclipse中改好像改 不了

    所以需要到项目下面去改文件

    打开项目地址

    例如:c:workspaceTestMaven.settings下面

    找到文件org.eclipse.wst.common.project.facet.core.xml

    原文件内容

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <faceted-project>
      <fixed facet="wst.jsdt.web"/>
      <installed facet="java" version="1.5"/>
      <installed facet="jst.web" version="2.3"/>
      <installed facet="wst.jsdt.web" version="1.0"/>
    </faceted-project>
    复制代码

    修改其中的jst.web和java为对应的版本

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <faceted-project>
      <fixed facet="wst.jsdt.web"/>
      <installed facet="java" version="1.7"/>
      <installed facet="jst.web" version="3.0"/>
      <installed facet="wst.jsdt.web" version="1.0"/>
    </faceted-project>
    复制代码

    保存

    到这么一个正常的maven  web项目搭建好了

    3.接下来引入spring

    在pom.xml中引入相关配置文件

    复制代码
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com</groupId>
        <artifactId>TestMaven</artifactId>
        <packaging>war</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>TestMaven Maven Webapp</name>
        <url>http://maven.apache.org</url>
        <dependencies>
            <!-- 工具类 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.8</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.4</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.2</version>
            </dependency>
            <dependency>
                <groupId>commons-httpclient</groupId>
                <artifactId>commons-httpclient</artifactId>
                <version>3.1</version>
            </dependency>
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>1.3</version>
            </dependency>
            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>1.8.0</version>
            </dependency>
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>2.5</version>
            </dependency>
            <!-- 框架类 -->
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.20</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>3.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>3.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>3.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.7.4</version>
            </dependency>
    
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>4.2.2.Final</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-c3p0</artifactId>
                <version>4.2.2.Final</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-ehcache</artifactId>
                <version>4.2.2.Final</version>
            </dependency>
            <!-- mysql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.0.7</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>3.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.6.1</version>
            </dependency>
            
            <dependency>
                <groupId>net.sf.json-lib</groupId>
                <artifactId>json-lib</artifactId>
                <version>2.4</version>
                <classifier>jdk15</classifier>
            </dependency>
            
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
                <scope>provided</scope>
            </dependency>
    
        </dependencies>
        <build>
            <finalName>TestMaven</finalName>
        </build>
    </project>
    复制代码

    开始加入spring机制

    首先在web.xml加载spring

    复制代码
    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    
        <context-param>
            <param-name>log4jConfigLocation</param-name>
            <param-value>classpath:prop/log4j.properties</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        </listener>
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath*:xml/spring-context.xml
            </param-value>
        </context-param>
        <!--spring监听器的配置,用于在启动Web容器时,自动装配ApplicationContext的配置信息 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!-- spring mvc servlet -->
        <servlet>
            <servlet-name>spring-mvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath*:xml/spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>spring-mvc</servlet-name>
            <url-pattern>/web/*</url-pattern>
        </servlet-mapping>
        <!-- 配置session存在时间 -->
        <session-config>
            <session-timeout>60</session-timeout>
        </session-config>
        <welcome-file-list>
            <welcome-file>/index.jsp</welcome-file>
        </welcome-file-list>
    
    </web-app>
    复制代码

    spring配置文件(这里将配置文件设定到指定位置)

    目录结构

    其中,三个在web.xml中配置的基础文件

    log4j.properties(配置网上有详细介绍)

    复制代码
    log4j.rootLogger=INFO,DAY_ROLLING_FILE,stdout
    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #log4j.appender.stdout.layout.ConversionPattern=%-d{HH:mm:ss} %-5p [%c{1}] %M (line:%L) %m%n
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c:%L] - %m%n
    
    log4j.logger.org.hibernate.type=INFO
    log4j.logger.java.sql=DEBUG
    log4j.logger.org.hibernate=ERROR
    log4j.logger.org.springframework=ERROR
    log4j.logger.net.sf=ERROR
    log4j.logger.org.quartz=ERROR
    
    
    ########################
    # Rolling File
    ########################
    log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
    log4j.appender.ROLLING_FILE.Threshold=DEBUG
    log4j.appender.ROLLING_FILE.File=broker.log
    log4j.appender.ROLLING_FILE.Append=true
    log4j.appender.ROLLING_FILE.MaxFileSize=10240KB
    log4j.appender.ROLLING_FILE.MaxBackupIndex=20
    log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.ROLLING_FILE.layout.ConversionPattern=[%d %t %c] %m%n
    
    ########################
    # Daily Rolling File u65E5u5FD7u8F93u51FAu5230u6587u4EF6uFF0C${catalina.home}u53EFu4EE5u7528u5176u4ED6u8DEFu5F84u4EE3u66FF
    ########################
    log4j.appender.DAY_ROLLING_FILE=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.DAY_ROLLING_FILE.File=${catalina.home}/logs/tsportal
    #websphere 
    ##log4j.appender.DAY_ROLLING_FILE.File=${SERVER_LOG_ROOT}/logs/xbrl_bank
    log4j.appender.DAY_ROLLING_FILE.DatePattern='_'yyyy-MM-dd'.log'
    log4j.appender.DAY_ROLLING_FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.DAY_ROLLING_FILE.layout.ConversionPattern=%d{HH:mm:ss} %-5p [%C] (%F:%L) - %m%n
    复制代码

    spring-mvc.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
        <context:component-scan base-package="com.*.web" />(http请求ctrl控制器,后面访问后提ctrl用到)
        
        <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> 
         <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="defaultEncoding" value="utf-8" />
               <!-- 
               <property name="maxUploadSize" value="10485760000" />
               <property name="maxInMemorySize" value="40960" />
                -->
         </bean>
        
        <!-- 配置action中返回的视图配置 -->
        <bean
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
            <property name="suffix" value=".ftl"></property>
            <property name="viewClass"
                value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
            <property name="contentType" value="text/html;charset=utf-8" />
            <property name="requestContextAttribute" value="rc"/>
            <property name="exposeRequestAttributes" value="true" />
            <property name="exposeSessionAttributes" value="true" />
            <property name="exposeSpringMacroHelpers" value="true" />
        </bean>
        <bean id="freemarkerConfigurer"
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
            <property name="templateLoaderPath">
                <value>/</value>
            </property>
            <property name="freemarkerSettings">  
                <props>  
                    <prop key="defaultEncoding">UTF-8</prop>  
                </props>  
            </property>  
        </bean>
        
    </beans>
    复制代码

    spring-context.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-autowire="byName" default-lazy-init="true">
        <import resource="spring-hibernate.xml"/> 
        <import resource="spring-component.xml"/> 
    </beans>
    复制代码

    中期配置的文件有

    spring-component.xml(配置交给spring管理的文件夹)

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:task="http://www.springframework.org/schema/task"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
        <context:component-scan base-package="com.test.*" />
        <task:annotation-driven />
    </beans>
    复制代码

    spring-hibernate.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans default-autowire="byName"
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context" 
        xsi:schemaLocation=" 
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
        <bean id="propertyConfigure" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:prop/jdbc.properties</value>
                </list>
            </property>
        </bean>
        
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="${hibernate.connection.driver_class}"/>
            <property name="jdbcUrl" value="${hibernate.connection.url}"/>
            <property name="user" value="${hibernate.connection.username}"/>
            <property name="password" value="${hibernate.connection.password}"/>
            <property name="minPoolSize" value="1"/>
            <!-- 达到最大连接数后可以增加的连接个数  -->
            <property name="acquireIncrement" value="2"/>
            <property name="maxPoolSize" value="3"/>
            <!-- 最大闲置时间 秒 -->
            <property name="maxIdleTime" value="600"/>
            <property name="maxStatements" value="100"/>
            <!-- 闲置的连接测试周期 秒 -->
            <property name="idleConnectionTestPeriod" value="1200"/>
        </bean>
        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="packagesToScan" value="com.*.*.model" />(hibernate注解使用的存放model文件夹)
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                    <!--
                    <prop key="hibernate.hbm2ddl.auto">true</prop> 
                    <prop key="hibernate.hbm2ddl.auto">create</prop>
                      -->
                    <prop key="hibernate.max_fetch_depth">1</prop>
                    <prop key="hibernate.jdbc.fetch_size">50</prop>
                    <prop key="hibernate.jdbc.batch_size">20</prop>
                    <prop key="hibernate.jdbc.use_scrollable_resultset">false</prop>
                    <prop key="hibernate.use_outer_join">true</prop>
                    <prop key="hibernate.show_sql">false</prop>
                    <prop key="current_session_context_class">thread</prop>  
                    <prop key="hibernate.format_sql">true</prop>
                    <prop key="hibernate.cache.use_query_cache">true</prop>
                    <prop key="hibernate.connection.pool_size">20</prop>
                    <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
                    <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
                </props>
            </property>
        </bean>
        
        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        
        <bean id="cacheManager"
            class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
            <property name="configLocation">
                <value>
                    classpath:xml/ehcache.xml
                </value>
            </property>
        </bean>
        <!-- 声明式事务管理begin -->
        <aop:config>         
            <aop:advisor pointcut="execution(* com.*.service.impl..*ServiceImpl.*(..))" advice-ref="txAdvice"/>
            <aop:advisor pointcut="execution(* com.*.*.service.impl..*ServiceImpl.*(..))" advice-ref="txAdvice"/>
        </aop:config>
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="find*" read-only="true"/>
                <tx:method name="get*" read-only="true"/>
                <tx:method name="load*" read-only="true"/>
                <tx:method name="query*" read-only="true"/>
                <tx:method name="*" rollback-for="Exception"/>
            </tx:attributes>
        </tx:advice>
        <!-- 声明式事务管理end -->
    </beans>
    复制代码

    其中文件

    jdbc.properties

    复制代码
    #mysql
    hibernate.dialect=org.hibernate.dialect.MySQLDialect
    hibernate.connection.url=jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
    hibernate.connection.driver_class=com.mysql.jdbc.Driver
    hibernate.connection.username=root
    hibernate.connection.password=数据库密码
     
    复制代码

     和ehcache.xml(缓存文件记录)

    复制代码
    <ehcache>
    
        <!-- Sets the path to the directory where cache .data files are created.
    
                 If the path is a Java System Property it is replaced by
                 its value in the running VM.
    
                 The following properties are translated:
                 user.home - User's home directory
                 user.dir - User's current working directory
                 java.io.tmpdir - Default temp file path -->
        <diskStore path="user.dir"/>
    
    
        <!--Default Cache configuration. These will applied to caches programmatically created through
                the CacheManager.
    
                The following attributes are required:
    
                maxElementsInMemory            - Sets the maximum number of objects that will be created in memory
                eternal                        - Sets whether elements are eternal. If eternal,  timeouts are ignored and the
                                                 element is never expired.
                overflowToDisk                 - Sets whether elements can overflow to disk when the in-memory cache
                                                 has reached the maxInMemory limit.
    
                The following attributes are optional:
                timeToIdleSeconds              - Sets the time to idle for an element before it expires.
                                                 i.e. The maximum amount of time between accesses before an element expires
                                                 Is only used if the element is not eternal.
                                                 Optional attribute. A value of 0 means that an Element can idle for infinity.
                                                 The default value is 0.
                timeToLiveSeconds              - Sets the time to live for an element before it expires.
                                                 i.e. The maximum time between creation time and when an element expires.
                                                 Is only used if the element is not eternal.
                                                 Optional attribute. A value of 0 means that and Element can live for infinity.
                                                 The default value is 0.
                diskPersistent                 - Whether the disk store persists between restarts of the Virtual Machine.
                                                 The default value is false.
                diskExpiryThreadIntervalSeconds- The number of seconds between runs of the disk expiry thread. The default value
                                                 is 120 seconds.
                -->
    
        <defaultCache
                maxElementsInMemory="10000"
                eternal="false"
                overflowToDisk="false"
                timeToIdleSeconds="0"
                timeToLiveSeconds="0"/>
    
        <!-- security cache-->
        <cache name="userCache"
               maxElementsInMemory="10000"
               eternal="true"
               overflowToDisk="false"/>
    
        <!-- security cache-->
        <cache name="resourceCache"
               maxElementsInMemory="10000"
               eternal="true"
               overflowToDisk="false"/>
        <!-- dict cache-->
        <cache name="dictCache"
               maxElementsInMemory="10000"
               eternal="true"
               overflowToDisk="false"/>
    
        <!-- See http://ehcache.sourceforge.net/documentation/#mozTocId258426 for how to configure caching for your objects -->
    </ehcache>
    复制代码

    新建测试类

    TestCtrl内容,其中包名在spring-mvc.xml中配置spring注入机制

    复制代码
    package com.test.web;
    
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    
    @Controller
    @RequestMapping("test")
    public class TestCtrl {
    
        @RequestMapping("index")
        public void index(HttpServletRequest req, HttpServletResponse res){
            System.out.println("coming.....");
            try {
                res.getWriter().append("you request success.");
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
    
    }
    复制代码

    放入tomcat

    启动

    网站访问

    http://localhost:8080/TestMaven/web/test/index

    后台打印

    测试service是否有注入(service注入也需要提前将需要交个spring管理的报名通知给spring,想通知在spring-component中配置)

    创建TestService

    TestService

    package com.test.service;
    
    public interface TestService {
    
    }

    TestServiceImpl

    复制代码
    package com.test.service.impl;
    
    import org.springframework.stereotype.Service;
    
    import com.test.service.TestService;
    
    @Service("testService")
    public class TestServiceImpl implements TestService {
    
    }
    复制代码

    TestCtrl注入Service

    复制代码
    package com.test.web;
    
    import java.io.IOException;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.test.service.TestService;
    
    
    @Controller
    @RequestMapping("test")
    public class TestCtrl {
        @Resource
        private TestService testService;
    
        @RequestMapping("index")
        public void index(HttpServletRequest req, HttpServletResponse res){
            System.out.println("coming....."+testService);
            try {
                res.getWriter().append("you request success.");
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
    
    }
    复制代码

    重新启动,访问地址http://localhost:8080/TestMaven/web/test/index

    后台打印

    到此,整个项目基本完成

    后期在对项目进行spring权限控制等,另开文章,尽请期待

    知识只有共享才能传播,才能推崇出新的知识,才能学到更多,这里写的每一篇文字/博客,基本都是从网上查询了一下资料然后记录下来,也有些是原滋原味搬了过来,也有时加了一些自己的想法
  • 相关阅读:
    关于代码片段
    感谢visual studio(git插件)救我一命
    SRX一些配置命令
    .NET Core Policy和Claim
    .NET Core Identity 用户管理和策略
    .NET Core基础配置、注册服务、中间件、ViewComponent、DbContext
    table非常细边框
    js数字转大写金额
    蓝牙开发
    Laravel artisan 命令
  • 原文地址:https://www.cnblogs.com/jay36/p/7762416.html
Copyright © 2020-2023  润新知