使用注解实现自动装配
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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://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;
@Autowiredprivate 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;
这些都是Spring的注解没有导入Spring是用不了的
@Resource注解
如果不用这些注解我们还有一个基于Java的注解 @Resource 用它也可以实现自动装配
这个注解是一个集合体, 它会通过名字先去查找, 名字找不到的情况下它会通过类型去查找 如果两个都找不到的情况下它才会报错
这个注解有一个name默认为空我们可以去给它指定
比如场景如下:
public class People {
// 如果显示定义了Autowired的required属性为false, 说明这个对象可以为Null,否则不允许为空
@Resource(name = "cat2")private Cat cat;
@Resourceprivate 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;
@Resourceprivate Dog dog;private String name;
虽然说自动装配的注解有两个, 但是一般最常用的是@Autowired一般@Autowired就够了, 因为我们知道所有的东西是单例的一般设置一个就够用了, 在大多数网站里最常见就是@Autowired注解并不会去使用@Resource但是@Resource功能会强大一点, 效率会差那么一丢丢
小结:
@Resource 和 @Autowired 的区别:
相同点:
- 都是用来自动装配的, 都可以放在属性字段上
不同点:
-
@Autowired 通过byType的方式实现,而且必须要求这个对象存在, 不然就空指针了, 虽然可以手动@Nullable让它字段为空但是还是解决不了它本质的问题 [常用]
-
@Resource 默认通过byName的方式实现 , 如果找不到名字, 则通过byType实现~~如果两个都找不到就完了,就报错 [常用]
-
@Resource是@Autowired和@Qualifier的集合体
-
执行顺序不同:
- @Autowired 通过byType的方式实现
- @Resource 默认通过byName的方式实现 , 如果找不到名字, 则通过byType实现