Annotation 注解

注解如同一张标签。Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响
你的代码执行,但也有一些类型的注解实际上可以用于这一目的。

注解语法


1. 注解的定义

定义一个TestAnnotation的标签:

public @interface TestAnnotation {
    //成员变量
}

2. 注解的属性

  • 注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
  • 注解中属性可以用 default 关键值设置默认值;如果没有默认值,使用的时候需要进行赋值。

code:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
    int id() default 0;
    String msg() default "Hello World!;
}

@TestAnnotation(id=3,msg="Hello Annotation!")
public class Test {
}

3. 注解的应用

将TestAnnotation标签贴在类Test上:

@TestAnnotation
public class Test {
}

4. 元注解

  • 元注解是一种基本注解,可以注解到注解上。
  • 元注解有@Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。
@Retention

它解释说明这个注解的存活时间。

  • RetentionPolicy.SOURCE 注解只在源码阶段保留;
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中;
  • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中.

code:

@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
@Documented

它的作用是能够将注解中的元素包含到 Javadoc 中

@Target

它指定了注解运用的地方。

  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解;
  • ElementType.CONSTRUCTOR 可以给构造方法进行注解;
  • ElementType.FIELD 可以给属性进行注解;
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解;
  • ElementType.METHOD 可以给方法进行注解;
  • ElementType.PACKAGE 可以给一个包进行注解;
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解;
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举。
@Inherited

如果一个父类被 @Inherited注解过的注解进行注解的话,它的子类没有被任何注解应用的话,这个子类就继承了父类的注解。

code:

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}

@Test
public class A {}

public class B extends A {}

code解释:子类B会继承父类A的Test注解。

@Repetable

@Repeatable 是 Java 1.8 才加进来的。当注解的值可以同时取多个时使用。

code:

@interface Persons {
    Person[]  value();
}

@Repeatable(Persons.class)
@interface Person{
    String role default "";
}

@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan{

}

code解释:

  • Persons是容器注解,容器注解就是用来存放其他注解的注解;
  • Persons 是一张总的标签,上面贴满了 Person 这种同类型但内容不一样的标签。把 Persons 给一个 SuperMan 贴上,相当于同时给他贴了画家、程序员、产品经理的标签。

Java预置的注解


1. @Deprecated

这个注解是用来标记过时的元素。

2. @Override

提示子类要复写父类中被 @Override 修饰的方法。

3. @SuppresswWarnings

告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。

4. @SafeVarargs

主要目的是处理可变长参数中的泛型,此注解告诉编译器:在可变长参数中的泛型是类型安全的。

code:

public class VarargsWaring {  
    @SafeVarargs  
    public static<T> T useVarargs(T... args){  
        System.out.println(args.length);  
        return args.length > 0?args[0]:null;  
    }  
}  

//调用
public class safe {  
    public static void main(String[] args) {  
        System.out.println(VarargsWaring.useVarargs(new ArrayList<String>()));  
    }  
}  

5. @FunctionalInterface

函数式接口注解,Java 1.8 版本引入的新特性。函数式接口 (Functional Interface) 就是一个具有一个方法的普通接口。


Spring注解


1. @Autowired

  • 自动装配,其作用是为了消除Java代码里面的getter/setter与bean属性中的property.
  • @Autowired接口注入,使用@Qualifier注解,括号里面的应当是Car接口实现类的类名.

code:

public interface Car
{
    public String carName();
}

@Service
public class BMW implements Car
{
    public String carName()
    {
        return "BMW car";
    }
}

@Service
public class Benz implements Car
{
    public String carName()
    {
        return "Benz car";
    }
}

@Service
public class CarFactory
{
    @Autowired
    @Qualifier("BMW")
    private Car car;

    public String toString()
    {
        return car.carName();
    }
}

2. @Resource

与@Autowired作用相似。

@Autowired 和 @Resource的区别:

  • @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

  • @Autowired是Spring的注解,@Resource是J2EE的注解. Spring属于第三方的,J2EE是Java自己的东西,建议使用@Resource注解,以减少代码和Spring之间的耦合.

@Controller

  • 控制器,注入服务
  • @Controller 用于标记在一个类上,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法.
  • @RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.
  • @PathVariable 注解用来获取请求url中的动态参数.
  • @Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用.返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等s时,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区.
  • 由前端JS传来的数据一般为字符串,当我们在后台赋予Date类型时则会报错。我们可以利用@InitBinder注解来注册编辑器,提前进行数据类型转换

code:

@Controller
//设置想要跳转的父路径
@RequestMapping(value = "/")
public class Sample {
    //如需注入,则写入需要注入的类
    //@Autowired

            // 设置方法下的子路经
            @RequestMapping(value = "/method")
            public String Action1() {
                return "helloWorld";
            }

            @RequestMapping(value = "user/login/{id}/{name}/{status}")
            @ResponseBody
            public User Action2(@PathVariable int id, @PathVariable String name, 
                                @PathVariable boolean status) {
                    //返回一个User对象响应ajax的请求
                    return new User(id, name, status);
            }

            @InitBinder
            public void initBinder(WebDataBinder binder) {
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                dateFormat.setLenient(false);
                binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
                }
 }

3. @Service

  • 服务,注入dao.
  • 使得spring配置文件里面只有一个自动扫描的标签,增强Java代码的内聚性并进一步减少配置文件.
  • 声明类是一个bean,其他的类才可以使用@Autowired将该类作为一个成员变量自动注入.

code:

@Service
@Scope("prototype")
public class Zoo
{
    @Autowired
    private Monkey monkey;
    @Autowired
    private Tiger tiger;

    public String toString()
    {
        return "MonkeyName:" + monkey + "\nTigerName:" + tiger;
    }
}

code解释:Spring默认产生的bean是单例的,配置 @Scope 为”prototype”表示原型即每次都会new一个新的对象。

4. @Repository

  • dao,实现dao访问.
  • @Repository(value=”userDao”)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。

5. @Component

把普通pojo实例化到spring容器中,相当于配置文件中的

6. @Configuration

  • @Configuration 标注在类上,相当于把该类作为 spring 的 xml配置文件中的 ,作用为:配置spring容器(应用上下文)
  • @Bean 标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象

7. @Value

  • Spring支持以 @value 注解的方式来获取读取 xxx.properties 文件中的配置值,这种方式大大简化了项目配置,提高业务中的灵活性
  • 使用方法:@Value(“#{configProperties[‘key’]}”) 或者 @Value(“${key}”)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值