Spring中三种装配方式

Spring中三种装配方式:

  1. 在xml中显示配置
  2. 在java中显示配置
  3. 隐式的自动装配【*】

这里我们主要将自动装配

1.自动装配

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

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

2.搭配环境

  1. people(一个人有两个宠物),cat,dog;编写实体类
    public class People {
       private String name;
       private Cat cat;
       private Dog dog;
       }
    
    public class Dog {
       public void shout(){
           System.out.println("wang");
       }
    }
    
    public class Cat {
    
       public void shout(){
           System.out.println("miao");
       }
    }
    
  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"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd">
    
       <bean id="cat" class="com.zhaox.pojo.Cat"/>
       <bean id="dog" class="com.zhaox.pojo.Dog"/>
       <bean id="people" class="com.zhaox.pojo.People">
           <property name="name" value="zhaox"/>
           <property name="cat" ref="cat"/>
           <property name="dog" ref="dog"/>
       </bean>
    </beans>
    

7.3ByName自动装配

在上面例子中,dog和cat都需要注入,那有没有一种办法能够自动注入呢

我们可以通过自动装配的方式实现。

首先在people的装配中删去dag和cat的装配,同时在bean标签中添加autowirs

<bean id="people" class="com.zhaox.pojo.People" autowire="byName">
    <property name="name" value="zhaox"/>
</bean>

注意:通过byName的方式自动装配,是查询了set方法后的字段,属性名为小写,set方法后的名字就是大写,但是Spring 会自动把大写转为小写,再去spring容器中查找对应id,所以一定要注意驼峰命名

7.4ByType自动装配

我们也可以通过类型来实现自动装配,但注意:前提是对象的每个类型只有一个值

<bean id="people" class="com.zhaox.pojo.People" autowire="byType">
    <property name="name" value="zhaox"/>
</bean>

这种方式是通过检测容器中与pojo中引用的类型进行匹配,当然,如果有两个以上同类型的引用,这种方式就会报错

小结

Byname原理:
在容器上下文中查找,对象set方法后面的值对应的beanID

​ 要保证所有bean的id唯一,bean需要和自动注入的set方法后的名字一致。

ByType原理:
在容器上下文中查找,对象属性类型相同的beanID

​ 保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致。

7.5注解实现自动装配

<?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/>

</beans>    

大多数情况,我们都是使用注解开发,而不是用XML,因为XML是比较麻烦的

使用注解需要:

  1. 导入约束
    xmlns:context="http://www.springframework.org/schema/context"
    
    http://www.springframework.org/schema/context
    https://www.springframework.org/schema/context/spring-context.xsd">
    
  2. 配置注解的支持
    <context:annotation-config/>
    

例子:

```xml
<bean id="dog333" class="com.zhaox.pojo.Dog"/>
<bean id="people" class="com.zhaox.pojo.People" />
```

```java
@Autowired
@Qualifier(value = "dog333")
private Dog dog;
```

注意,我们需要将@Autowired注解放在People类的属性上,而不是Dao类和Cat类的属性上,同时我们也需要将Dog和Cat类都在配置文件里注册为bean

小结:

resource和autowired的区别:

  • 都用来自动装配
  • 都放在属性字段上
  • resouce默认通过byname方式实现,如果找不到名字通过byType实现

醉后不知天在水,满船清梦压星河