使用注解实现自动装配
jdk1.5支持的注解, Spring2.5就支持注解了~
The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML
要使用注解须知:
- 导入约束 [必须要有context约束]
- 配置注解的支持: context:annotation-config/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解的支持不加无效-->
<context:annotation-config/>
</beans>
@Autowired注解
直接在属性上用即可~ 也可以在set方式上使用~
使用Autowired我们可以不用编写Set方法了, 前提是你这个自动装配的属性IOC (Spring)容器中存在, 且符合名字byName
注解使用反射技术来实现的
科普:
@Nullable 字段标记了这个注解, 说明这个字段可以为Null
public @interface Autowired {
boolean required() default true; //布尔值默认为真
}
测试代码:
public class People {
// 如果显示定义了Autowired的required属性为false, 说明这个对象可以为Null,否则不允许为空
@Autowired(required = false)
private Cat cat;
@Autowired
private Dog dog;
private String name;
如果@Autowired自动装配的环境比较复杂, 自动装配无法通过一个注解[@Autowired]完成的时候, 我们可以使用 @Qualifer(value=“xxx”)去配合@Autowired的使用, 指定一个唯一的bean对象注入
import io.micrometer.common.lang.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class People {
// 如果显示定义了Autowired的required属性为false, 说明这个对象可以为Null,否则不允许为空
@Autowired(required = false)
@Qualifier(value = "cat")
private Cat cat;
@Autowired
@Qualifier(value = "dog222")
private Dog dog;
private String name;
@Resource注解
如果不用这些注解我们还有一个基于Java的注解 @Resource 用它也可以实现自动装配
这个注解有一个name默认为空我们可以去给它指定
比如场景如下:
public class People {
// 如果显示定义了Autowired的required属性为false, 说明这个对象可以为Null,否则不允许为空
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
private String name;
<!--注解的支持不加无效-->
<context:annotation-config/>
<bean id="cat1" class="com.jean.pojo.Cat"/>
<bean id="cat2" class="com.jean.pojo.Cat"/>
<bean id="dog" class="com.jean.pojo.Dog"/>
<bean id="people" class="com.jean.pojo.People"/>
</beans>
运行后他开始找—>它通过名字id="找不到对应的"他又开始继续找—>有两个Cat类型这样也不行他不知道拿那个就会报错
解决方法: 要么把他的注解改为一个唯一的,
要么去注解指定一个类
@Resource(name = “cat2”)
public class People {
// 如果显示定义了Autowired的required属性为false, 说明这个对象可以为Null,否则不允许为空
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
private String name;
小结:
@Resource 和 @Autowired 的区别:
相同点:
- 都是用来自动装配的, 都可以放在属性字段上
不同点:
-
@Autowired 通过byType的方式实现,而且必须要求这个对象存在, 不然就空指针了, 虽然可以手动@Nullable让它字段为空但是还是解决不了它本质的问题 [常用]
-
@Resource 默认通过byName的方式实现 , 如果找不到名字, 则通过byType实现~~如果两个都找不到就完了,就报错 [常用]
-
@Resource是@Autowired和@Qualifier的集合体
-
执行顺序不同:
- @Autowired 通过byType的方式实现
- @Resource 默认通过byName的方式实现 , 如果找不到名字, 则通过byType实现