Spring06:AutoWired自动装配

本文详细介绍了Spring框架中的AutoWired自动装配特性,包括通过普通做法、属性和注释三种方式进行装配。讨论了如何在Person类中利用@Autowired注解装配Dog和Cat,指出注解装配时的注意事项,如required参数的使用,以及与@Resource注解的区别。虽然AutoWired简化了装配过程,但仍需配置bean标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AutoWired自动装配

现在由Person,Dog,Cat

Person里有Dog和Cat

以前的做法是Person里通过set或构造器设置Dog和Cat

现在利用autowired属性或者@AutoWired注释搞定

下面演示普通做法,属性,注释三种情况

普通做法

  1. 写三个类

    package com.xxx;
    
    public class Cat {
        public void show() {
            System.out.println("我是猫猫,喵喵喵...");
        }
    }
    
    
    package com.xxx;
    
    public class Dog {
        public void show() {
            System.out.println("我是狗狗,汪汪汪...");
        }
    }
    
    package com.xxx;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class Person {
        private Cat cat;
        private Dog dog;
    
        public void setCat(Cat cat) {
            this.cat = cat;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
        public void show() {
            System.out.println("我是人,牵着猫猫和狗狗...");
            cat.show();
            dog.show();
        }
    }
    
  2. 写xml

    <?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">
        
        <bean id="cat" class="com.xxx.Cat"/>
        <bean id="dog" class="com.xxx.Dog"/>
        <bean id="person" class="com.xxx.Person">
            <property name="dog" ref="dog"/>
            <property name="cat" ref="cat"/>
        </bean>
    
    </beans>
    
  3. 写测试类

    import com.xxx.Person;
    import org.junit.Test;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MyTest {
        @Test
        public void test01() {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
            Person person = context.getBean("person", Person.class);
            person.show();
        }
    }
    
    

属性

  1. 写三个类同上

  2. 写xml

    注意这里没有开启属性注解支持

    需要写set方法,不写会报错

    <?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="cat" class="com.xxx.Cat"/>
        <bean id="dog" class="com.xxx.Dog"/>
        <bean id="person" class="com.xxx.Person" autowire="byName" />
    
    </beans>
    
  3. 测试同上

注释

注释不需要set方法

  1. 变量声明上面加@Autowired

  2. 写xml

    <?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="cat" class="com.xxx.Cat"/>
        <bean id="dog" class="com.xxx.Dog"/>
        <bean id="person" class="com.xxx.Person"/>
    
    </beans>
    
  3. 类中dog和cat不需要set方法,只需要在定义前面加上@AutoWired注解即可

    1. 注意点:

      1. @AutoWired注解可以带参数,@Autowired(required = false)

        默认是true,如果是false对象可以为null,如果为true对象不能为null

      2. @AutoWired默认是定位dog和cat装配,比如Cat必须是cat,加上@Qualifier则按指定的name装配

         @Autowired
        @Qualifier(value = "cat1")
        
    2. @Resource注解

      高级方式,先通过byName,再通过byType,最后再报错

      1. @Resource(name = “dog”)或者@Resource的方式使用
    3. 如果带name参数先按name的名字寻找装配体

      1. 找不到则按默认的byName装配
    4. 最后按byType装配,不成功则报异常

思考:这种方式,不需要写set方法,还是得写bean标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值