maven相关

##一、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/> <!--打开aop自动代理-->

(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);
// 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
//第一个代表返回任意类型,第二个代表controller下面所有,第三个表示所有方法
@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("切入时候前置通知");
}
// 配置后置通知,使用在方法aspect()上注册的切入点
@After("aspect()")
public void after(JoinPoint joinPoint) {
if (LOG.isInfoEnabled()) {
LOG.info("after " + joinPoint);
}
}
// 配置环绕通知,使用在方法aspect()上注册的切入点
@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());
}
}
//这个value就是我们方法执行之后的返回值
LOG.info("------------------------"+returnValues);
return returnValues;
}
// 配置后置返回通知,使用在方法aspect()上注册的切入点
@AfterReturning("aspect()")
public void afterReturn(JoinPoint joinPoint) {
if (LOG.isInfoEnabled()) {
LOG.info("afterReturn " + joinPoint);
}
}
// 配置抛出异常后通知,使用在方法aspect()上注册的切入点
@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)
// 这个注解表示notEmpty应该放在方法上面
public @interface NotEmpty {
// 这个注解,参数是string数组
String[] value();
}

(2)、然后修改一下pointcut即可

1
@Pointcut(value = "@annotation(com.dzy.validation.annotation.NotEmpty)")

(3)、测试即可成功
解压 tar zxvf 文件名.tar.gz
压缩 tar zcvf 文件名.tar.gz 目标名

Share