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. golang.org/x/sys/unix: unrecognized

    安装的过程中报错 : package golang.org/x/sys/unix: unrecognized import path "golang.org/x/sys/unix" ...

  2. app之---豆果美食

    1.抓包 2.代码 抓取: #!/usr/bin/env python # -*- coding: utf-8 -*- #author tom import requests from multipr ...

  3. Hadoop集群搭建(六)~安装JDK

    前面集群的准备工作都做完了,本篇记录安装JDK,版本位1.8 1,在opt目录下创建software和module文件夹:software用来放安装包,module为安装目录 2,把JDK和hadoo ...

  4. Canvas方法总结

    渲染上下文 getContext() // 获得渲染上下文和它的绘画功能 绘制形状 绘制矩形 fillRect(x, y, width, height) // 绘制一个填充的矩形 strokeRect ...

  5. 关于IDEA的使用中,连接数据库console出现乱码的情况

    本人在连接数据库时也不算是出现乱码,因为乱码的解决方式百度都有,但是还是没有解决我当时遇到的问题, 首先排除navicat的问题,连接选择UTF-8的编码格式, 在Idea中使用debug调试,均可以 ...

  6. Ext.grid rowexpander的展开与收缩

    这里写Ext.grid.Panel的展开与收缩. 1. 确保在grid存在rowexpander对象: plugins: [{ ptype: 'rowexpander', rowBodyTpl: [' ...

  7. vue前端登录

    登陆流程 1.用户登录从后台获取 token,菜单数据 2.将token和菜单数据存入sessionStorage,token用来校验用户是否已经登录 2.将返回的菜单数据前端生成对应菜单列表 3.处 ...

  8. Effective Python读书笔记

    有些位置可能翻译理解的不到位,各位看官如有疑问,欢迎留言赐教. Pythonic Thinking 大家经常用Pythonic来形容python语法风格的编程方式:简单优美,没有之一:通过import ...

  9. bash中的if条件语句报错[: missing `]'

    这是我的一个小demo #!/bin/bash read -p "请输入3个数:" n1 n2 n3 if [ $n1 -gt $n2 ] && [ $n1 -gt ...

  10. 五分钟学Java:一篇文章带你搞懂spring全家桶套餐

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在 ...