关于spring:总是说spring难学来看完这些spring的注解及其解释真香

6次阅读

共计 6672 个字符,预计需要花费 17 分钟才能阅读完成。

前言

用过 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

应用中央有三种:

  1. 标记在办法上。

标记在办法上,会在每一个 @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= 我是小菜}
  1. 标记在办法的参数上。

标记在办法的参数上,会将客户端传递过去的参数按名称注入到指定对象中,并且会将这个对象主动退出 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 相干技术文章或行业资讯,欢送大家关注和转发文章!

正文完
 0