总是说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中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细,本来是想在源码分析的文章中附带讲一讲事务使用中的 ... 
随机推荐
- JS实现鼠标移入水波效果
			前言 最近比较沉迷JS,所以我现在来做个鼠标的交互效果 HTML <div style="border-radius;position:relative;width:800px;hei ... 
- HTML编辑器(1)
			前言 现在网上有很多这样的HTML编辑器,这种编辑器无疑给人带来了很多方便,所以自己也想尝试制作一款这样的HTML编辑器,既然要制作,那就肯定是先把UI搭起来,再慢慢完善功能 设计思路 我的思路就是将 ... 
- 通过maven创建springboot项目
			1,idea选择创建一个maven项目 2,pom.xml <dependencies> <dependency> <groupId>org.springframe ... 
- Java编程思想 笔记
			date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ... 
- Netty关闭连接流程分析
			在实际场景中,使用Netty4来实现RPC框架,服务端一般会验证协议,最简单的方法的协议探测,判断魔数是否正确.如果服务端无法识别协议会立即抛出异常,并主动关闭连接,此时客户端会收到read信号,在发 ... 
- JSP标签语法、JSTL标签库、EL表达式辨析
			<一.JSP > JSP 语法语法格式: <% 代码片段 %>或者<jsp:scriptlet> 代码片段</jsp:scriptlet> JSP声明 ... 
- 任务管理器中arcsom.exe和arcsoc.exe的个数问题
			转载链接:http://blog.newnaw.com/?p=78 安装了ArcGIS Server的机器,当打开任务管理器的时候,会看到里面有arcsom.exe和arcsoc.exe进程,但它们的 ... 
- 计算机二级考试:Java
			目录 第 1 章 Java 语言概论 第 2 章 基本数据类型 2.1 概述 2.1.1 标识符 2.1.2 关键字 2.1.3 常量 2.2 基本数据类型 第 3 章 运算符和表达式 3.2 算术运 ... 
- jetson-reference编译出现的问题记录
			问题一: 显示gcc版本过高,需要安装低版本的gcc.g++ sudo apt-get install -y gcc-4.9 sudo apt-get install -y g++-4.9 cd /u ... 
- leetcode113:sudoku-solver
			题目描述 请编写一个程序,给数独中的剩余的空格填写上数字 空格用字符'.'表示 假设给定的数独只有唯一的解法 这盘数独的解法是: 红色表示填上的解 Write a program to solve a ... 
