总是说spring难学?来看完这些spring的注解及其解释,真香!
前言
用过spring的人都知道,spring简单的通过注解就可以完成很多事情,但这些东西是如何实现的呢以及如何应用到我们自己的代码中?接下来,让我们一起开启注解的旅程。
1. @Controller
标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.
@Controller
public class TestController {
@RequestMapping("/test")
public String test(Map<String,Object> map){
return "hello";
}
}
2. @Component、@Repository、@Service、@Controller作用等价相同的
区别:如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。
用来装配bean,主要用于标注业务层组件,通过注解的方式将该类加入到spring 中进行管理。
@Service
public interface UserService {
User login(String username,String password);
}
//当把注解写在接口上时,spring容器会注入失败。
//注解写在类上 注入不会失败。
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
}
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService
}
3. @Autowired
用来装配bean,可以写在字段上,也可以写在方法上。
默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false)
4. @RequestMapping
类定义处:提供初步的请求映射信息,相对于 WEB 应用的根目录。
方法处:提供进一步的细分映射信息,相对于类定义处的 URL。
说白了,就是例如(“user”)网站上访问localhost:8080/user.html就可以访问这个方法和html页面。
5. @RequestParam
用于将请求参数区数据映射到功能处理方法的参数上
例如:
public Resp test(@RequestParam Integer id){
return Resp.success(customerInfoService.fetch(id));
}
这个id就是要接收从接口传递过来的参数id的值的,如果接口传递过来的参数名和你接收的不一致,也可以如下:
public Resp test(@RequestParam(value="userId") Integer id){
return Resp.success(customerInfoService.fetch(id));
}
其中userId就是接口传递的参数,id就是映射userId的参数名。
6. @ModelAttribute
使用地方有三种:
- 标记在方法上。
标记在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动>将该返回值加入到ModelMap中。
A.在有返回的方法上:
当ModelAttribute设置了value,方法返回的值会以这个value为key,以参数接受到的值作为value,存入到Model中,如下面的方法执行之后,最终相当于 model.addAttribute(“user_name”, name);假如 @ModelAttribute没有自定义value,则相当于
model.addAttribute(“name”, name);
1@ModelAttribute(value="user_name")
2 public String before2(@RequestParam(required = false) String name, Model model) {
3 System.out.println("进入了2:" + name);
4 return name;
5 }
B.在没返回的方法上:
需要手动model.add方法
1 @ModelAttribute
2 public void before(@RequestParam(required = false) Integer age, Model model) {
3 model.addAttribute("age", age);
4 System.out.println("进入了1:" + age);
5 }
我们在当前类下建一个请求方法:
1@RequestMapping(value="/mod")
2 public Resp mod(
3 @RequestParam(required = false) String name,
4 @RequestParam(required = false) Integer age,
5 Model model){
6 System.out.println("进入mod");
7 System.out.println("参数接受的数值{name="+name+";age="+age+"}");
8 System.out.println("model传过来的值:"+model);
9 return Resp.success("1");
10 }
在浏览器中输入访问地址并且加上参数:
http://localhost:8081/api/test/mod?name=我是小菜&age=12
最终输出如下:
1进入了1:40
2进入了2:我是小菜
3进入mod
4参数接受的数值{name=我是小菜;age=12}
5model传过来的值:{age=40, user_name=我是小菜}
- 标记在方法的参数上。
标记在方法的参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用.
我们在上面的类中加入一个方法如下
1@RequestMapping(value="/mod2")
2 public Resp mod2(@ModelAttribute("user_name") String user_name,
3 @ModelAttribute("name") String name,
4 @ModelAttribute("age") Integer age,Model model){
5 System.out.println("进入mod2");
6 System.out.println("user_name:"+user_name);
7 System.out.println("name:"+name);
8 System.out.println("age:"+age);
9 System.out.println("model:"+model);
10 return Resp.success("1");
11 }
在浏览器中输入访问地址并且加上参数:
http://localhost:8081/api/test/mod2?name=我是小菜&age=12
最终输出:
1进入了1:40
2进入了2:我是小菜
3进入mod2
4user_name:我是小菜
5name:我是小菜
6age:40
7model:{user_name=我是小菜,
org.springframework.validation.BindingResult.user_name=org.springframework.validation.BeanPropertyBindingResult: 0 errors, name=我是小菜, org.springframework.validation.BindingResult.name=org.springframework.validation.BeanPropertyBindingResult: 0 errors, age=40, org.springframework.validation.BindingResult.age=org.springframework.validation.BeanPropertyBindingResult: 0 errors}
从结果就能看出,用在方法参数中的@ModelAttribute注解,实际上是一种接受参数并且自动放入Model对象中,便于使用。
7. @Cacheable
用来标记缓存查询。可用用于方法或者类中,
当标记在一个方法上时表示该方法是支持缓存的,
当标记在一个类上时则表示该类所有的方法都是支持缓存的。
参数列表
@Cacheable(value="UserCache")// 使用了一个缓存名叫 accountCache
public Account getUserAge(int id) {
//这里不用写缓存的逻辑,直接按正常业务逻辑走即可,
//缓存通过切面自动切入
int age=getUser(id);
return age;
}
8. @CacheEvict
用来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。 @CacheEvict(value=”UserCache”)
参数列表
9. @Resource
@Resource的作用相当于@Autowired
只不过@Autowired按byType自动注入,
而@Resource默认按 byName自动注入罢了。
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
10. @PostConstruct
用来标记是在项目启动的时候执行这个方法。用来修饰一个非静态的void()方法也就是spring容器启动时就执行,多用于一些全局配置、数据字典之类的加载
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执
11. @PreDestroy
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前
12.@Repository
用于标注数据访问组件,即DAO组件
13.@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
14.@Scope
用来配置 spring bean 的作用域,它标识 bean 的作用域。
默认值是单例
**singleton:单例模式,全局有且仅有一个实例
prototype:原型模式,每次获取Bean的时候会有一个新的实例
request:request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session:session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
global session:只在portal应用中有用,给每一个 global http session 新建一个Bean实例。**
15. @SessionAttributes
默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中
参数:
names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
types:根据指定参数的类型,将模型中对应类型的参数存储到session中
value:和names是一样的。
@Controller
@SessionAttributes(value={"names"},types={Integer.class})
public class ScopeService {
@RequestMapping("/testSession")
public String test(Map<String,Object> map){
map.put("names", Arrays.asList("a","b","c"));
map.put("age", 12);
return "hello";
}
}
16. @Required
适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常。
17. @Qualifier
当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。
18.@PathVariable
@PathVariable可以用来映射URL中的占位符到目标方法的参数中
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id){
System.out.println("testPathVariable:"+id);
return SUCCESS;
}
最后解释一下ajax相关注解:
Ajax相关注解
1.@RestController:定义的控制器所有方法默认返回的都是 @ResponseBody
的方法, 都会将返回值转换为JSON。注意:@RestController=@Controller+@ResponseBody
2.@ResponseBody:设置了 @ResponseBody 以后如果控制器方法返回了Java Bean 对象
则这个JavaBean会被转换为 JSON 对象, 放到响应的正文中发送浏览器
而且响应的 ContentType是 application/json, 表示JSON类型数据
3.@GetMapping:专门处理get类型请求
4.@PostMapping:专门处理post类型请求
注:@GetMapping("/get_test") 和 @RequestMapping(value = “/get_test”,method = RequestMethod.GET)等价的就是为了简化 RequestMapper 专门用于处理Get请求
图解:
19.@Data
类名前面添加@Data注解,lombok(插件,可以节省实体类代码)会在类的编译期间为类添加getter,setter,toString方法。添加全属性笔记equals、hashCode方法。(说白了就是节省实体类的代码,不用再写get、set。。。。。等方法)
测试之后,lombok确实自动生成了以上的一些方法。
最后
感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!
总是说spring难学?来看完这些spring的注解及其解释,真香!的更多相关文章
- 传说中的WCF(1):这东西难学吗?
WCF难学吗? 是啊,这问题估计很多人都会问,也包括阿拉在内,也有此深刻而严重的凝问. 也有人说:“如何某项技术可以化繁为简,学起来轻松一点就好了.”也许,人类开生就摆脱不了一种习性——懒惰:不过,也 ...
- 学妹问的Spring Bean常用配置,我用最通俗易懂的讲解让她学会了
你好呀,我是沉默王二,一枚有趣的程序员,写的文章一直充满灵气,力求清新脱俗.昨天跑去王府井的小米店订购了一台小米 10,说是一周之内能到货,但我还是忍不住今天就想见到她.见我茶不思饭不想的,老婆就劝我 ...
- JVM 真的很难学么?不、只是你“不敢学”而已
JVM 真的很难学么?不.只是你"不敢学"而已 许多招聘的信息上面都说,要了解jvm.多线程什么的对于 java 程序员来说,这是工作好多年的程序员都不一定能掌握的东 ...
- 一起学JAVA之《spring boot》03 - 开始spring boot基本配置及项目结构(转)
<div class="markdown_views"> <h3 id="一导航"><a name="t0"& ...
- C语言指针专题——指针难学的4点原因
前一篇跟大家聊了聊指针的概念,可是就算了解了指针是什么,为什么依然感觉难学?我试着从几个点切入,聊聊指针难学之处. 文末会给大家推荐几本书,有需要的朋友可以看看! 难点1. 讨厌的星号 定义指针变量p ...
- 跟我学Spring Boot(一)创建Spring Boot 项目
本人开发环境为idea15.02 + jdk8 步骤1: 步骤2: 步骤3: 步骤4: 步骤5: 相关目录介绍: resources/static:这里主要存放一些资源文件 例如 css.js.ima ...
- 跟Evan学Sprign编程思想 | Spring注解编程模式【译】
Spring注解编程模式 概况 多年来,Spring Framework不断发展对注解.元注解和组合注解的支持. 本文档旨在帮助开发人员(Spring的最终用户以及Spring Framework和S ...
- Spring学习笔记(二)Spring基础AOP、IOC
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
- Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现
Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细,本来是想在源码分析的文章中附带讲一讲事务使用中的 ...
随机推荐
- SpringMVC异常的处理机制
SpringMVC异常的处理机制 处理流程图 其本质还是把异常交给SpringMVC框架来处理 系统的dao.service.controller出现异常都通过throws Exception向上抛出 ...
- cao 啥时候能系统地复习一下数据结构 我光学数学去了
最近有功夫的话再敲敲数据结构复习复习
- vue组件使用name属性来生成递归组件
先来个简单的数据 1 lists = [{ 2 id: 1, 3 title: '第一层', 4 children: [{ 5 id: 3, 6 title: '第二层', 7 children: [ ...
- Sec-Fetch-*请求头,了解下?
如果你使用76+版本的chrome浏览器,通过开发者面板查看每个网络请求,会发现都有几个Sec-Fetch开头的请求头,例如访问百度首页https://www.baidu.com/的请求: Sec-F ...
- B. Psychos in a Line 解析(思維、單調棧)
Codeforce 319 B. Psychos in a Line 解析(思維.單調棧) 今天我們來看看CF319B 題目連結 題目 給一個數列,如果相鄰兩數,左邊大於右邊,那麼就可以殺死右邊的數字 ...
- BAT大佬推荐使用的HTML5的十个功能
HTML5不是新事物.自从最初发布(2008年1月)以来,我们一直在使用它的一些功能.后来,我再次仔细查看了HTML5功能列表.看到我发现了什么?到目前为止,我还没有真正使用过它! 在本文中,我列出了 ...
- Luogu P2173 [ZJOI2012]网络
题意 写的比较清楚,我就不解释了. \(\texttt{Data Range:}n\leq 10^4,m\leq 10^5,c\leq 10,k\leq 10^5\) 题解 注意到 \(c\) 的范围 ...
- python模块导入(包)
模块 关注公众号"轻松学编程"了解更多. 1.1. 模块的概述 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里的代码就会越来越长,越来越不容易维护. 为了编写可维 ...
- 较详细的gdb入门教程
本文主要介绍gdb的基础使用.若需了解一些技巧,请访问此篇博客:点这里 本篇教程适用于Windows,macOS及Linux,但由于Windows的自带终端很难用,所以体验可能不太好.Windows ...
- 力扣 - 445. 两数相加 II
目录 题目 思路 代码实现 题目 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两 ...