一起归纳学习Spring-- (4)Spring的常用注解
简述
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装配顺序
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 如果既没有指定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注解是什么