Spring注解大全

@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中直接使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值