Bean的自动装配

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

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

Spring中三种装配方式

  1. 在xml中显式的配置。

  2. 在java中显式的配置

  3. 隐式的自动装配bean

java中显式的配置

环境搭建

  • cat

package com.rzp.pojo;

public class Cat {
public void shout(){
System.out.println("meow~");
}
}
  • dog

package com.rzp.pojo;

public class Dog {
public void shout(){
System.out.println("wang!");
}
}
  • people

package com.rzp.pojo;

public class People {
private Cat cat;
private Dog dog;
private String name;

@Override
public String toString() {
return "People{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}

public Cat getCat() {
return cat;
}

public void setCat(Cat cat) {
this.cat = cat;
}

public Dog getDog() {
return dog;
}

public void setDog(Dog dog) {
this.dog = dog;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

ByName自动装配

  • xml

  • 在bean中设置autowire为byName

  • 实例化对象的时候会自动在上下文中查找和自己对象set方法后面的值对应的beanId

<?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.rzp.pojo.Cat"/>
<bean id="dog" class="com.rzp.pojo.Dog"/>

<!--会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId-->
<bean id="people" class="com.rzp.pojo.People" autowire="byName">
<property name="name" value="rzp"/>
</bean>

</beans>
  • 比如people有setCat方法,就会在上下文中找id为cat的对象,并自动注入。

  • 测试类

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();
}
}

  • 因此如果把dog的id修改后,就不能注入了。

<bean id="dog1" class="com.rzp.pojo.Dog"/>

ByType自动装配

  • 在bean中设置autowire为byType

  • 实例化对象的时候会自动在上下文中查找和自己对象set方法相同的对象

  • 这种情况想完全只看类型,可以不写类的名字。

    <bean  class="com.rzp.pojo.Dog"/>

<!--会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId-->
<bean id="people" class="com.rzp.pojo.People" autowire="byName">
<property name="name" value="rzp"/>
</bean>
  • 测试:Dog也被注入到people中去了

  • 但是如果people中有多个Dog就会报错。

总结

  • ByName:保证bean的id唯一,而且和注入的set方法值一致。

  • ByType:保证bean的class唯一,并且和注入的类型一致。

注解自动装配

  • The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML. ----使用注解比xml更好。

使用注解:

  • 注意aop这个包导入成功

  1. 导入约束

xmlns:context="http://www.springframework.org/schema/context"
  1. 配置注解的支持

    <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>
  1. 在bean的属性上增加@Autowired注解,spring会自动根据id在xml文件中查找,找不到就找唯一的同类,如果也没有就会报错。

    • 这种情况还可以增加Qualifier注解指定id的名字

  • 示例

public class People {
@Autowired
private Cat cat; //使用注解以后,set方法也可以不需要
@Autowired
private Dog dog;
private String name;
.....
  • 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: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/>

<bean id="cat" class="com.rzp.pojo.Cat"/>
<bean id="dog" class="com.rzp.pojo.Dog"/>
<bean id="people" class="com.rzp.pojo.People"/>


</beans>
  • 使用Autowired,可以加在属性上面,也可以加在set方法上面。

  • 使用Autowired和xml不同,不必要给set方法。

拓展

@Nullable 说明字段可以为空
   
@Autowired 可以输入参数
@Autowired(required=false)默认为true,如果设置为false,就允许为null(如果不允许为null,实例化会报错)

显式指定装配的

如果xml中有多个相同类的配置,可以增加Qualifier直接配置id

示例:

    <bean id="cat" class="com.rzp.pojo.Cat"/>
<bean id="dog" class="com.rzp.pojo.Dog"/>
<bean id="dog1" class="com.rzp.pojo.Dog"/>
<bean id="people" class="com.rzp.pojo.People"/>
@Autowired
@Qualifier("dog")
private Dog dog;

使用Resource注解

  • Resource是Java提供的注解,不是spring的

