
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明1.修改pom.xml,在 <build><plugins></plugins></build> 里面添加 <!-- SVN版本号 --> <plugin> <groupId>com.google.code.maven-svn-revision-number-plugin</groupId> <artifactId>maven-svn-revision-number-plugin</artifactId> <version>1.7</version> <configuration> <verbose>true</verbose> <entries> <entry> <prefix>svn</prefix> </entry> </entries> </configuration> <executions> <execution> <id>revision</id> <phase>validate</phase> <goals> <goal>revision</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.tmatesoft.svnkit</groupId> <artifactId>svnkit</artifactId> <version>1.8.5</version> </dependency> </dependencies> </plugin> <!--打包时间--> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>timestamp-property</id> <goals> <goal>timestamp-property</goal> </goals> <configuration> <name>build.time</name> <pattern>yyyyMMddHHmmss</pattern> <locale>zh_CN</locale> <timeZone>Asia/Shanghai</timeZone> </configuration> </execution> </executions> </plugin> 2.打包项目名,在 <build></build> 里面添加 <finalName>${project.artifactId}-${project.version}.${svn.revision}-${build.time}</finalName>
Mock依赖:SpringBoot依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <artifactId>spring-test</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.1.RELEASE</version> <scope>test</scope> </dependency> SpringMvc依赖: <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.8.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> Mock对象 DemoDao demoDao = mock(DemoDao.class); 对象注入到bean ReflectionTestUtils.setField(demoBean, "demoDao", demoDao); mock的对象只对demoBean有效,其他地方用到了demoDao,需要重新注入(ReflectionTestUtils.setField(demoBean2, "demoDao", demoDao);) MockBean @Service public class DemoServiceMock { @MockBean protected DemoService demoService; /** * mock调用方法 */ public void mockPInstanceNull(String param) { when(demoService.demoTest(ArgumentMatchers.eq(param))).thenReturn("demoTestString"); } } 注意:1.DemoServiceMock 不能被继承,否则会报错 @MockBeanprotected DemoService demoService; 不能在其他地方声明,否则报错3.尽量使用eq()方法,慎用any**()方法
代码package com.spring.demo.jettyServer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.webapp.WebAppContext; import org.springframework.web.context.support.XmlWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; public class JettyServer { private static String dir = JettyServer.class.getClassLoader().getResource("").getPath(); public static void main(String[] args) { Server server = new Server(8090);// 创建jetty web容器 server.setStopAtShutdown(true);// 在退出程序是关闭服务 System.out.println("dir:"+dir); // 创建连接器,每个连接器都是由IP地址和端口号组成,连接到连接器的连接将会被jetty处理 // Connector connector = new ServerConnector(server);// 创建一个连接器 // server.addConnector(connector);// 添加连接 // QueuedThreadPool threadPool = new QueuedThreadPool(); // threadPool.setMaxThreads(3000); // 配置服务 WebAppContext context = new WebAppContext();// 创建服务上下文 context.setContextPath("/");// 访问服务路径 http://{ip}:{port}/ context.setConfigurationDiscovered(true); context.setResourceBase(dir);// 指定服务的资源根路径,配置文件的相对路径与服务根路径有关 server.setHandler(context);// 添加处理try { XmlWebApplicationContext originalContext = new XmlWebApplicationContext(); originalContext.setConfigLocation("application-context.xml"); DispatcherServlet dispatcherServlet = new DispatcherServlet(originalContext); ServletHolder servletHolder = new ServletHolder(dispatcherServlet); //添加servlet,第一是具体的servlet,后面是请求的别名,在http请求中的路径 context.addServlet(servletHolder,"/*"); try { server.start(); server.join(); } catch (Exception e) { e.printStackTrace(); } } } 依赖 <!-- https://mvnrepository.com/artifact/org.eclipse.jetty.aggregate/jetty-all --><dependency><groupId>org.eclipse.jetty.aggregate</groupId><artifactId>jetty-all</artifactId><version>9.4.2.v20170220</version><type>pom</type></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-webapp</artifactId><version>9.4.2.v20170220</version></dependency><!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server --><!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server --><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-servlet</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-deploy</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-xml</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-security</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-client</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-annotations</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-util</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-io</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-http</artifactId><version>9.4.2.v20170220</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-continuation</artifactId><version>9.4.2.v20170220</version></dependency> <dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.2.RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.0.2.RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.5.3</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.5</version></dependency><!-- logback+slf4j --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version><type>jar</type></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version><type>jar</type> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.42</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.45</version></dependency>
package com.spring.demo.utils; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { @Override protected String convertProperty(String propertyName, String propertyValue) { //如果在加密属性名单中发现该属性 if (isEncryptProp(propertyName)) { String decryptValue =AesUtils.decrypt(propertyValue,AesUtils.key); System.out.println(decryptValue); return decryptValue; }else { return propertyValue; } } private boolean isEncryptProp(String propertyName) { if (propertyName.startsWith("encrypt")){ return true; } return false; } public void setLocation(Resource location) { String locationStr = location.toString(); if (locationStr == null || locationStr.equals("")){ return; } int start = locationStr.indexOf("["); int end = locationStr.indexOf("]"); if (start < 0 || end < 0 || end <= start+1){ return; } String locStr = locationStr.substring(start+1,end); String[] paths = locStr.split(","); List<Resource> list = new ArrayList<>(); for (int i = 0; i < paths.length; i++) { String loc = paths[i]; if (loc == null || loc.equals("")){ continue; } ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //将加载多个绝对匹配的所有Resource //然后进行遍历模式匹配 try { Resource[] resources=resolver.getResources(loc); list.addAll(Arrays.asList(resources)); } catch (IOException e) { continue; } } this.setLocations(list.toArray(new Resource[list.size()])); } } <bean id="decryptPropertyPlaceholderConfigurer" class="com.spring.demo.utils.DecryptPropertyPlaceholderConfigurer" p:location="classpath*:*.properties,classpath*:loc/*.properties"> </bean>
spring <context:property-placeholder local-override="true" properties-ref="dataSourceProperties" file-encoding="UTF-8" location="classpath:loc/config.properties" ignore-resource-not-found="true" /> 3.1以前property-placeholder使用的是org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; 支持 protected String convertProperty(String propertyName, String propertyValue) } 不支持通配符 因此如下,重写convertProperty进行加解密,重写setLocation使其支持通配符*加载配置文件 application-context.xml加入 <bean id="decryptPropertyPlaceholderConfigurer" class="com.spring.demo.utils.DecryptPropertyPlaceholderConfigurer" p:location="classpath*:*.properties,classpath*:loc/*.properties"> </bean>