SpringBoot中的注解
@Bean 和 @Component
@Component
注解作用于类,表明一个类会作为组件类,并告知Spring要为这个类创建bean;而@Bean
注解作用于方法,告诉Spring这个方法将会返回一个对象,这个对象要注册成Spring应用上下文中的bean,就不用写麻烦的xml配置文件了。通常方法体包含了最终产生bean实例的逻辑。@Component
通常是通过路径扫描来自动侦测以及自动装配到Spring
容器中,@Bean
注解通常是我们在标有该注解的方法中定义产生这个bean
,@Bean
告诉了Spring
这是某个类的实例,当我们需要用它的时候还给我。@Bean
注解比@Component
注解的自定义性更强,而且很多地方我们只能通过@Bean
注解来注册bean
。比如当我们引用第三方库中的类需要装配到Spring
容器时,只能通过@Bean
来实现。- @Bean明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。支持别名@Bean(“xx-name”),@Bean注解默认作用域为单例singleton作用域,可通过**@Scope(“prototype”)**设置为原型作用域
@Configuration :配置类注解
- @Configuration 表明在一个类里可以声明一个或多个
@Bean
方法,并且可以由Spring
容器处理,以便在运行时为这些 bean 生成 bean 定义和服务请求 - @Configuration(proxyBeanMethods = false),告诉SpringBoot这是一个配置类 == 类似于以前的配置文件(beans.xml)
- Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
- Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
- 组件依赖必须使用Full模式默认。其他默认是否Lite模式
注解 | 含义 |
---|---|
@Component | 最普通的组件,可以被注入到 Spring 容器进行管理 |
@Repository | 作用于持久层 |
@Service | 作用于业务逻辑层 |
@Controller | 作用于表现层(spring-mvc的注解) |
@ConditionalOnBean
- @ConditionalOnBean(name = “tom”) 如果存在tom这个组件就会执行下面的操作
@ConditionalOnMissingBean
- @ConditionalOnMissingBean(name = “tom”) ,没有tom这个组件就会执行下面的全部操作,也可以加到某一个@Bean(“xxx”)的上面作为局部生效
@ConfigurationProperties
@EnableConfigurationProperties
@SpringBootApplication
- @SpringBootApplication是一个复合注解,包含了**@SpringBootConfiguration**,@EnableAutoConfiguration,@ComponentScan这三个注解
- @SpringBootConfiguration,主要用于加载配置文件,继承自**@Configuration**,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
- @EnableAutoConfiguration,开启自动配置功能,可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
- @ComponentScan 注解,主要用于组件扫描和自动装配,加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。可以通过basePackages等属性指定@ComponentScan自动扫描的范围,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。
@Controller
-
控制器,处理http请求,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层)
-
@Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC的 Controller类,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了 @RequestMapping 注解。
-
@Controller只是定义了一个控制器类,而使用 @RequestMapping 注解的方法才是处理请求的处理器。
@Controller public class PageController { @RequestMapping(value="/login") public String str(String s) { return "logining"; } }
@Controller @RequestMapping(“/demoInfo”) public class DemoController { @Autowired private DemoInfoService demoInfoService; @RequestMapping("/hello") public String hello(Map<String,Object> map){ System.out.println("DemoController.hello()"); map.put("hello","from TemplateController.helloHtml"); //会使用hello.html或者hello.ftl模板进行渲染显示. return"/hello"; } }
@RestController 复合注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
- 从源码我们知道,@RestController注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式
- 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是return 里的内容。
@ResponseBody注解
-
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
-
在使用**@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径**,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。
1 @RequestMapping(“/test”) 2 @ResponseBody 3 public String test(){ 4 return”ok”; 5 }
@RequestBody注解
- 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上
@RequestMapping
-
提供路由信息,负责URL到Controller中的具体函数的映射。
-
value是@RequestMapping中必须携带的参数,表示地址请求映射的路径
@Controller
@RequestMapping("user") //此处如果不省略,则为@RequestMapping(value="user")
public class UserController {
@RequestMapping("getUser")
@ResponseBody
public ModelAndView getUser() {
ModelAndView view = new ModelAndView();
return view;
}
}
-
method,表示所支持的http的请求方式,包括get、post、delete、put等,其中最常用的是get和post的方法。
- get:请求能够携带的参数比较少,大小有限制,会在浏览器中显示数据内容,不安全,但高效。
- post:请求能够携带的参数没有限制,会在浏览器中显示数据内容,安全,但不高效。
- 注意:method属性不是必选值,默认值是接收所有类型的http请求。
@RequestMapping(value = "getUser",method = RequestMethod.GET) @ResponseBody public ModelAndView getUser(){ ModelAndView view = new ModelAndView(); return view; }
-
params,该属性指定,请求中必须包含params属性规定的参数时,才能执行该请求
@RequestMapping(value="/path",params={"username"}) //表示传递过来的请求中必须携带username
参数
public String path(){
return "path"
}
- header,该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求,一般默认情况下,如果是来自我们自己主机上的请求的话,默认header是localhost:8080
- 例子:
@RequestMapping(value = "getUser",headers = "Referer=http://www.xxx.com")
@ResponseBody
public ModelAndView getUser(){
ModelAndView view = new ModelAndView();
return view;
}
- 表示必须满足请求的header中包含了指定的"Referer"请求头和值为"http://www.xxx.com"时,才能执行该请求,如果没有对应的键值,则会报404错误,表示找不到相应资源。
@GetMapping
-
用于将HTTP get请求映射到特定处理程序的方法注解
-
注解简写:@RequestMapping(value = “/say”,method = RequestMethod.GET)等价于:@GetMapping(value = “/say”)
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @RequestMapping(method = RequestMethod.GET) public @interface GetMapping { //... }
@PostMapping
-
用于将HTTP post请求映射到特定处理程序的方法注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @RequestMapping(method = RequestMethod.POST) public @interface PostMapping { //... }
@PathVariable
- 获取url中的数据
@Controller
@RequestMapping("/User")
public class HelloWorldController {
@RequestMapping("/getUser/{uid}")
public String getUser(@PathVariable("uid")Integer id, Model model) {
System.out.println("id:"+id);
return "user";
}
}
@RequestParam
- 获取请求参数的值
@RequestMapping("/getUser")
public String getUser(@RequestParam("uid")Integer id, Model model) {
System.out.println("id:"+id);
return "user";
}
- 不加@RequestParam注解:
url可带参数也可不带参数,输入 localhost:8080/list1 以及 localhost:8080/list1?userId=xxx 方法都能执行 - 加@RequestParam注解:
url必须带有参数。也就是说你直接输入localhost:8080/list2 会报错,不会执行方法。只能输入localhost:8080/list2?userId=xxx 才能执行相应的方法
public String handle01(@RequestParam("name") String name){
// 添加@Slf4j后,会自动生成一个log对象
log.info("请求进来了....");
return "Hello,Springboot2!" + name;
}
- http://localhost:8080/hello?name=kyle,即可以在网页中添加参数 ?name=kyle
@RequestHeader
- 把Request请求header部分的值绑定到方法的参数上
- 如下配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。测试代码在HeaderValueTypeController中
@RequestMapping(value="/header")
public String test(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[] accepts)
@CookieValue
-
@CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。
-
如下配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。
public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)
- 传入参数类型也可以是javax.servlet.http.Cookie类型
public String test2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId)
@ModelAttribute绑定请求参数到命令对象
绑定请求参数到命令对象
- 如用户登录,我们需要捕获用户登录的请求参数(用户名、密码)并封装为用户对象,此时我们可以使用@ModelAttribute绑定多个请求参数到我们的命令对象。
- 它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用**${user.username}**来获取绑定的命令对象的属性。
- 绑定请求参数到命令对象支持对象图导航式的绑定,如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user中的workInfo属性的city属性中。
public String test1(@ModelAttribute("user") UserModel user)
暴露表单引用对象为模型数据
- 如下代码会在执行功能处理方法之前执行,并将其自动添加到模型对象中,在功能处理方法中调用Model 入参的containsAttribute(“cityList”)将会返回true。
@ModelAttribute("cityList")
public List<String> cityList() {
return Arrays.asList("北京", "山东");
}
@Repository
- 使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
@Value
- 注入Springboot application.properties配置的属性的值
- @Value(“${properties中的键}”)
private String xxx;
@Value(value = "#{message}")
private String message;
-
@Value(“${properties中的键: aaa}”)
当获取不到properties中的键所对于的值时,返回默认值aaa
/**
* @Value 通过 ${} 获取配置文件里person.name的值,如果没有获取成功,就返回默认值李四
*/
@Value("${person.name:李四}")
private String name;
@Service
- @Service是@Component注解的一个特例,作用在类上
- @Service注解作用域默认为单例
- 使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
- @Service用于标注服务层组件,表示定义一个bean
- @Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写
- @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字
@PropertySource注解
- 引入单个properties文件:@PropertySource(value = {“classpath : xxxx/xxx.properties”})
- 引入多个properties文件:@PropertySource(value = {“classpath : xxxx/xxx.properties”,“classpath : xxxx.properties”})
@ImportResource导入xml配置文件
相对路径(classpath)
- 引入单个xml配置文件:@ImportSource(“classpath : xxx/xxxx.xml”)
- 引入多个xml配置文件:@ImportSource(locations={“classpath : xxxx.xml” , “classpath : yyyy.xml”})
绝对路径(file)
- 引入单个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/dubbo.xml”})
- 引入多个xml配置文件:@ImportSource(locations= {“file : d:/hellxz/application.xml” , “file : d:/hellxz/dubbo.xml”})
@Import 导入额外的配置信息
- 功能类似XML配置的,用来导入配置类,可以导入带有@Configuration注解的配置类或实现类
@SpringBootApplication
@Import({SmsConfig.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Transactional事务注解
编程式事务管理
- 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理
- 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过**@Transactional**就可以进行事务操作,更快捷而且简单。推荐使用。
@ControllerAdvice 统一处理异常
- @ControllerAdvice 注解定义全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
}
@ExceptionHandler 注解声明异常处理方法
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
String handleException(){
return "Exception Deal!";
}
}
- 全局处理异常例子:@ControllerAdvice最常见的使用场景就是全局异常处理。比如文件上传大小限制的配置,如果用户上传的文件超过了限制大小,就会抛出异常,此时可以通过@ControllerAdvice结合@ExceptionHandler定义全局异常捕获机制,代码如下:
@ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public void uploadException(MaxUploadSizeExceededException e, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html;charset=utf-8");
System.out.println(1111);
PrintWriter out = resp.getWriter();
out.write("上传文件大小超出限制!");
out.flush();
out.close();
}
}
- 全局异常处理详情查看:<https://blog.csdn.net/qq_43581790/article/details/123871439
@ResponseStatus
- @ResponseStatus的作用就是为了改变HTTP响应的状态码,具有value、code、reason 三个属性
- 加在自定义运行时异常上
- 如果不加@ResponseStatus,在代码中直接抛出该自定义异常,会以500的HTTP状态码响应到浏览器
- 如果加@ResponseStatus,在代码中直接抛出该自定义异常,会以指定的HTTP状态码和指定的reason响应到浏览器;我们自定义异常的目的就是为了让它正确表述我们的思想,所以给其设置响应状态码和原因让其准确表达我们的目的。
- 详情:https://www.cnblogs.com/goloving/p/15046737.html
@EqualsAndHashCode
-
此注解会生成equals(Objectother) 和 hashCode()方法。
-
它默认使用非静态,非瞬态的属性。
-
可通过参数exclude排除一些属性
-
可通过参数of指定仅使用哪些属性
-
它默认仅使用该类中定义的属性且不调用父类的方法
-
可通过callSuper=true解决(5)中的问题,让其生成的方法中调用父类的方法。
- 关于 callSuper 的详情
@Accessors
- 详情: