Autowired和Resource详解
Autowired和Resource详解
概述
本文主要讲述注解注入bean的方式,主要讲解@Autowired和@Resource注解
一如既往推荐狂神的视频,看了这么多视频,到今天终于理解了什么是bean...
实践一下
其实本文就是讲怎么把xml中autowired给换成注解方式进行注入
还是那个背景:一人一猫一狗
猫类
package com.kuangstudy;
/**
* 功能描述
*
* @since 2022-06-26
*/
public class Cat {
public void shout() {
System.out.println("miao~");
}
}
狗类
package com.kuangstudy;
/**
* 功能描述
*
* @since 2022-06-26
*/
public class Dog {
public void shout() {
System.out.println("wang~");
}
}
人类
package com.kuangstudy;
import javax.annotation.Resource;
/**
* 功能描述
*
* @since 2022-06-26
*/
public class Person {
private String name;
// @Autowired(required = false)
// @Qualifier("cat2")
@Resource(name = "cat1")
private Cat cat;
// @Autowired
// @Qualifier("dog1")
@Resource(name = "dog1")
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", cat=" + cat +
", dog=" + dog +
'}';
}
}
测试类
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.kuangstudy.Person;
/**
* 功能描述
*
* @since 2022-06-26
*/
public class Test02 {
@Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Person person = applicationContext.getBean("xiaohong", Person.class);
person.getCat().shout();
person.getDog().shout();
}
}
配置文件
<?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 />
<bean id="cat2" class="com.kuangstudy.Cat"></bean>
<bean id="dog2" class="com.kuangstudy.Dog"></bean>
<bean id="dog1" class="com.kuangstudy.Dog"></bean>
<bean id="cat1" class="com.kuangstudy.Cat"></bean>
<bean id="xiaohong" class="com.kuangstudy.Person"></bean>
</beans>
重点及总结
配置文件中注意事项
- 添加上下文配置空间及约束
<beans xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
- 添加上下文注解配置,可以被注解解析
<context:annotation-config />
@Autowired和@Resource的区别
这块建议一定要去练习
- 两者都是导入bean的注解,都可以用在属性或者方法上实现bean的自动装配,一般用在属性上
- @Autowired是Spring的注解 @Resource是java的注解
- 两者都能通过ByName和ByType两种方式实现自动装配 @Autowired默认使用ByType方式,@Resource默认使用ByName方式
- 两者功能相似,相较来说@Resource功能会更加强大,@Autowired性能可能更好一些(狂神说的,我这边没有依据)
- 在bean类型有多个实例且不能通过ByName方式装配注入的时候,@AutoWired搭配@Qualifier("")一起指定注入的bean @Resource(name="")来实现
- @Autowired(required = false) 支持某个bean为空不导入(在cat属性上添加该字段,beans.xml中把Cat对象全部注释掉,测试的时候把
person.getCat().shout();
注释掉,可以看到也可以运行成功)