【Spring】005-Bean的自动装配

tech2024-12-12  7

目录

一、概述

1、Spring中Bean的三种装配方式

2、搭建环境(显式装配)

第一步:新建一个Moudle,创建实体类Dog

第二步:创建实体类Cat

第三步:创建实体类People

第四步:创建配置文件beans.xml

第五步:创建测试类MyTest

测试结果:

二、自动装配的实现

1、byName自动装配

第一步:修改配置文件beans.xml

测试结果:

2、byType自动装配

第一步:修改配置文件beans.xml

测试结果:

3、总结

三、注解实现自动装配

1、使用注解的要求

代码示例(官方):

2、@Autowired注解(常用)

第一步:修改配置文件beans.xml

第二步:修改People类,使用Autowired注解注入dog和cat

测试结果:

Autowired注解说明:

2、@Qualifier注解(辅助@Autowired)

当有多个相同类型的bean,但我想指定注入某个bean这咋办?

第一步:修改配置文件beans.xml,添加一个id不与属性名一致的bean

第二步:修改People类,使用@Autowired + @Qualifier注解

测试结果:

3、@Resource注解(功能最强,常用)

概述:

注入逻辑:

第一步:修改People类

测试结果:

4、总结

相同点:

不同点:

关于不同点①的证明:

关于不同点②的证明:


一、概述

1、Spring中Bean的三种装配方式

①在xml中显式配置(之前用的);

②在java中显式配置(见【Spring】007-使用JavaConfig实现配置);

③隐式自动装配(重要);

 

2、搭建环境(显式装配)

第一步:新建一个Moudle,创建实体类Dog

package com.zibo.pojo; public class Dog { public void shout(){ System.out.println("汪~"); } }

第二步:创建实体类Cat

package com.zibo.pojo; public class Cat { public void shout(){ System.out.println("喵~"); } }

第三步:创建实体类People

package com.zibo.pojo; public class People { private String name; private Dog dog; private Cat cat; public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } @Override public String toString() { return "People{" + "name='" + name + '\'' + ", dog=" + dog + ", cat=" + cat + '}'; } }

第四步:创建配置文件beans.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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dog" class="com.zibo.pojo.Dog"/> <bean id="cat" class="com.zibo.pojo.Cat"/> <bean id="people" class="com.zibo.pojo.People"> <property name="name" value="訾博"/> <property name="dog" ref="dog"/> <property name="cat" ref="cat"/> </bean> </beans>

第五步:创建测试类MyTest

package com.zibo; import com.zibo.pojo.People; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); People people = context.getBean("people", People.class); people.getDog().shout(); people.getCat().shout(); } }

测试结果:

汪~ 喵~

 

二、自动装配的实现

1、byName自动装配

第一步:修改配置文件beans.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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dog" class="com.zibo.pojo.Dog"/> <bean id="cat" class="com.zibo.pojo.Cat"/> <!--byName自动装配: 会自动在上下文查找和自己对象set方法后面的值对应的bean id; 比如:setDog去查找dog,setCat去查找cat; --> <bean id="people" class="com.zibo.pojo.People" autowire="byName"> <property name="name" value="訾博"/> </bean> </beans>

测试结果:

汪~ 喵~

 

2、byType自动装配

第一步:修改配置文件beans.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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dog" class="com.zibo.pojo.Dog"/> <bean id="cat" class="com.zibo.pojo.Cat"/> <!--byType自动装配: 会自动在上下文查找和自己对象set方法后面的值对应类型的bean对象; 比如:setDog去查找dogBean,setCat去查找catBean,与id无关; --> <bean id="people" class="com.zibo.pojo.People" autowire="byType"> <property name="name" value="訾博"/> </bean> </beans>

测试结果:

汪~ 喵~

 

3、总结

使用byName实现自动装配要保证要自动装配的属性名与bean的id一直,且bean的id必须唯一的;

使用byType实现自动装配要保证存在要自动装配的属性类型对应的bean,且bean的class必须是唯一的;

 

三、注解实现自动装配

1、使用注解的要求

①导入约束:context约束;

②配置注解的支持:<context:annotation-config/>;

 

代码示例(官方):

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

 

2、@Autowired注解(常用)

第一步:修改配置文件beans.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解支持--> <context:annotation-config/> <bean id="dog" class="com.zibo.pojo.Dog"/> <bean id="cat" class="com.zibo.pojo.Cat"/> <bean id="people" class="com.zibo.pojo.People"> <property name="name" value="訾博"/> </bean> </beans>

