java中的注解大全@controller、@service、@repository等
参考一篇文章,其中讲了 @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 即可。
mapper 层使用 @Component 注解
@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 自动注入。
差不多所有的注解都在这里了,想要一起学习 java 的童鞋关注公众号《一碗肉丝面》一起学习啊