• 自动装配是Spring满足bean依赖的一种方式
  • Spring会在上下文中自动寻找,并自动给bean装配属性

Spring中有三种装配方式

  • 1、在xml中显示的配置
  • 2、在Java中显示的配置
  • 3、隐式的自动装配bean(重点)

测试

要求:一个人有两个宠物

1.新建spring-05-Autowired模型

2.新建com.kuang.pojo包存放实体类对象

Cat类:

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

Dog类:

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

People类:

import com.kuang.pojo.People;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class myTest {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");People people = context.getBean("people", People.class);
//        System.out.println(people);people.getCat().shout();people.getDog().shout();}
}

3.创建配置文件beans.xml

3.1 手动装配方式

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--手动装配--><bean id="people" class="com.kuang.pojo.People"><property name="name" value="晓晓"></property><property name="dog" ref="dog"></property><property name="cat" ref="cat"></property></bean><bean id="dog" class="com.kuang.pojo.Dog"></bean><bean id="cat" class="com.kuang.pojo.Cat"></bean></beans>

3.2自动装配方式:ByName

<!--    自动装配,通过byName-->
<!--    byName:会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId
--><bean id="people" class="com.kuang.pojo.People" autowire="byName"><property name="name" value="晓晓"></property></bean>
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--    自动装配,通过byName-->
<!--    byName:会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId--><bean id="dog" class="com.kuang.pojo.Dog" /><bean id="cat" class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" autowire="byName"><property name="name" value="晓晓"></property></bean></beans>


如果不对应会出现空指针异常

3.3自动装配方式:byType

要保证类型全局唯一

   <!--    自动装配,通过byType--><!--    byType:会自动在容器上下文查找,和自己对象属性类型相同的bean保证类型全局唯一可以不填对象id,因为根据的是对象的类型--><bean  class="com.kuang.pojo.Dog" /><bean  class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" autowire="byType"><property name="name" value="晓晓"></property></bean>
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--    自动装配,通过byType--><!--    byType:会自动在容器上下文查找,和自己对象属性类型相同的bean保证类型全局唯一可以不填对象id,因为根据的是对象的类型-->
<!--    <bean id="dog" class="com.kuang.pojo.Dog" />-->
<!--    <bean id="cat" class="com.kuang.pojo.Cat" />--><bean  class="com.kuang.pojo.Dog" /><bean  class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" autowire="byType"><property name="name" value="晓晓"></property></bean></beans>

3.4自动装配方式小结:

  • byName时,要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法值一致
  • byType时,要保证bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

3.5 注解实现自动装配

jdk1.5支持的注解,Spring2.5就开始支持注解了

要使用注解须知:
1.导入约束。context约束
2.配置注解的支持: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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--    开启注解支持--><context:annotation-config/></beans>
3.5.1@Autowired
  • 直接在属性上使用即可!也可以在set方式上使用
  • 使用Autowired我们可以不再编写Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在,且符合名字byName

    科普:

@Nullable      字段标记了这个注解,说明这个字段可以为null
public @interface Autowired {boolean required() default true;
}

People对象:

package com.kuang.pojo;import org.springframework.beans.factory.annotation.Autowired;public class People {//    如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空@Autowired(required = false)private Cat cat;@Autowiredprivate Dog dog;private String 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;}@Overridepublic String toString() {return "People{" +"cat=" + cat.toString() +", dog=" + dog.toString() +", name='" + name + '\'' +'}';}
}

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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--    开启注解支持--><context:annotation-config/><!--    注解装配--><bean id="dog"  class="com.kuang.pojo.Dog" /><bean id="cat"  class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" /></beans>
3.5.2 如果@Autowired自动装配的环境比较复杂(比如bean的类型不唯一时),自动装配无法通过一个注解【@Autowired】完成时,我们可以使用@Qualifier(value=“xxx”)去配置@Autowired使用,指定一个唯一的bean对象注入

例:

people类
package com.kuang.pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;public class People {@Autowired//我们可以使用@Qualifier(value="xxx")去配置@Autowired使用,指定一个唯一的bean对象注入@Qualifier(value = "cat1")private Cat cat;@Autowired@Qualifier(value = "dog1")private Dog dog;private String 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;}@Overridepublic String toString() {return "People{" +"cat=" + cat.toString() +", dog=" + dog.toString() +", name='" + name + '\'' +'}';}
}
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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--    开启注解支持--><context:annotation-config/><!--    注解装配-->
<!--   下面bean的类型不唯一--><bean id="dog1"  class="com.kuang.pojo.Dog" /><bean id="cat1"  class="com.kuang.pojo.Cat" /><bean id="dog22"  class="com.kuang.pojo.Dog" /><bean id="cat22"  class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" /></beans>
3.5.3 @Resource注解:

●要么类型唯一
●要么名字匹配

