Annotation介紹
Annotation是java中的一個(gè)注解,可以在sourceCode、Class、RUNTIME階段,根據(jù)Annotation來(lái)干預(yù)代碼的執(zhí)行,包括生成代碼。我們?nèi)粘V信龅降腀override 以及在Spring中碰到很多注解的使用。所以對(duì)注解的理解方便我們對(duì)整體架構(gòu)的了解。
Annotation的例子
下面我們來(lái)下一個(gè)在運(yùn)行時(shí)才會(huì)生效的Annotation。
定義一個(gè)annotation
package com.example.springbootdemo.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author admin
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogTestAnnotation {
}
定義對(duì)應(yīng)的注解處理器
package com.example.springbootdemo.ascept;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAnnotationAscept {
@Pointcut("@annotation(com.example.springbootdemo.annotation.LogTestAnnotation)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
//執(zhí)行方法
Object result = point.proceed();
//執(zhí)行時(shí)長(zhǎng)(毫秒)
long time = System.currentTimeMillis() - beginTime;
//保存日志
System.out.println("cost : " + time);
return result;
}
}
這個(gè)注解解析器有點(diǎn)奇怪,其實(shí)并沒有針對(duì)注解做太多的事情,而且作為aop切入點(diǎn)的注解
注解的使用
package com.example.springbootdemo.bean;
import com.example.springbootdemo.annotation.LogTestAnnotation;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
@Service("aBean")
public class A {
@LogTestAnnotation
public int add(int a, int b) {
return a + b;
}
}
入口測(cè)試
package com.example.springbootdemo;
import com.example.springbootdemo.bean.A;
import org.springframework.beans.BeansException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import javax.swing.*;
@SpringBootApplication
@Component
public class SpringbootdemoApplication implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
SpringbootdemoApplication instance = new SpringbootdemoApplication();
System.out.println(instance.getApplicationContext());
A a = (A)applicationContext.getBean("aBean");
System.out.println(a.add(1 , 2));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringbootdemoApplication.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
}