总是说 spring 难学?看完这些 spring 的注解及其解释,对你来说就是 So-easy!
return "hello";}}
2. @Component、@Repository、@Service、@Controller 作用等价相同的
区别:如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。
用来装配 bean,主要用于标注业务层组件,通过注解的方式将该类加入到 spring 中进行管理。
@Servicepublic interface UserService {User login(String username,String password);}//当把注解写在接口上时,spring 容器会注入失败。
//注解写在类上 注入不会失败。@Servicepublic class UserServiceImpl implements UserService{@Autowiredprivate UserMapper userMapper;}
@Controller@RequestMapping("user")public class UserController {
@Autowiredprivate 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 @ModelAttribute2 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:402 进入了 2:我是小菜 3 进入 mod4 参数接受的数值{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:402 进入了 2:我是小菜 3 进入 mod24user_name:我是小菜 5name:我是小菜 6age:407model:{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”) 参数列表
评论