注解(Annotation)的使用.

1.什么是注解:

注释: 给程序员看的.
注解: 给JVM看的 , 可以加在包、类、字段、方法、局部变量、方法参数等前面 ,
         用来对这些元素说明 , 注释.
 
注: 一个同名的注解只能使用一次.

2.注解的作用:

  • 编写文档: 通过代码里标识的注解生成文档. [ 例: 生成doc文档 ]
  • 代码分析: 对代码进行分析. [ 例: 注解的反射 ]
  • 编译检查: 让编译器能够实现基本的编译检查. [ 例: Override ]

3.自定义注解:

定义格式:
       元注解
       public @interface 注解名称{
                  格式1: 修饰符 数据类型 属性名( );
                  格式2: 修饰符 数据类型 属性名( ) default 默认值 ;
       }
 
注解的属性:
       1.作用: 使用注解时可以传递参数 , 让注解功能更强大.
       2.属性使用的数据类型: 四类八种 , String类型 , Class 类型 , 枚举 , 注解类型.
       3.特殊属性Value : 当只有一个属性 && 名称是value , 可以直接给属性值.
 
使用格式:
       没有属性:  @注解名称
       有 属 性 :   @注解名称(属性名 = 属性值 , 属性名 = 属性值 … )
       value属性: @注解名称(属性值) ;

自定义注解案例:

/*
    定义一个注解:Book
        - 包含属性:String name()   书名
        - 包含属性:double price()  价格,默认值为 100
        - 包含属性:String[] authors() 多位作者
 */
public @interface Book {
    // 书名
    public abstract String name();
    
    //  - 包含属性:double price()  价格,默认值为 100
    public abstract double price() default  100;
    
    // - 包含属性:String[] authors() 多位作者
    public abstract String[] authors();
}

// 定义方法使用 
public class TestBook {
	// 有默认值的可以不传属性值 , 也可以传 . 
    @Book(name = "西游记" , authors = "孙悟空" ,price = 88.88)
    public void showBook(){

    }
}

4.注解之元注解: 用于修饰自定义的注解.

元注解之@Target:                                                         作用: 指明用在哪个位置.
可选参数值: ElementType(枚举类型.)
       type: 用在类 , 接口上 .
       field: 用在成员变量上 .
       method: 用在方法上 .
       parameter: 用在参数上 .
       constructor: 用在构造方法上.
       local_variable: 用在局部变量上.

元注解之@Retention:                                                 作用: 定义该注解的生命周期(有效范围)
可选参数值: RetentionPolicy:
       source: 只存在于java源代码中 .
       class: 存在于java源代码中 , 编译以后的字节码文件中
       runtime: 存在于java源代码中 , 编译后的字节码文件中 , 运行时内存中 . (可通过反射获取注解)

注解解析: 通过java技术获取注解数据的过程.
                看程序(就是获取注解的属性值)
isAnnotationPresent( ): 判断(类上,方法上…)是否有指定的注解
                     参数传递: 要判断注解的class文件对象
getAnnotation(): 获取(类上 ,方法上…)的注解.
                     参数传递: 要获取的注解的class文件对象.

综合案例:

/*
    反射和注解的综合练习题
        模拟注解@Test
        自定义一个注解@MyTest,并添加元注解(运行中有效,只能用在方法上)
        定义一个使用@MyTest类,定义多个方法,部分方法使用@MyTest注解
        获取测试类中所有的方法,判断方法上是否有@MyTest注解
            有:让方法执行  invoke(obj)
            没有:就不执行方法
 */
 
 // 自定义一个注解@MyTest,并添加元注解(运行中有效,只能用在方法上)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}

// 定义一个类 , 定义多个方法 , 部分方法使用MyTest注解 .
public class TestMyTest {
    @MyTest
    public void method01(){
        System.out.println("method01");
    }

    public void method02(){
        System.out.println("method02");
    }

    public void method03(){
        System.out.println("method03");
    }
    @MyTest
    public void method04(){
        System.out.println("method04");
    }
}

// 获取测试类中所有的方法,判断方法上是否有@MyTest注解
public class Demo01Annotation {
    public static void main(String[] args) throws Exception {
        // 创建class文件对象 .
        Class<?> clazz = Class.forName("demo07_annotation_$.TestMyTest");
        // 获取实例化对象.
        Object o = clazz.newInstance();
        // 获取测试类中所有的方法 .
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            // 判断方法上是否有@MyTest注解
            boolean b = method.isAnnotationPresent(MyTest.class);
            if(b){
                // 有:让方法执行  invoke(obj)
                Object o1 = method.invoke(o);
                System.out.println(o1);
            }
        }
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,@Autowired是Spring框架提供的一种依赖注入方式。使用@Autowired注解可以自动将一个bean注入到另一个bean中,而不需要手动编写注入代码。 使用@Autowired注解的方式很简单,只需要在需要自动注入的属性、构造函数或方法上添加@Autowired注解即可。当Spring容器在创建bean时,会自动寻找匹配的bean,并将其注入到使用@Autowired注解的位置。例如: ``` @Service public class UserService { @Autowired private UserDao userDao; // 自动注入UserDao // ... } ``` 在上面的代码中,UserService类中使用@Autowired注解将UserDao自动注入进来。当Spring容器创建UserService实例时,会自动注入一个UserDao实例。 需要注意的是,@Autowired注解默认是按照类型(class)进行注入的。如果容器中存在多个类型相同的bean,则会抛出异常。如果需要按照名称(name)进行注入,则可以结合@Qualifier注解使用,例如: ``` @Service public class UserService { @Autowired @Qualifier("userDaoImpl") // 按照名称注入UserDaoImpl private UserDao userDao; // ... } ``` 在上面的代码中,@Qualifier注解指定了要注入的bean的名称为"userDaoImpl",这样Spring容器就会按照名称匹配的方式注入UserDaoImpl实例,而不是根据类型匹配。 当然,@Autowired注解也可以用在构造函数和方法上,例如: ``` @Service public class UserService { private UserDao userDao; @Autowired public UserService(UserDao userDao) { // 构造函数注入 this.userDao = userDao; } @Autowired public void setUserDao(UserDao userDao) { // setter方法注入 this.userDao = userDao; } // ... } ``` 在上面的代码中,构造函数和setUserDao方法上均使用了@Autowired注解,这样Spring容器就会自动注入UserDao实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值