• Java注解


    注解

    注解(Annotation)是一种用于为程序代码添加元数据的特殊语法结构。它可以在不改变原有逻辑的情况下,为程序中的类、方法、字段等元素附加额外的信息和标记。

    元注解

    元注解的作用就是负责注解其他注解。

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
    
    • 1
    • 2
    • 3
    • 4

    元注解有六个:

    @Target(表示该注解可以用于什么地方)

    ElementType.TYPE:可以作用在类上
    ElementType.METHOD:可以作用在方法上
    ElementType.FIELD:可以作用在成员变量

    @Retention(表示再什么级别保存该注解信息)

    SOURCE < CLASS < RUNTIME
    SOURCE:表示当前注解只在代码阶段有效
    CLASS:表示该注解会被保留到字节码阶段
    RUNTIME:表示该注解会被保留到运行阶段 JVM
    自定义的注解:RetentionPolicy.RUNTIME

    @Documented(将此注解包含再javadoc中)

    @Inherited(允许子类继承父类中的注解)

    @Repeatable(1.8新增,允许一个注解在一个元素上使用多次)

    @Native(1.8新增,修饰成员变量,表示这个变量可以被本地代码引用,常常被代码生成工具使用)

    自定义注解

    1.定义一个注解

    @Documented
    @Inherited
    @Target({ ElementType.FIELD, ElementType.METHOD ,ElementType.TYPE})  //可以在字段、枚举的常量、方法
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Init {
         String value() default "";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.使用注解

    public class User {
        private String name;
        private String age;
    
        public String getName() {
            return name;
        }
    
        @Init("louis")
        public User setName(String name) {
            this.name = name;
            return this;
        }
    
        public String getAge() {
            return age;
        }
    
        @Init("22")
        public User setAge(String age) {
            this.age = age;
            return this;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.注解解析器

    public class userFactory {
    
            public static User create() {
                User user = new User();
    
    
                // 获取User类中所有的方法(getDeclaredMethods也行)
                Method[] methods = User.class.getMethods();
    
    
                try
                {
                    for (Method method : methods)
                    {
                        // 如果一个注解指定注解类型是存在于此元素上此方法返回true,否则返回false
                        //参数 -- 对应于注解类型的Class对象
                        if (method.isAnnotationPresent(Init.class))
                        {
                            //此方法返回该元素的注解在此元素的指定注释类型(如果存在),否则返回null
                            Init init = method.getAnnotation(Init.class);
                            // 如果Method代表了一个方法 那么调用它的invoke就相当于执行了它代表的这个方法,在这里就是给set方法赋值
                            method.invoke(user, init.value());
                        }
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    return null;
                }
    
    
                return user;
    }
    }
    
    • 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

    4.使用

       public static void main(String[] args) {
            User user = userFactory.create();
            user.setAge("30");
            System.out.println(user.getName());
            System.out.println(user.getAge());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Java常用注解

    @Override 表示当前方法覆盖了父类的方法

    @Deprecated 表示方法已经过时,方法上有横线,使用时会有警告。

    @SuppressWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)

    @SafeVarargs (jdk1.7更新) 表示:专门为抑制“堆污染”警告提供的。

    @FunctionalInterface (jdk1.8更新) 表示:用来指定某个接口必须是函数式接口,否则就会编译出错。

    spring常用注解

    @Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

    @Scope注解 作用域

    @Lazy(true) 表示延迟初始化

    @Service用于标注业务层组件

    @Controller用于标注控制层组件@Repository用于标注数据访问组件,即DAO组件。

    @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

    @Scope用于指定scope作用域的(用在类上)

    @PostConstruct用于指定初始化方法(用在方法上)

    @PreDestory用于指定销毁方法(用在方法上)

    @DependsOn:定义Bean初始化及销毁时的顺序

    @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

    @Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: @Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

    @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

    @PostConstruct 初始化注解

    @PreDestroy 摧毁注解 默认 单例 启动就加载

    应用场景

    1. 配置管理:很多框架使用注解来进行配置管理,通过在类或方法上添加特定的注解,来指定框架的行为和配置信息。例如,Spring框架使用@Component、@Service、@Autowired等注解来标识组件、依赖注入等配置。
    2. 路由和映射:Web框架(如Spring MVC)使用注解来定义URL路由和请求映射关系。通过在控制器方法上添加@RequestMapping注解,可以指定处理特定URL请求的方法。
    3. 数据验证和校验:许多框架使用注解来进行数据验证和校验。例如,Hibernate Validator框架使用注解(如@NotNull、@Size等)来定义实体类属性的验证规则,方便进行数据校验。
    4. AOP(面向切面编程):AOP框架(如AspectJ)使用注解来定义切点和通知。通过在方法上添加特定的注解,可以指定在什么时候执行哪些切面逻辑。
    5. 缓存管理:一些缓存框架(如Spring Cache)使用注解来标识需要进行缓存操作的方法。通过在方法上添加@Cacheable、@CacheEvict等注解,可以自动缓存和清除缓存。
    6. 事件驱动编程:一些事件驱动框架(如Spring Event)使用注解来标识和处理事件。通过在方法上添加@EventListener注解,可以指定方法作为事件监听器。
    7. 测试框架:测试框架(如JUnit)使用注解来标识测试方法和测试类。通过在方法上添加@Test、@Before、@After等注解,可以指定测试用例的执行顺序和行为。
  • 相关阅读:
    HTML这一篇就够啦~
    Linux基础命令
    MyBatis-Plus——查询和删除(逻辑删除)
    Mybatis-Plus进行分页查询时,进程直接退出
    中小学生使用全光谱台灯对眼睛好不好?2023口碑好的护眼台灯推荐
    EMC原理-传导(共模、差模)与辐射(近场、远场)详解
    百趣代谢组学资讯:项目文章Nature,揭示低温暴露抑制实体瘤生长机制,‘饿死’癌细胞
    嵌入式设备时间同步(校时)
    Windows环境下Qt Creator控制台输出中文乱码解决方法
    C#学习 - 事件
  • 原文地址:https://blog.csdn.net/qq_26347283/article/details/133770588