目录
一、概述
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>
测试结果:
结论: 不同点②成立;