//可以通过加name来指定名字@Resource(name = "cat12")
People类
package com.kuang.pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import javax.annotation.Resource;public class People {@Resourceprivate Cat cat;@Resourceprivate Dog dog;private String 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;}@Overridepublic String toString() {return "People{" +"cat=" + cat.toString() +", dog=" + dog.toString() +", name='" + name + '\'' +'}';}
}
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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--    开启注解支持--><context:annotation-config/><!--    注解装配-->
<!--    使用@Resource时类型唯一,名字可以不匹配-->
<!--    <bean id="dog"  class="com.kuang.pojo.Dog" />-->
<!--    <bean id="cat1"  class="com.kuang.pojo.Cat" />-->
<!--    <bean id="people" class="com.kuang.pojo.People" />--><!--    使用@Resource时类型不唯一,则至少要有一组名字匹配--><bean id="dog"  class="com.kuang.pojo.Dog" /><bean id="cat"  class="com.kuang.pojo.Cat" /><bean id="dog22"  class="com.kuang.pojo.Dog" /><bean id="cat22"  class="com.kuang.pojo.Cat" /><bean id="people" class="com.kuang.pojo.People" /></beans>
3.5.4 小结
  • @Resource和@Autowired的区别:
    相同点:
    ●都是用来自动装配的,都可以放在属性字段上
    不同点:
    ●@Autowired通过byType的方式实现,而且必须要求这个对象存在
    ●@Resource默认通过byName方式实现,如果找不到名字,则通过byType实现!如果两个都找不到,就会报错
    ●执行顺序不同:
    @Autowired通过byType的方式实现。
    @Resource默认通过byName方式实现

4.创建测试类

import com.kuang.pojo.People;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class myTest {@Testpublic void test(){//        获取Spring容器ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");People people = context.getBean("people", People.class);
//        System.out.println(people);people.getCat().shout();people.getDog().shout();}
}

Spring——Bean的自动装配相关推荐

  1. Spring精华问答 | Spring Bean的自动装配是怎么回事?

    戳蓝字"CSDN云计算"关注我们哦! Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin ...

  2. 万字详解! Spring Bean的自动装配

    点击上方 Java学习之道,选择 设为星标 每天18点,干货准时奉上! 何为自动装配 自动装配是 Spring 满足 bean 依赖的一种方式. 在使用 Spring 配置 bean 时,我们都要给配 ...

  3. 请解释Spring Bean 的自动装配?

    在Spring 框架中,在配置文件中设定bean 的依赖关系是一个很好的机制,Spring 容器还可以自动装配合作关系bean 之间的关联关系.这意味着Spring 可以通过向Bean Factory ...

  4. Spring bean的自动装配

    配置bean 配置形式:基于xml文件的方式:基于注解的方式 bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法和实例工厂方法),FactoryBean Car类 package co ...

  5. [Spring]Bean的自动装配

    Spring支持5种自动装配模式,如下: 1.no --默认情况下,不自动装配,通过"ref"attribute手动设定. 2.buName --根据Property的Name自动 ...

  6. Spring Bean的自动装配方式

    1.no:这是默认设置,表示没有自动装配.应使用显式 bean 引用进行装配. 2.byName:它根据 bean 的名称注入对象依赖项.它匹配并装配其属性与 XML文件中由相同名称定义的 bean. ...

  7. Spring之 Bean的自动装配

    什么是Spring Bean的自动装配? 自动装配是Spring满足bean依赖一种方式 Spring会在上下文种自动寻找,并自动给bean装配属性 Spring种有三种装配方式 1.在xml种显示配 ...

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

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

  9. java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...

    详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...

最新文章

  1. 【机器视觉】探索机器学习理论的最新进展,走近云、端、芯上的视觉计算
  2. 使用负载均衡SLB IPv6搞定苹果AppStore审核
  3. pycharm专业版-2017.3.3 安装+anaconda3-2019.03-windows
  4. linux 找出耗io的,linux根据io消耗找进程
  5. HDU 3683 Gomoku
  6. 工作197:判断对象里面是否有0和1
  7. 快速搭建springmvc+spring data jpa工程
  8. linux修改目录为nobody,nfs只能挂载为nobody的解决方法
  9. JMeter中持续时间设置成永远调度器才会起作用
  10. ExtJS4.2学习(七)EditorGrid可编辑表格(转)
  11. python将对象放入列表_将所有python-rom对象放入列表
  12. wpf 执行mysql命令_WPF(.net 3.5)使用MySql.Data.dll进行mysql数据库操作
  13. 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)...
  14. 一位70后的感叹:下半辈子我会陷入贫困吗?
  15. 石文软件测试,石文软件基本操作
  16. proxy_cfw全局代理_浏览器代理配置(chromium based(edge)/firefox/IDM)
  17. 免费FTP资源(比较全)
  18. html页面内容上下左右居中,HTML元素水平垂直居中实现方式(每天一个知识点)...
  19. 【其他笔记】 双屏显示分辨率低下、屏幕闪烁、暗沉等问题。
  20. 22张图带你了解IP地址有什么作用

热门文章

  1. 使用Qt二次开发周立功CAN(一)
  2. 一些常用的sql命令记录
  3. 全球wcdma运营频段
  4. POJ 1984 Navigation Nightmare 多权值并查集
  5. C++(第十三篇):二叉搜索树(二叉树进阶、二叉搜索树的结构、应用及模拟实现)
  6. uniapp集成colorUI uView2.0 Vuex
  7. 从live555 实战中了解MakeFile
  8. 【人工智能】自动驾驶的核心技术介绍
  9. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...
  10. 下次适应(Next Fit)算法 | 存储分配 | Java实现(详细注释)