0
点赞
收藏
分享

微信扫一扫

【Spring】005-Bean的自动装配


目录

​​一、概述​​

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

测试结果:

【Spring】005-Bean的自动装配_spring

结论:
不同点②成立;

 

 

 

 

 

 

 

 

 

举报

相关推荐

0 条评论