第二步:修改People类,使用Autowired注解注入dog和cat

package com.zibo.pojo; import org.springframework.beans.factory.annotation.Autowired; public class People { private String name; @Autowired private Dog dog; @Autowired private Cat cat; public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } @Override public String toString() { return "People{" + "name='" + name + '\'' + ", dog=" + dog + ", cat=" + cat + '}'; } }

测试结果:

汪~ 喵~

Autowired注解说明:

①自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;

②反之:如果没有则注入失败,如果有多个再按照byName方式注入;

③使用范围:属性上或者set方法上,使用在属性上时set方法可以省略不写;

 

2、@Qualifier注解(辅助@Autowired)

当有多个相同类型的bean,但我想指定注入某个bean这咋办?

使用@Autowired + @Qualifier注解!

 

第一步:修改配置文件beans.xml,添加一个id不与属性名一致的bean

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解支持--> <context:annotation-config/> <bean id="dog" class="com.zibo.pojo.Dog"/> <bean id="dog1" class="com.zibo.pojo.Dog"/> <bean id="cat" class="com.zibo.pojo.Cat"/> <bean id="people" class="com.zibo.pojo.People"> <property name="name" value="訾博"/> </bean> </beans>

第二步:修改People类,使用@Autowired + @Qualifier注解

package com.zibo.pojo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; public class People { private String name; @Autowired @Qualifier("dog1") private Dog dog; @Autowired private Cat cat; public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } @Override public String toString() { return "People{" + "name='" + name + '\'' + ", dog=" + dog + ", cat=" + cat + '}'; } }

测试结果:

汪~ 喵~

 

3、@Resource注解(功能最强,常用)

概述:

这是Java原生注解,不是Spring注解,但是非常强大!

 

注入逻辑:

首先通过bean的byName注入,若无则通过@Autowired注入,可以设置name属性值用于指定bean的id,也就是一个@Resource实现了@Autowired + @Qualifier的功能;

 

第一步:修改People类

package com.zibo.pojo; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Resource; public class People { private String name; @Resource(name = "dog1") private Dog dog; @Autowired private Cat cat; public String getName() { return name; } public void setName(String name) { this.name = name; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } @Override public String toString() { return "People{" + "name='" + name + '\'' + ", dog=" + dog + ", cat=" + cat + '}'; } }

测试结果:

汪~ 喵~

 

4、总结

相同点:

都是用来自动装配,都可以放在属性字段上;

不同点:

①@AutoWired先通过byType方式自动装配,后通过byName方式自动装配;

②@Resource先通过byName方式自动装配,后通过byType方式自动装配;

 

关于不同点①的证明:

第一步:修改实体类Dog,加name属性

package com.zibo.pojo; public class Dog { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void shout(){ System.out.println("汪~"); } }

第二步:修改实体类Cat,加name属性

package com.zibo.pojo; public class Cat { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void shout(){ System.out.println("喵~"); } }

第三步:修改配置文件beans.xml,添加另一只假猫(真狗),但名字是cat

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解支持--> <context:annotation-config/> <bean id="dog1" class="com.zibo.pojo.Dog" p:name="大狗"/> <!--id为猫,类为狗,但是autowired先按类型,所以不报错,会成功注入大猫--> <bean id="cat" class="com.zibo.pojo.Dog" p:name="小猫"/> <bean id="cat1" class="com.zibo.pojo.Cat" p:name="大猫"/> <bean id="people" class="com.zibo.pojo.People"> <property name="name" value="訾博"/> </bean> </beans>

测试结果:

汪~ 小狗 喵~ 大猫

结论:

不同点①成立;

 

关于不同点②的证明:

第一步:修改配置文件beans.xml,添加另一只假狗(真猫),但名字是dog

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解支持--> <context:annotation-config/> <bean id="dog1" class="com.zibo.pojo.Dog" p:name="小狗"/> <!--id为狗,类为猫,但是resource先按名字注入,所以会报错,步会成功注入大狗--> <bean id="dog" class="com.zibo.pojo.Cat" p:name="大狗"/> <!--id为猫,类为狗,但是autowired先按类型注入,所以不报错,会成功注入大猫--> <bean id="cat" class="com.zibo.pojo.Dog" p:name="小猫"/> <bean id="cat1" class="com.zibo.pojo.Cat" p:name="大猫"/> <bean id="people" class="com.zibo.pojo.People"> <property name="name" value="訾博"/> </bean> </beans>

测试结果:

结论: 不同点②成立;

 

 

 

 

 

 

 

 

 

最新回复(0)