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>

重点及总结
配置文件中注意事项

  1. 添加上下文配置空间及约束
    <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">
    
  2. 添加上下文注解配置,可以被注解解析
    <context:annotation-config />
    

@Autowired和@Resource的区别
这块建议一定要去练习

  1. 两者都是导入bean的注解,都可以用在属性或者方法上实现bean的自动装配,一般用在属性上
  2. @Autowired是Spring的注解 @Resource是java的注解
  3. 两者都能通过ByName和ByType两种方式实现自动装配 @Autowired默认使用ByType方式,@Resource默认使用ByName方式
  4. 两者功能相似,相较来说@Resource功能会更加强大,@Autowired性能可能更好一些(狂神说的,我这边没有依据)
  5. 在bean类型有多个实例且不能通过ByName方式装配注入的时候,@AutoWired搭配@Qualifier("")一起指定注入的bean @Resource(name="")来实现
  6. @Autowired(required = false) 支持某个bean为空不导入(在cat属性上添加该字段,beans.xml中把Cat对象全部注释掉,测试的时候把person.getCat().shout();注释掉,可以看到也可以运行成功)
posted @ 2022-06-28 09:22  Oh,mydream!  阅读(196)  评论(0编辑  收藏  举报