声明:以下观点,纯依据个人目前的经验和理解,有不当之处,多指教!

一、基本概述

注解(Annotation):也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

首先,根据用途划分,可以简单的分为元注解和一般注解,其中元注解包括四个大类:1.@Target,2.@Retention,3.@Documented,4.@Inherited。这几个注解是用来解释其他一般注解的。那么一般注解,就是我们常用的注解。比如:spring注解@controller等

其次,根据范围划分(从大到小),我则把注解分为4类:1,J2EE注解;2,EJB注解;3,spring注解; 4,用户自定义注解。其中EJB和spring的划分,我则是根据查到资料所显示的各自可使用的范围,据说(本人无力考证),EJB为所有主要的J2EE支持!


二、具体注解应用

再次强调说明,本文所列的几个注解,并不是以好坏区分,而是自己最近常用的,但是在概念上有所模糊的!

1,spring的分层注解

@Controller 控制层 @Service 服务层 @Repository 持久层 @Component泛指组件,当组件不好归类的时候,可以使用这个注解进行标注(我一般用这个注解工具类,一般!有时也单独抽象出一个子工程负责整个工程的公共类部分)


使用Controller注解,则对应到之前的配置文件生成:

<bean id="" class="" />


2,对象注解

@Autowired:采用类型的方式完成自动装配

@Resource:采用名称+类型的方式完成自动装配(比较保险)


区别是什么呢?先看下面的注入:

<pre name="code" class="java"><span style="font-family:KaiTi_GB2312;font-size:18px;"><bean id="userDao" class="cn.itcast.shop.user.dao.UserDao">  
        <property name="sessionFactory" ref="sessionFactory"/>  
    </bean></span>


在这句代码里面,我们通过id=userDao注入了一个UserDao类,当我们在用的时候,我们通常写:

<span style="font-family:KaiTi_GB2312;font-size:18px;">private UserDao userDao;  
  
    public void setUserDao(UserDao userDao) {  
        this.userDao = userDao;  
    }</span>
不知道大家有没有发现,我们每次写的private UserDao userDao后面的实例名称,总是和我们在配置文件注入的时候是一样的(至少我有时候因为名称不对应,结果报错了)。采用类型和名称的区别就在于:当采用名称进行装配的时候,在你用到这个实例的时候,所使用的名称一定要相同。在注解上面则表示为:@Service(value="userService"),那么在使用这个Service的时候,则必须和这个名称对应。它会去容器里面找userService这个名称,然后找到这个名称所对应的类,如果没有,则属性值为null。但是,如果是采用类型装配的话,它找的就是cn.itcast.shop.user.dao.UserDao这个类。

3,@ResponseBody

spring还有很多注解,但我都不想说了。最后再说一个@ResponseBody注解(应用于controller)。这个注解是什么呢,就是当你引入了Jackson这个jar包的时候,再使用这个注解,SpringMVC就可以自动将它所修饰的方法的返回值转换为json格式,从而不需要人为的去转换!


PS:传说中,这个注解加上那个jar包,可以完美的将所有Java对象转换为json格式!


4,其他

EJB注解:说实在的,这个注解我比较少用,用到的几次,就是使用注解,进行EJB远程调用,不是很清楚,只是当时查的时候才知道@EJB这个东西不属于spring的注解,我以为是。不太理解,不瞎说!

J2EE注解:如2中所示的,@Resource则属于J2EE注解,而@Autowired则是spring提供的注解!


三、总结

事实上,我还是不太清楚,这每一种注解到底它的应用场景是什么。有时候挺迷惑的,但是,我一直在路上,总会明白的。好了,到了复制粘贴的时候了(这回粘自家人的言论),为什么使用注解呢?注解可以使我们的代码看起来更简洁,而且在一定程度上解除了类原有特性和扩展特性之间的耦合。



posted on 2016-09-18 11:02  何红霞  阅读(356)  评论(0编辑  收藏  举报