@Component 组件,没有明确的角色
@Service 在业务逻辑层使用(service层)
@Repository 在数据访问层使用(dao层)
@Controller 在展现层使用,控制器的声明(controller层)
@Autowired和@Resource的区别?
1.@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired
2.@Autowired采取的策略为按照类型注入.
这样会产生一个问题,当一个类型有多个bean值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着@Qualifier使用。
@Qualifier告诉spring具体去装配哪个对象.
@Autowired
@Qualifier("cat1")
private Cat cat;
这个时候我们就可以通过类型和名称定位到我们想注入的对象.
@Resource
@Resource注解由J2EE提供,需要导入包javax.annotation.Resource。
@Resource默认按照ByName自动注入
public class UserService {
@Resource
private UserDao userDao;
@Resource(name="studentDao")
private StudentDao studentDao;
@Resource(type="TeacherDao")
private TeacherDao teacherDao;
@Resource(name="manDao",type="ManDao")
private ManDao manDao;
}
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Configuration 声明当前类为配置类,相当于xml形式的Spring配置
@Bean 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式
@ComponentScan 用于对Component进行扫描
--------------------------------------------------------------------------------
Bean 的作用域
singleton(单例) 在Spring IoC容器中仅存在一个Bean实例 (默认的scope)
prototype(多例) 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean():不会在容器启动时创建对象
request(请求) 用于web开发,将Bean放入request范围 ,request.setAttribute(“xxx”) , 在同一个request 获得同一个Bean
session(会话) 用于web开发,将Bean 放入Session范围,在同一个Session 获得同一个Bean
globalSession(全局会话) 一般用于 Porlet 应用环境 , 分布式系统存在全局 session 概念(单点登录),如果不是 porlet 环境,globalSession 等同于 Session
@Aspect 声明一个切面
使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
@After 在方法执行之后执行
@Before 在方法执行之前执行
@Around 在方法执行之前与之后执行
@PointCut 声明切点
五.其他
@Value 为属性注入值
@Import 往容器中注入组件
@Import详细使用https://blog.csdn.net/sunshunli/article/details/108376348
在实际项目中,我们最常用的几个注解,包括 @Controller、@RestController、 @RequestMapping、@PathVariable、@RequestParam 以及 @RequestBody,此次主要介绍下这几个注解常用的使用方式和特点.
1.@Controller
在SpringMVC中,controller主要负责处理前端控制器(DispatcherServlet )发过来的请求,经过业务逻辑层
处理之后封装层一个model,并将其返回给view进行展示。@controller注解通常用于类上,如果结合Thymeleaf
模板使用的话,会返回一个页面。如果是前后端分离的项目,则使用@RestController,表明返回的是json格式
数据
2.@RestController
@RestController注解里面包含了@Controller注解和@ResponseBody注解,@ResponseBody 注解是将返回的数
据结构转换为 JSON 格式,所以说可以这么理解:@RestController = @Controller + @ResponseBody ,省
了很多事,我们使用 @RestController 之后就不需要再使用 @Controller 了。
3.@RequestMapping
@RequestMapping 是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。用于类上的注解会将一个特定请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径;方法的级别上注解表示进一步指定到处理方法的映射关系。
该注解有6个属性,一般在项目中比较常用的有三个属性:value、method 和 produces。
value 属性:指定请求的实际地址,value 可以省略不写;
method 属性:指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET。
produces 属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”。
------------------------------------------------------------------------------------------
@RestController
@RequestMapping(value = "/test", produces = "application/json; charset=UTF-8")
public class TestController {
@RequestMapping(value = "/get", method = RequestMethod.GET)
public String testGet() {
return "success";
}
}
我们在浏览器中输入localhost:8080/test/get即可访问.
4.@PathVariable
@PathVariable 注解主要用来获取 URL 参数,Spring Boot 支持 Restfull 风格的 URL,比如一个 GET 请求携带一个参数 id,我们将 id 作为参数接收,可以使用 @PathVariable 注解。
------------------------------------------------------------------------------------------
@GetMapping("/user/{id}")
public String testPathVariable(@PathVariable Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
------------------------------------------------------------------------------------------
这里需要注意一个问题,如果想要 URL 中占位符中的 id 值直接赋值到参数 id 中,需要保证 URL 中的参数和方法接收参数一致,否则将无法接收。如果不一致的话,其实也可以解决,需要用 @PathVariable 中的 value 属性来指定对应关系。如下:
@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
------------------------------------------------------------------------------------------
运行项目,在浏览器中请求:localhost:8080/test/user/2/zhangsan, 可以看到控制台输出如下信息:
获取到的id为:2
获取到的name为:zhangsan
5.@RequestParam
@RequestParam 注解顾名思义,也是获取请求参数的,上面我们介绍了 @PathValiable 注解也是获取请求参数的,那么 @RequestParam 和 @PathVariable 有什么不同呢?
1.@PathValiable 是从 URL 模板中获取参数值, 即这种风格的 URL:
http://localhost:8080/user/{id}
2.@RequestParam 是从 Request 里获取参数值,即这种风格的 URL:
http://localhost:8080/user?id=1
-------------------------------------------------------------------------------------------
@GetMapping("/user") //注意这里请求路径的写法是不一样的
public String testRequestParam(@RequestParam Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
6.@RequestBody
RequestBody 注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过 JSON 提交传来两个参数 username 和 password,此时我们需要在后端封装一个实体来接收。在传递的参数比较多的情况下,使用 @RequestBody 接收会非常方便
-------------------------------------------------------------------------------------------
例子:
student.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
controller
package com.ssl.controller;
import com.ssl.pojo.Student;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/test")
public class StudentController {
@RequestMapping(value="/student",method= RequestMethod.POST)
public String student(@RequestBody List students ){
for(Student s : students){
System.out.println("学生姓名:"+s.getName());
}
return "ok";
}
}