欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一起归纳学习Spring-- (4)Spring的常用注解

程序员文章站 2024-03-02 19:40:40
...

简述

Spring中Bean注入和装配的方式有很多种,可以通过xml,get set方式,构造函数或者注解等。当然最简单的方式就是使用Spring的注解了,Spring也提供了大量的注解方式。下面我们来复习一下常见的注解吧

Spring的常用注解

一、声明bean的注解

  • @Controller
    ①用于标注控制层组件
    ②@Controller用于标记一个类上,使用它标记的类就是一个SPringMVC Controller对象
    ③分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解
    ④可以把Request请求header部分的值绑定到方法的参数上

  • @Service 用于标注业务层组件

  • @Repository 用于注解Dao层,在daoImpl类上的注解

  • @Compoment 标注一个普通的Spring Bean类。泛指组件,当组件不好归类的时候,我们可以用这个组件。

总结:
1、@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。
2、被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!
3、当使用了Spring注解后,我们需要在配置文件中添加context:component-scan/来扫描添加了注解的类,这样子声明注解的类才能起作用。如下:

<context:component-scan base-package="org.springframework.*"/>

二、装配bean时常用的注解

1、注解介绍

  • @Autowired 它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过注解的使用来消除set,get方法
  • @Resource 不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。

2、举例说明
(1)@Autowired

@Controller
public class HappyController {
    @Autowired //默认依赖的ClubService  对象(Bean)必须存在
    //@Autowired(required = false) 改变默认方式
    @Qualifier("goodClubService")
    private ClubService clubService;

    // Control the people entering the Club
    // do something
}

(2)@Resource

public class AnotationExp {

    @Resource(name = "HappyClient")
    private HappyClient happyClient;

    @Resource(type = HappyPlayAno .class)
    private HappyPlayAno happyPlayAno;
}

3、总结
在Spring 3.X中经常使用到@Autowired和@Resource进行装配。
不禁好奇这两个注解的差异在何处???

相同点:
@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。

不同点:
(1)提供方:@Autowired是由Spring提供;@Resource是由J2EE提供,需要JDK1.6及以上
(2)注入方式:@Autowired只按照byType 注入;@Resource默认按byName自动注入,也提供按照byType 注入;
(3)属性:
@Autowired 按类型装配(byType)依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如上所示代码
@Resource 有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。需要注意的是,**@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。**但一旦指定了name属性,就只能按名称装配了。

@Resource装配顺序

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

三、spring MVC模块注解

  • @ResponseBody
    ①异步请求
    ②该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
    ③返回的数据不是html标签的页面,而是其他某种格式的数据(json、xml)
@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {    
return "Hello World";//返回String类型
}
  • @RequestMapping 一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
@Controller
@RequestMapping("/happy")
public class HappyController  {

  @Autowired
  private HappyService happyService;

  @RequestMapping(/hello/*)
  public void sayHello(){
        //请求为 /happy/hello/* 都会进入这个方法!
        //例如:/happy/hello/123   /happy/hello/adb
        //可以通过get/post 请求
  }
  
  @RequestMapping(value="/haha",method=RequestMethod.GET)
  public void sayHaHa(){
  //只能通过get请求
  }
...
}
  • @PathVariable 用于将请求URL中的变量映射到功能处理方法的参数上,即取出url模板中的变量作为参数(可用于动态绑定)。@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
//@RequestMapping(value="/happy/{dayid:\\d+}",method=RequestMethod.GET) 对dayid添加正则,路由限制访问
public String findPet(@PathVariable("dayid") String dayid, Model mode) {
//使用@PathVariable注解绑定 {dayid} 到String dayid
}
  • @requestParam 主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”)。有required参数,默认情况下,required=true,该参数必须要传。如果该参数可以传可不传,可以配置required=false、
@RequestMapping("/happy")
  public String sayHappy(
  @RequestParam(value = "name", required = false) String name,
  @RequestParam(value = "age", required = true) String age) {
  //age参数必须传 ,name可传可不传
  ...
  }
  • @RequestBody 指方法参数应该被绑定到HTTP请求Body上
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
   //可以绑定自定义的对象类型
}
  • @RequestHeader 可以把Request请求header部分的值绑定到方法的参数上
@RequestMapping(value = "/hello")
public String hello(@RequestHeader(value="User-Agent") String userAgent)
	//当Spring映射请求时,@RequestHeader将使用名称“User-Agent”检查http头,并将其值绑定到String userAgent上
}
  • @RestController 控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,用来创建REST类型的控制器。@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
@RestController /* @Controller + @ResponseBody*/
public class EmployeeController {

    Employee employee = new Employee();
    
    @GetMapping("/employees/{name}")
    public Employee getEmployeeInJSON(@PathVariable("name") String name) {
       employee.setName(name);
       employee.setEmail("[email protected]");
       return employee;
    }
}
  • @ModelAttribute
    ①ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性。
    ②控制器中的@ModelAttribute方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。
    ③控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。
    ④@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。
@Controller
public class HelloWorldController {
    
    @ModelAttribute
    public void populateModel(@RequestParam String abc, Model model) {
         model.addAttribute("attributeName", abc);
      }

    @RequestMapping(value = "/helloWorld")
    public String helloWorld() {
       return "helloWorld";
        }
 }

以上,在获得请求/helloWorld 后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)加入到一个名为attributeName的model属性中,在它执行后 helloWorld被调用,返回视图名helloWorld和model已由@ModelAttribute方法生产好了。

  • @SessionAttributes 将值访日seesion作用域中,SessionAttributes只能使用在类定义上。
@SessionAttributes(value={"user"})
@Controller
public class UserController {

    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model){
        User user = new User("jack","123456");
        model.addAttribute("user", user);
        return "success";
    }
}

如上,在model中存放了属性名为user的数据, 处理结束后,model里的数据会被放入到request中,页面通过request域可以获取到。这里使用@SessionAttributes(value={“user”})将model中属性名为user的数据同时也放入了session域中.

  • @Valid 用于验证注解是否符合要求,如下直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。
@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping
    public User create (@Valid @RequestBody User user) {
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        user.setId("1");
        return user;
    }

然后在 User 类中添加验证信息的要求:


public class User {
    private String id;  
 
    @NotBlank(message = "密码不能为空")
    private String password;
}

@NotBlank 注解所指的 password 字段,表示验证密码不能为空,如果为空的话,上面 Controller 中的 create 方法会将message 中的"密码不能为空"返回。
当然也可以添加其他验证信息的要求:

@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
  • @CookieValue
    ①用来获取Cookie中的值。
    ②CookieValue参数:
    value:参数名称
    required:是否必须
    defaultValue:默认值
@Controller
@RequestMapping("/springmvc")
public class TestRequestMappingController {
 
	@RequestMapping("/testCookieValue")
	public String testCookieValue(
			@CookieValue("JSESSIONID") String sessionIf) {
		//直接获取cookie中的JSESSIONID值
		System.out.println("testRequestParam, sessionIf="+sessionIf);
		return "success";
	}
 
}

四、Spring事务模块注解

敬请期待。。。

引用:
Spring常用注解介绍【经典总结】
spring学习之@ModelAttribute运用详解
@Valid注解是什么