    <bean id="cat" class="com.rzp.pojo.Cat"/>
<bean id="dog31" class="com.rzp.pojo.Dog"/>
<bean id="dog1" class="com.rzp.pojo.Dog"/>
<bean id="people" class="com.rzp.pojo.People"/>

@Resource
private Cat cat;
@Resource(name = "dog1")
private Dog dog;
private String name;

Spring(三):bean的自动装配的更多相关文章

  1. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  2. Spring学习03(Bean的自动装配)

    6.Bean的自动装配 6.1 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean的三种装配机 ...

  3. spring实战二之Bean的自动装配(非注解方式)

    Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...

  4. Spring(三)之自动装配、表达式

    自动装配 自动装配(autowire)协作者 Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自动让Spring通过检查BeanFact ...

  5. Spring学习--xml 中 Bean 的自动装配

    Spring IOC 容器可以自动装配 Bean. 只要在 <bean> 的 autowire 属性里指定自动装配的模式. byName(根据名称自动装配):必须将目标 Bean 的名称和 ...

  6. bean的自动装配,使用注解开发,使用java的方式配置Spring

    bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...

  7. Spring bean的自动装配属性

    bean的自动装配属性能简化xml文件配置. bean 的自动装配属性分为四种: 1.byName 2.byTyoe 3.constructor 4. autodetect byName: 它查找配置 ...

  8. Bean的自动装配及作用域

    1.XML配置里的Bean自动装配 Spring IOC 容器可以自动装配 Bean,需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式.自动装配方式有: by ...

  9. Spring学习(六)-----Spring使用@Autowired注解自动装配

    Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...

随机推荐

  1. DataFrame简介(一)

    1. DataFrame 本片将介绍Spark RDD的限制以及DataFrame(DF)如何克服这些限制,从如何创建DataFrame,到DF的各种特性,以及如何优化执行计划.最后还会介绍DF有哪些 ...

  2. CentOS7采用tar.gz包方式安装Mysql5.7

    软件:VMware Linux版本:CentOS 7 一.安装mysql(采用tar.gz包安装Mysql5.7) 1.安装开发工具包 [root@localhost ~]# yum groups m ...

  3. 「踩坑记」Android API 判断权限申请结果的闪退问题

    这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...

  4. vmware导入ova文件踩坑记

    问题来源 众所周知,所有的网络行为都会产生相应的网络流量,那么所有的网络攻击行为也有其对应的流量特点,那么是否能根据流量特点进而分析出其对应的是什么攻击行为呢? 我在虚拟机上使用vulnhub的靶场环 ...

  5. c# 使用Newtonsoft.Json解析JSON数组

    一.获取JSon中某个项的值 要解析格式: [{"VBELN":"10","POSNR":"10","RET_ ...

  6. 深入理解JAVA字符串常量池

    初学JAVA时,在学习如何比较两个字符串是否相等,大量资料告诉我,不能用等于号( = )去比较,需要使用equals方法,理由是String是一个对象,等号此时比较的是两个字符串在java内存堆中的地 ...

  7. CDNbest-设置不缓存

    写在开始之前 有时候根据业务需求,我们网站不需要缓存,这时候就需要设置下 让网站不走缓存 步骤一 登录平台找到我们的站点->站点设置->缓存设置 如图 备注:填写需要操作的域名,时间为&q ...

  8. Visual Studio2019+OpenCV3.4.9环境搭建

    让人头疼的vs2019+opencv环境配置 准备: visual studio2019: opencv 3.4.9: 耐心: 说明:vs2019属性管理器没有Microsoft.Cpp.x64.us ...

  9. [BFS]Codeforces Igor In the Museum

     Igor In the Museum time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. OpenCV-Python 理解特征 | 三十六

    目标 在本章中,我们将尝试理解什么是特征,为什么拐角重要等等 解释 你们大多数人都会玩拼图游戏.你会得到很多小图像,需要正确组装它们以形成大的真实图像.问题是,你怎么做?将相同的理论投影到计算机程序上 ...