注解

注解(Annotation),也叫元数据,
它是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的。
作用分类
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
基本内置注解
@Override
它的作用是对覆盖超类中方法的方法进行标记,如果被标记的类并没有实际覆盖超类,则编译器会发出错误警告。
@Deprecated
它的作用是对不应该再使用的方法添加注解,当编程人员使用这些方法时,将会在编译时显示提示信息。
@SuppressWarnings
其参数有:
deprecation,使用了过时的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当 Switch 程序块直接通往下一种情况而没有 Break 时的警告
path,在类路径、源文件路径等中有不存在的路径时的警告
serial,当在可序列化的类上缺少serialVersionUID 定义时的警告
finally ,任何 finally 子句不能正常完成时的警告
all,关于以上所有情况的警告
自定义注解
它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface

注解的定义

@Target(ElementType.TYPE)//ClassInfo注解可以标注在类上
/**
 *RetentionPolicy.SOURCE 只能在源代码上使用
  RetentionPolicy.CLASS   该注解能够使用在源代码和字节码上
  RetentionPolicy.RUNTIME  该注解能够使用在源代码、字节码、jvm中
 */
@Retention(RetentionPolicy.RUNTIME)
@Documented //该注解能够出现在帮助文档中
public @interface ClassInfo {
    //给该注解声明了一个属性name,默认值为""
    String name() default "";
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodInfo {
    String value() default "";
}
**注解的使用**
@ClassInfo(name="该人真牛")
public class Xgss {
    @MethodInfo("java初级")
    public void java(){
    }
//对value属性可以直接写值
@MethodInfo("java高级")
    public void superJava(){
    }
}
/**
 * 注解解析器
 * @author zd
 *
 */
public class AnnotationParse {
    public static void parse(){
        Class classt = Itheima09.class;
        //在该类上存在ClassInfo注解
        if(classt.isAnnotationPresent(ClassInfo.class)){
            //从类上得到类的注解
            ClassInfo classInfo = (ClassInfo)classt.getAnnotation(ClassInfo.class);
            //输出该注解的name属性
            System.out.println(classInfo.name());
        }
        //获取该类的所有的方法
        Method[] methods = classt.getMethods();
        for(Method method:methods){
            //如果该方法上存在MethodInfo注解
            if(method.isAnnotationPresent(MethodInfo.class)){
                //获取该方法上面的methodinfo注解
                MethodInfo methodInfo = method.getAnnotation(MethodInfo.class);
                //输出注解中的value属性
                System.out.println(methodInfo.value());
            }
        }
    }

spring注解
利用注解进行依赖注入书写简单
和java代码在一个文件中减少了来回的切换
效率没有xml文件的效率高

需要在applicationContext.xml文件中加入
启动依赖注入的注解解析器

<context:annotation-config></context:annotation-config>

使用 @Resource 注解

public class Boss {
    // 自动注入类型为 Car 的 Bean
    @Resource
    private Car car;

   // 自动注入 bean 名称为 office 的 Bean
    @Resource(name = "office")
    private Office office;
}

不要set和get方法。
配置

 <bean id="car" class="com.xgss.spring.di.annotation.Car"></bean>
    <bean id="student" class="com.xgss.spring.di.annotation.Office"></bean>

1、启动spring容器
2、spring容器内部创建了两个对象car和office
3、当spring容器解析到

<context:annotation-config></context:annotation-config>

启动依赖注入的注解解析器:
4、spring容器在容器中查找所有的bean(car,office)
5、看哪些bean的属性上面是否有Resource注解
6、如果属性上面有该注解,再次检查是否有name属性
7、如果没有name属性,则会把该注解标注的属性的名称获取到和spring容器中的bean标签中的id做匹配,如果匹配成功,则赋值,如果匹配不成功,则按照类型(即属性类型与xml中class指定的类)进行匹配,如果匹配成功,则赋值,如果匹配不成功,则报错。
8、如果有name属性,则把name属性的值解析出来和spring容器中的id做匹配,如果匹配成功,则赋值,如果匹配不成功,则报错。

按照类型进行匹配
@Autowired
按照ID匹配
@Autowired
@Qualifier(“student”)

使用 @Component注解
在 XML 配置文件中定义 Bean,通过@Autowired 或 @Resource 为 Bean 的成员变量、方法入参或构造函数入参提供自动注入的功能。
要从 XML 配置文件中完全移除 Bean 定义的配置,需要我们通过 Spring 2.5 提供的@Component 注释就可以达到这个目标。
使用类扫描注解@Component需要配置为

<context:component-scan base-package="com.baobaotao"/>

@Component
public class Car {

}
1、启动spring容器
2、Spring容器解析类扫描的注解解析器,在base-package指定的包及子包中查找所有的类
3、查看哪些类上面是否含有@Component注解
4、如果该注解的value的属性的值为空,则把类名的第一个字母变成小写,作为id值,放入到spring容器中
5、如果该注解的value的属性的值不为空,则用value的属性的值作为id值,放入到spring容器中
6、再次查找在spring容器中的类的所有的属性,按照@Resource的规则给属性赋值

@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)、
@Repository用于标注数据访问组件,即DAO组件。
而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值