微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【Spring】学习笔记07-Bean自动装配

自动装配是Spring满足bean依赖的一种方式!

Spring会在上下文中自动寻找,并自动给bean装配属性

 

在Spring中有三种装配的方式:

1.在xml中显式的配置

pojo类

public interface makevoice {
    public void makevoice();
}
/**
 * @author 王广元
 */
@Data
public class Cat implements makevoice{
    @Override
    public void makevoice() {
        System.out.println("miao miao");
    }
}
/**
 * @author 王广元
 */
@Data
public class Dog implements makevoice{
    @Override
    public void makevoice() {
        System.out.println("wang wang");
    }
}
@Data
@NoArgsConstructor
public class People {
    private Cat cat;
    private Dog dog;
    private String name;
}

 

ApplicationContext.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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="cat" class="com.wang.pojo.Cat"/>
    <bean id="dog" class="com.wang.pojo.Dog"/>
    <bean id="people" class="com.wang.pojo.People" p:cat-ref="cat" p:dog-ref="dog" p:name="王广元"/>
</beans>

单元测试

@Test
    public void test01(){
        ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext("ApplicationContext.xml");
        Object people = context.getBean("people");
        System.out.println(people.toString());
    }
//测试结果:People(cat=Cat(), dog=Dog(), name=王广元)

 

 

2.在java中显示配置

 

 

 

3.隐式地自动装配bean【重要】

1.byName

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="cat" class="com.wang.pojo.Cat"/>
    <bean id="dog" class="com.wang.pojo.Dog"/>

    <bean id="people1" class="com.wang.pojo.People" autowire="byName">
        <property name="name" value="poeple1_autowire_byName"/>
    </bean>
</beans>

我们通过设置autowire参数,此时为byName,通过注册bean的id实现自动装配spring容器自动在容器上下文中查找和自己对象set方法后面的值对应的bean id,

找到id=cat and id=dog的bean,并将其装配到id=people1的bean中

单元测试

   @Test
    public void test03(){
        ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext("ApplicationContext.xml");
        People people1 = (People) context.getBean("people1");
        System.out.println(people1.toString());
    }
//测试结果:People(cat=Cat(), dog=Dog(), name=poeple1_autowire_byName)


 

2.byType

<!--    bytype:会自动查找容器上下文中,和自己对象属性相同的bean-->
    <bean id="people2" class="com.wang.pojo.People" autowire="byType">
        <property name="name" value="people+autowire_bytype"/>
    </bean>

缺点:bean上下文中只允许注册class类的一个bean,当注册多个时,会报错

单元测试

 @Test
    public void test02(){
        ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext("ApplicationContext.xml");
        People people2 = (People) context.getBean("people2");
        System.out.println(people2.toString());
    }

小结:

  • byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set的值保持一致!
  • byname的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型保持一致!

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