8.2.7 Spring5新增的注解

8.2.7 Spring5新增的注解

在使用@Autowired注解执行自动装配时,该注解可指定一个required属性,该required属性默认为true这意味着该注解修饰的Fieldsetter方法必须被依赖注入,否则Spring会在初始化容器时报错。

@Autowired注解自动装配与XML中autowire=”byType”自动装配的区别

@Autowired与在XML中指定autowire="byType"的自动装配存在区别:

  • autowire="byType的自动装配如果找不到自动装配的候选Bean, 则Spring容器只是不执行注入,并不报错;
  • @Autowired的自动装配如果找不到自动装配的候选Bean, Spring容器会直接报错

如何让@Autowired自动装配在找不到候选Bean是不报错

为了让@Autowired的自动装配找不到候选Bean时不报错(只是不执行依赖注入),现在有两种解决方式:

  1. @Autowiredrequired属性指定为false
  2. 使用Spring5新增的@Nullable注解。

程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\Nullable
└─src\
├─beans.xml
├─lee\
│ └─SpringTest.java
└─org\
└─crazyit\
└─app\
└─service\
├─Dog.java
├─impl\
│ ├─Chinese.java
│ └─GunDog.java
└─Person.java

如下代码示范了这两种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class Chinese implements Person
{
private Dog dog;
@Autowired(required = false)
public void setGunDog(@Nullable Dog dog)
{
this.dog = dog;
}
public void test()
{
System.out.println("我是一个普通人,养了一条狗:" + dog.run());
}
}

上面程序同时使用了两种方式来指定setGunDog()方法找不到被装配的Bean时不报错,实际上只需要使用其中之一即可。也就是说,如果给@Autowired指定了required=false属性,就可以不使用@Nullable注解;如果使用@Nullable 注解,就可以不给@Autowired指定了required=false属性;

Spring5其他新注解

此外, Spring5还引入了如下新的注解。

注解 描述
@NonNull 该注解主要**用于修饰参数**、返回值和Field,声明它们不允许为null
@NonNullApi 该注解用于修饰,表明该包内API的参数、返回值都不应该为null。如果希望该包内某些参数、返回值可以为null则需要使用@Nullable修饰它们。
@NonNullFields 该注解也用于修饰,表明该包内的Field都不应该为null如果希望该包内某些Field可以为null,则需要使用@Nullable修饰它们。

这三个NonNullxxx注解的区别

从上面介绍不难看出,这三个注解的功能基本相似,区别只是作用范围不同:

  • @NonNull每次只能影响被修饰的参数返回值Field;
  • @NonNullApi@NonNullFields则会对整个包起作用。其中,
    • @NonNullApi的作用范围是包内所有参数+返回值;
    • @NonNullFields的作用范围是包内所有Field