美文网首页
java注解学习笔记

java注解学习笔记

作者: crossyf | 来源:发表于2019-07-11 15:23 被阅读0次

注解的定义

官方定义:Java注解用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。

代码演示

@Target({ElementType.PARAMETER, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented 
public @interface TestAnnotation {
    String value() default "aaa";
    String message() default "message";
}

注解的定义使用@interface的关键字,其中修饰注解的叫做元注解元注解是可以注解到注解上的注解,或者说是一种基本的注解,但是他能够应用到其他的注解上面。

元注解

元注解一共有五种类型@Documented@Target@Inherited@Retention@Repeatable

@Documented: 作用是能够将注解中的元素包含到javadoc中去。

@Target:定义注解运用的地方。
1.ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
2.ElementType.PARAMETER 可以给一个方法内的参数进行注解
3.ElementType.METHOD 可以给方法进行注解
4.ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
5.ElementType.PACKAGE 可以给包进行注解
6.ElementType.LOCAL_VARIABLE 可以给一个局部变量进行注解
7. ElementType.FIELD 可以给属性注解
8. ElementType.CONSTRUCTOR 可以给构造方法进行注解

@Inherited:继承,如果对A类进行了注解,并且该注解被@Inherited注解,当B类继承A类时,B类也会继承A类的注解。

@Retention:注解的保留期,即存活时间。有三个取值
1.RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时他讲被丢弃忽视
2.RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,会被加载进入到JVM中,在运行时可以获取到他们
3.RetentionPolicy.CLASS 注解客以保留到编译进行的时候,不会被加载到JVM中

@Repeatable:它表示一个注解可以有多个取值。

属性

在上面的例子中注解的内部有两个属性valuemessage,并且有默认值,在使用注解的时候可以不用赋值

@TestAnnotation(value="test",message="testmessage")
public void test() {

}

或者

@TestAnnotation()
public void test() {

}

用法

java注解的使用场景很多,这里我用一下公司项目中所用到的日志功能举一个例子。
定义注解

/**
 * 日志注解类
 * @author crossyf
 *
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented 
public @interface  LogRecord {
    String actionType() default "默认动作类型";
    String bussinessLogic() default "默认业务逻辑";
}

使用注解

 @RequestMapping("/index")
 @LogRecord(actionType = "系统", bussinessLogic = "进入系统首页")
 public String index(ModelMap modelMap, HttpServletRequest request) {
        Integer identityType = UserContext.getUserContext().getUserInfo().getIdentityType();
        modelMap.put("identityType", identityType);
        String upId = UserContext.getUserContext().getUserId();
        logger.info("------------index---------------" + upId);
        return "index";
    }

说明:这里在打开系统首页的方法中使用注解
解析注解

/**
 * 日志管理
 *
 * @author shuny
 */
@Component
public class OperationLogInteceptor extends HandlerInterceptorAdapter {
    @Autowired
    LogService logService;

    @Override
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView)
            throws Exception {
        //操作日志
        if (handler instanceof HandlerMethod) {
            HandlerMethod hm = (HandlerMethod) handler;
            //获取注解的实例
            LogRecord logRecord = hm.getMethodAnnotation(LogRecord.class);

            if (logRecord != null) {
  
                UserContext userContext =
                        (UserContext) request.getSession().getAttribute(IController.USER_CONTEXT);
                if (userContext != null) {
                    String actionType = logRecord.actionType();
                    String bussinessLogic = logRecord.bussinessLogic();
                    Log log = new Log();
                    log.setCreateTime(new Date());
                    log.setModule(actionType);
                    String userid = UserContext.getUserContext().getUserId();
                    String userName = UserContext.getUserContext().getLoginName();
                    log.setUserId(userid);
                    log.setUserName(userName);
                    log.setOperation(bussinessLogic);
                    log.setIp(LoggerUtil.getCliectIp(request));
                    log.setContent(request.getQueryString() == null ? "" :
                            request.getQueryString().toString());
                    logService.save(log);
                }

            }
        }
    }

    /**
     * www
     * This implementation is empty.
     */
    @Override
    public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入方法之前进行拦截");
        return super.preHandle(request, response, handler);
    }
}

说明:使用java拦截器,在运行时进行拦截操作,这里解析出方法的注解,并且保存到数据库中。

注:本文部分内容节选自https://blog.csdn.net/briblue/article/details/73824058

相关文章

  • Java反射机制学习笔记

    上一篇《java注解学习笔记》中最后说到了注解的实现主要依赖java的反射机制,那么这一篇主要介绍一下java的反...

  • JAVA注解学习笔记

    学习书籍 JAVA编程思想(第四版)第20章 java SE5中引入的新特性之一,并在java.lang中内置了几...

  • Java注解学习笔记

    什么是Java注解 注解:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本...

  • Java注解学习笔记

    作为一个Android开发者,关于注解应该用的很多,比如大名鼎鼎的ButterKnife框架,就是主要依赖于注解实...

  • Java 注解 学习笔记

    Java 注解 学习笔记 前言: 注解是一个很早就出现的技术,之前一直没有时间就这么拖着,现在闲暇之时学习一下,...

  • Java 注解 学习笔记

    我们平常写Java代码,对其中的注解并不是很陌生,比如说写继承关系的时候经常用到@Override来修饰方法。但是...

  • java注解学习笔记

    注解的定义 官方定义:Java注解用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些...

  • Java注解学习笔记

    注解是Java提供的一种原程序中的元素关联任何数据和任何信息的一种途径和方法。 注解的分类 按运行机制分 源码注解...

  • 关于注解

    自己学习笔记,仅供自己参考,如有不对欢迎指正 1.source注解,生命周期存活与Java源文件(.java文件)...

  • 相关文章

    我的笔记核心理论基础、Socket通信原理、RPC远过程调用协议、Dubbo博客 java注解-01、java注解...

网友评论

      本文标题:java注解学习笔记

      本文链接:https://www.haomeiwen.com/subject/qydrkctx.html