Spring注解相关

Spring常用注解

之前面试的时候总结的,一直没想起来写,最近决定来点“回忆杀”。之前面试常被问到的一个问题,做项目常用的注解有哪些?除了@controller,@Service等基础的,还要记一些功能性的注解。


定义bean的相关注解

@Controller: bean注册,用于控制层

@Service: bean注册,用于业务逻辑层

@Component: bean注册 跟业务逻辑没什么关系,可供service层和controller层调用


获取bean的相关注解

@Autowired: 获取bean

@Resource: 获取bean

@Resource(name=”adminServiceImpl”)

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

两者区别:
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2.@Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,@Autowired()@Qualifier(“baseDao”)
3.@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。

@Autowired+@Qualifier: 获取bean 接口有多个实现时,配合@Qualifier指定

@Configuration+@Bean: bean注册(人为) bean可以指定bean的名字


前后端获取参数的相关注解

@Values: 从配置文件中获取参数

@CookieValue(value=“”): 获取cookie中的值

@RequestMapping(“view”): 用于映射Web请求,包括访问路径和参数

@RequestParam(“id”): 接收url中?后的参数可设置是否为必要参数以及默认值

@RequestParam(value=“id”,required=false,defaultValue=0)

@PathVariable: 绑定url中的占位符{id},用于接收路径参数。
将注解放在参数中前,即可获取@RequestMapping(“/hello/{name}”)申明的路径中的值,通常作为Restful的接口实现方法【不同的请求方式或用占位符,请求地址可以一样,利于管理】。接收路径中/后的值

@RestController: 该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。

@ResponseBody: 支持将返回值放在response内,而不是一个页面,通常用户返回json数据(返回值旁或方法上),用于前端获取数据,提交数据

@RequestBody: 允许request的参数在request体中,而不是在直接连接在地址后面。可从前端直接获得整个请求体,得到key=value&key=value…结构的数据(放在参数前)get方法没有请求体,请求参数在url上。用于json对象封装

@RequestHeader: 获得请求头【请求头header一般用来存放一些cookie,token信息;请求体body一般用来存储post的参数和参数数据;】

@GetMapping(“get”): 查询数据@getMapping = @requestMapping(method = RequestMethod.GET)。

@PostMapping: 新增数据,可以在传入参数中加上@RequestBody User user 将其添加数据并显示@postMapping = @requestMapping(method = RequestMethod.POST)。


其他重要注解

@CrossOrigin: 解决跨域问题,允许用户灵活地指定什么样的跨域请求被授权。CORS请求(包括预选的带有选项方法)被自动发送到注册的各种HandlerMapping 。它们处理CORS准备请求并拦截CORS简单和实际请求,这得益于CorsProcessor实现(默认情况下默认DefaultCorsProcessor处理器),以便添加相关的CORS响应头(如Access-Control-Allow-Origin)。CorsConfiguration允许您指定CORS请求应该如何处理:允许origins, headers, methods等。

@ControllerAdvice: 通过该注解,我们可以将对于控制器的全局配置放置在同一个位置,注解了@Controller的类的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上,这对所有注解了 @RequestMapping的控制器内的方法有效。

@ExceptionHandler: 用于全局处理控制器里的异常

@InitBinder: 用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中。

@ModelAttribute: 本来的作用是绑定键值对到Model里,在@ControllerAdvice中是让全局的@RequestMapping都能获得在此处设置的键值对。
可用于修饰方法和参数
出现在方法上: 表示当前方法会在控制器的方法执行之前,先执行。如果方法没有返回值,可以传入一个参数map,将值存入map,在需要取值的controller方法参数中添加注解@ModelAttribute(value=””),可获得该值。有返回值的方法可以直接指定@ModelAttribute(””),然后用同样的方法获得值。
出现在参数上: 获取指定的数据给参数赋值
应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据

@SessionAttribute: 用于多次执行控制器方法间的参数共享,只能作用在类上。@SessionAttribute(value=””)把存入request中对应键值的属相存入session域。可用modelMap在不同request中获取session值
解决和servlet的耦合,可以用HttpServletRequest
Session域,用modelMap取值
sessionStatus 删值 status.setComplete();


三大作用域

Request作用域
当请求从一个action转发到一个jsp的时候,如果jsp中要使用action类中的变量,那么我们需要将action中的变量放入到request作用域中传给jsp。那么jsp中就可以通过request作用域获取到该变量。
例如:登陆成功后需要在成功页面显示人员信息。
Request对象类似于一个map集合。放数据的时候,放入键值对,取数据时通过键取值。
request.setAttribute(key,value);//往request作用域里面放入数据。
request.getAttribute(key);//从requtest作用域里面获取数据。
所有的作用域都有上面的两个方法。

Request作用域的特点:
放数据的servlet和取数据的servlet必须保证使用的是同一个request对象。一旦request对象改变了,那么,request作用域里面的值就会失效。

将数据存到request域
①使用Model对象
Model model
model.addAttribute(“appleAttrName”, “appleAttrValue”);

②使用ModelMap
ModelMap modelMap
modelMap.addAttribute(“bananaAttrName”, “bananaAttrValue”);

③使用Map
Map<String, Object> map
map.put(“orangeAttrName”, “orangeAttrValue”);

④使用HttpServletRequest
request.setAttribute(“grapeAttrName”, “grapeAttrName”);

session作用域
Session域中存入数据
HttpSession session
session.setAttribute(key,value);//到session作用域放数据
session.getAttribute(key);//从session作用域获取数据
session.removeAttibute(key);//从session作用域里面移除数据。

Application作用域:ServletContext
ServletContext的总结:
1.ServletContxt就是对web.xml文件的封装。
2.一个项目中只有一个web.xml文件。
3. ServletContext对象在一个项目中只有一个。

向application域存入数据需要先拿到ServletContext对象。
sc.setAttribute(key,value);把变量放入作用域
sc.getAttribute(key);从作用域里面获取变量
sc.removeAttribute(key);从作用域里面移除对象。

通常在spring项目中获取servletContext有以下方式
1、request获取servletContext
ServletContext servletContext = request.getServletContext();
2、使用ContextLoader
ContextLoader.getCurrentWebApplicationContext().getServletContext();
3、使用spring注入自动注入
@Autowired
private ServletContext servletContext;

三大作用域的比较
request,session,application(ServletContext)
Request作用域的范围最小,对应一次请求。
Session作用域的范围要大一些。对应一次会话。只要浏览器不关就是一个session。
Application作用域的范围最大。对应一个应用程序。不管有多少个浏览器,只要访问的是同一个项目,那么他们对应的就是一个application对象。

Application对象跟一个项目相关,他会在tomcat启动的时候被创建,tomcat关闭的时候被销毁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值