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();注释掉,可以看到也可以运行成功)
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号