使用注解实现自动装配

jdk1.5支持的注解, Spring2.5就支持注解了~
The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML
要使用注解须知:

  1. 导入约束 [必须要有context约束]
  2. 配置注解的支持: 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实现
03-11 06:04