##一、maven
1、maven地址
maven的仓库的定义是在${M2_HOME}/lib/maven-2.0.10-uber.jar 里面。你可以在里面找到\org\apache\maven\project\pom-4.0.0.xml 这个文件,在这个文件里面定义了默认中央仓库的地址,所以可以更改
2、maven配置文件
如果你想覆盖中央仓库的默认地址,那么这里我们就会使用的镜像了,还在setting. xml里面配置:
1 2 3 4 5 6 7 8 9 10
| <settings> <mirrors> <mirror> <id> maven-net-cn</id> <name> Maven China Mirror</name> <url> http://maven.net.cn/content/groups/public/</url> <mirrorOf> central</mirrorOf> </mirror> </mirrors> </settings>
|
central表示只为central仓库做镜像,如果想为所有的仓库做镜像那么可以改为:
*
##二、ImmutableSet、ImmutableMap
1、这个类是一个不可变的set/map/list,有of方法直接初始化。比如说
1 2 3
| private static final Set<String> DEFAULT_METHODS = ImmutableSet.of("findOne", "findAll", "findBy", "get", "list", "find");
|
1 2 3 4 5
| ImmutableMap<String, Integer> map = ImmutableMap.of( "1", 1, "2", 2, "3", 3 );
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| final ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder(); builder.put("LastValue", monitor.getLastValue()); builder.put("Hits", monitor.getHits()); builder.put("Avg", BigDecimal.valueOf(monitor.getAvg()).setScale(2, HALF_UP)); builder.put("Total", BigDecimal.valueOf(monitor.getTotal()).setScale(2, HALF_UP)); builder.put("Min", BigDecimal.valueOf(monitor.getMin()).setScale(2, HALF_UP)); builder.put("Max", BigDecimal.valueOf(monitor.getMax()).setScale(2, HALF_UP)); builder.put("Active", monitor.getActive()); builder.put("Avg Active", monitor.getAvgActive()); builder.put("Max Active", monitor.getMaxActive()); builder.put("First Access", monitor.getFirstAccess().toInstant()); builder.put("Last Access", monitor.getLastAccess().toInstant()); return Joiner.on(", ").withKeyValueSeparator("=").join(builder.build());
|
2、能用上面两个就不要用set、list了,这个特性用于存储一些不是实现知道的常量
##三、Supplier接口
1、这个类Java8新加入的一个功能性接口,可以返回一个对象的实例,也可以返回方法名称。可以理解成是一个对象工厂,每次调用返回一个给定类型的对象
实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Item { private String name; public Item(){ } public Item(String name){ this.name=name; } public static String getStaticVal(){ return "Static Val"; } public String getMsg(){ return "Hello World!"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
|
1 2 3 4 5 6 7
| public class SupplierReturnObject { public static void main(String[] args) { Supplier<Item> supplier = Item::new; Item item = supplier.get(); System.out.println(item.getMsg()); } }
|
我们会发现上面的输出就是hello world
继续测试:
1 2 3 4 5 6 7
| public class SupplierFetchMethod { public static void main(String[] args) { Supplier<String> supplier = Item::getStaticVal; String val = supplier.get(); System.out.println("Calling Method:"+val); } }
|
我们会发现上面的输出就是static val
##AOP
1、pointcut的理解
1 2
| <aop:pointcut id="repositoryPointcut" expression="execution(public * com.dzy..*.*(..)) and @within(org.springframework.stereotype.Repository)"/>
|
解析:第一个public表示修饰类型,任意公共方法执行都会切入,接下来的星号表示可以返回所有的类型,接下来是包,表示所有子包,所有的类,所有的方法。然后 (..)
这个所有的参数类型。如果是(*,String)
匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型
最后的一个within表示的是而且还要包含repository
注释的
值得注意的是:
1、controller里面不能用切入,就是pointcut不能写在切入上
如果非要的话,那么加 and @within(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))
根据说,是被代理了
2、aop实例
(1)、首先到配置文件中
1
| <aop:aspectj-autoproxy/>
|
(2)、编写代理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| package com.dzy.aop; @Aspect @Component public class ServiceAspect { * @author dengzhiyuan * @version ServiceAspect.java * @since 2.0 */ private static final Logger LOG = Logger.getLogger(ServiceAspect.class); @Pointcut("execution(* com.dzy.service.impl..*.*(..))") public void aspect() { } * 配置前置通知,使用在方法aspect()上注册的切入点 同时接受JoinPoint切入点对象,可以没有该参数 */ @Before("aspect()") public void before(JoinPoint joinPoint) { if (LOG.isInfoEnabled()) { LOG.info("before " + joinPoint); } System.out.println("切入时候前置通知"); } @After("aspect()") public void after(JoinPoint joinPoint) { if (LOG.isInfoEnabled()) { LOG.info("after " + joinPoint); } } @Around("aspect()") public Object around(JoinPoint joinPoint) { long start = System.currentTimeMillis(); Object returnValues=null; try { returnValues=((ProceedingJoinPoint) joinPoint).proceed(); long end = System.currentTimeMillis(); if (LOG.isInfoEnabled()) { LOG.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!"); } } catch (Throwable e) { long end = System.currentTimeMillis(); if (LOG.isInfoEnabled()) { LOG.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage()); } } LOG.info("------------------------"+returnValues); return returnValues; } @AfterReturning("aspect()") public void afterReturn(JoinPoint joinPoint) { if (LOG.isInfoEnabled()) { LOG.info("afterReturn " + joinPoint); } } @AfterThrowing(pointcut = "aspect()", throwing = "ex") public void afterThrow(JoinPoint joinPoint, Exception ex) { if (LOG.isInfoEnabled()) { LOG.info("afterThrow " + joinPoint + "\t" + ex.getMessage()); } } }
|
其实到这里我们已经完成了,跑一下看看。从这里看到我们切入的service层
2、注解方式
(1)、先自顶一个注解
1 2 3 4 5 6 7 8 9
| @Target(ElementType.METHOD) @Documented @Retention(RetentionPolicy.RUNTIME) public @interface NotEmpty { String[] value(); }
|
(2)、然后修改一下pointcut即可
1
| @Pointcut(value = "@annotation(com.dzy.validation.annotation.NotEmpty)")
|
(3)、测试即可成功
解压 tar zxvf 文件名.tar.gz
压缩 tar zcvf 文件名.tar.gz 目标名