@Primary
自动装配时当出现多个Bean候选者时,被注解@Primary标注的作为首选者,否则抛出异常
@Autowired
直接注入会报空指针异常
静态变量、类变量不是对象的属性,而是一个类的属性,所以静态方法是属于类(class)的,普通方法才是属于实体对象(也就是New出来的对象)的,spring注入是在容器中实例化对象,所以不能使用静态方法。
而使用静态变量、类变量扩大了静态方法的使用范围。静态方法在spring是不推荐使用的,依赖注入的主要目的,是让容器去产生一个对象的实例,然后在整个生命周期中使用他们,同时也让testing工作更加容易。
一旦你使用静态方法,就不再需要去产生这个类的实例,这会让testing变得更加困难,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例,这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做。
使用构造函数的方式注入
@Component
public class Test {
private static UserService userService;
@Autowired
public Test(UserService userService) {
Test.userService = userService;
}
}
@Autowired、@Resource和@Inject
三种注入
@Autowired:org.springframework.beans.factory.annotation.Autowired
@Resource:javax.annotation.Resource
@Inject:javax.inject.Inject
@Resource
先按名字注入,再按类型注入,都无法找到唯一的一个出现异常
@Autowired
先按类型注入,然后按照名称注入,都无法找到唯一的一个实现类则报错。
public interface Person {}
@Component
public Chinese implements Person {}
@Component
public American implements Person {}
Person有两个实现类,且都是SpringBean,所以Spring不知道注入哪一个。
方法一:如果想注入Chinese,则可取消American的@Component注解;
方法二:给第个实现类取一个名字,注入的时候按类型失败,Spring则可以通过名称注入
@Qualifier("chinese")
@Component
public Chinese implements Person {}
@Qualifier("american")
@Component
public American implements Person {}
最后使用则可以按名称:
@Autowired public Person chinese;
@Autowired public Person american;
@Inject
在Spring的环境下,@Inject和@Autowired是相同的,都是使用AutowiredAnnotationBeanPostProcessor来处理依赖注入,@Inject是jsr-330定义的规范,还是比较推荐使用这种方式进行依赖注入,如果使用这种方式,切换到Guice也是可以的。
如果硬要说两个的区别,首先@Inject是Java EE包里的,在SE环境需要单独引入。另一个区别在于@Autowired可以设置required=false而@Inject并没有这个设置选项。
@Named和Spring的@Component功能相同。@Named可以有值,如果没有值生成的Bean名称默认和类名相同。
@Bean
@Bean 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式(方法上)
@Validated和@Valid
@Valid是javax.validation.Valid包提供
@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能
@Validated和@Valid加在方法参数前,都不会自动对参数进行嵌套验证
@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。
@EnableAutoConfiguration
在SpringBoot中,这个注解告诉 Spring Boot
基于你添加的 jar 依赖去” 猜” 你想怎样配置 Spring
spring-boot-starter-web 添加了 Tomcat 和 Spring MVC,自动配置会假设你正
在开发一个 web 应用并相应的设置 Spring
@Qualifier
当多个Service实现同一个接口时,@Autowired按类型注入不知道具体使用哪一个实现。所以只能通过名称来,@Qualifier使用@Service中的名称。
@Service("oneService")
public class OneService implements IService {}
@Service("twoService")
public class TwoService implements IService {}
@Autowired
@Qualifier("twoService")
private IService twoService;
@RequestMapping、@GetMapping和@PostMapping
@GetMapping和@PostMapping
Spring 4.3引入的,是组合注解
@GetMapping是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是@RequestMapping(method = RequestMethod.POST)的缩写。
@ExceptionHandler统一异常处理
Spring 统一异常处理有 3 种方式,分别为:
1、使用 @ ExceptionHandler 注解
2、实现 HandlerExceptionResolver 接口
3、使用 @controlleradvice 注解
https://github.com/kinginblue/KingBlogSamples/tree/master/exception-handler
@RestController
相当于@Controller+@ResponseBody一起用
使用之后Controller的每个Action都不用写@ResponseBody
如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
例如:本来应该到success.jsp页面的,则其显示success
@RequestParam
public void method1(long id) {} //不传id,也不会报错
public void method2(@RequestParam("id") long id) {} //不传id会报错
public void method3(@RequestParam(required=false) long id) {} //不会也不会报错了
public void method4(@RequestParma(defaultValue="0") long id) {} //没传值,默认为0
public void method5(@RequestParam(value="myId") long id) {} //传myId进来
@RequestBody
接收的是一个json对象字符串,
默认的contentType是application/x-www-form-urlencoded; charset=UTF-8,
所以前端请求要设置dataType: "json",contentType:"application/json"
明确告诉服务器发送的是json字符串
<mvc:annotation-driven/>启用注解驱动
使用@ResponseBody注解之后,Controller返回的对象自动被转换成对应的json数据。
原理:
@ResponseBody这个注解就是使用消息转换机制,最终通过json的转换器转换成json数据的。
HttpMessageConverter接口就是Spring提供的http消息转换接口。
如果<mvc:annotation-driven>节点有子节点message-converters,那么它的转换器属性messageConverters也由这些子节点组成
@Component元注解
可以用来注解其他注解,把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
下面写这个是引入component的扫描组件
<context:component-scan base-package=”com.mmnc”>
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
使用这个注解的类,就纳入spring容器了,可以在xml中直接使用