java中的注解大全

参考一篇文章,其中讲了@controller、@service、@repository注解,看后很有启发,自己复制下总结下,添加点东西写下这篇博客
controller层使用@controller注解

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。比如图一中,跳转到登录页面的路径就是localhost:8080/xxx-war/user/toLogin
service采用@service注解

例:@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action。
dao层使用@repository注解

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。
当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。

@Autowired   :它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
mapper层使用@Component注解
 


除此之外四大注解还有很多有用的注解 
1、@Override:标示当前的方法定义将覆盖超类中的方法他告诉我们同时也告诉编译器我们的这些方法肯定覆盖了类**里面的方法,如果注释掉类**里面的方法 那么就会报错,它需要全部覆盖某个接口的方法。
2、@Deprecated:它标记就表明这个方法已经过时了,在实际中,我们不想用到一个方法,但是这方法的借口正在使用,那我们就可以用它注解
3、SuppressWarnings:忽略编译器警告信息

下面是元注解
@Target:表示该注解可以用于什么地方。 
取值(ElementType)包括: 
CONSTRUCTOR:用于描述构造器 
FIELD:用于描述域 
LOCAL_VARIABLE:用于描述局部变量 
METHOD:用于描述方法 
PACKAGE:用于描述包 
PARAMETER:用于描述参数 
TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention:表示需要在什么级别保存该注解信息。 
取值(RetentionPolicy)包括: 
SOURCE:在源文件中有效(即源文件保留) 
CLASS:在class文件中有效(即class保留) 
RUNTIME:在运行时有效(即运行时保留),因此可以通过反射机制读取注解的信息。

@Documented:表示将此注解包含在javadoc中。

@Inherited:表示允许子类继承父类中的注解。

可以看出 定义注解格式为: 
  public @interface 注解名 {定义体}

1)@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。


public class TestServiceImpl {
    // 下面两种@Autowired只要使用一种即可
    @Autowired
    private UserDao userDao; // 用于字段上
    
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于属性的方法上
        this.userDao = userDao;
    }
}

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}
(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。


public class TestServiceImpl {
    // 下面两种@Resource只要使用一种即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
        this.userDao = userDao;
    }
}

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
--------------------- 
作者:刚刚下课 
来源:CSDN 
原文:https://blog.csdn.net/ss_aa_aa/article/details/78093116 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_22339269/article/details/85469726