Bean的自动装配(Autowired)

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

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

在Spring中有三种自动装配的方式

  1. 在xml中显示的配置

  2. 在java中显示配置

  3. 隐式的自动装配

Person类

 public class Person {
     private Dog dog;
     private Cat cat;
     private String 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;
    }
 ​
     public String getName() {
         return name;
    }
 ​
     public void setName(String name) {
         this.name = name;
    }
 }
 ​
  1. byName

 <?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-3.0.xsd">
 ​
     <bean id="cat" class="Cat"/>
     <bean id="dog" class="Dog"/>
 ​
     <bean id="person" class="Person" autowire="byName">
     </bean>
 ​
 ​
 ​
 </beans>

会自动在容器上下文中差找,和自己对象set方法后面的值对应bean id

  1. byTyep

     <?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-3.0.xsd">
     ​
         <bean id="cat" class="Cat"/>
         <bean id="dog222" class="Dog"/>
     ​
         <bean id="person" class="Person" autowire="byType">
         </bean>
     ​
     ​
     ​
     </beans>

    会自动在容器上下文中差找,和自己对象属性类型相同的bean,但只有保证全局只有一个时才能运行,否则会报错

        // 因为出现了两个dog type所以会报错
      <bean id="cat" class="Cat"/>
         <bean id="dog222" class="Dog"/>
         <bean id="dog2" class="Dog"/>

小结

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

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

使用注解进行装配

xml注解包的导入

开启注解的支持

 <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
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 ​
    <context:annotation-config/>// 开启注解的支持
    <!-- bean definitions go here -->
 ​
 </beans>

Person类

 import org.springframework.beans.factory.annotation.Autowired;
 ​
 public class Person {
 ​
     @Autowired
     private Dog dog;
     @Autowired
     private Cat cat;
     private String name;
 ​
     public Dog getDog() {
         return dog;
    }
 ​
 ​
     public Cat getCat() {
         return cat;
    }
 ​
 ​
     public String getName() {
         return 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
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 ​
     <context:annotation-config/>
 ​
     <bean id="cat" class="Cat"/>
     <bean id="dog" class="Dog"/>
     <bean id="person" class="Person"/>
 ​
 </beans>

@Autowired直接在属性上使用即可,也可以在set方式上使用

使用@Autowired我们可以不用编写Set方法,前提是你这个自动装配的属性在IOC(Spring)容器中存在,且符合名字byName

扩充

 @Nullable // 字段标记了这个注解,表示这个字段可以为null
 @Autowired(required = false)
 // 如果显式定义了Autowired的required实行为false,说明这个对象可以为null,否则不允许为空

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value="xxx")去配置@Autowired的使用,指定一个唯一的bean对象注入

 public class Person {
 ​
     @Autowired
     @Qualifier(value="cat111")
     private Dog dog;
     @Autowired
         @Qualifier(value="dog222")
     private Cat cat;
     private String name;
  }

@Resource注解

 public class Person{
  @Resource(name = "cat2")
  private Cat cat;
 
  @Resource()
  private Dog dog
 }

小结:

@Resource和@Autowired的区别

  • 都是用来自动装配的,都可以放在属性字段上

  • @Autowired通过byType的方式实现,而且必须要求这个对象存在

  • @Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现,如果两个都找不到才报错

  • 执行顺序不同: @Autowired通过byType的方式实现

Bean的自动装配(Autowired)的更多相关文章

  1. 20、自动装配-@Autowired&@Qualifier&@Primary

    20.自动装配-@Autowired&@Qualifier&@Primary 自动装配:Spring 利用依赖注入(DI),完成对IOC容器中各个依赖关系赋值 20.1 @Autowi ...

  2. Spring——自动装配(@Autowired/@Profile/底层组件)

    本文介绍Spring中关于自动装配的方法和规则,以及@Profile动态激活的用法和一个例子. 一.@Autowired自动装配 @Autowired注解可以加在构造器.属性.方法.方法参数上. 自动 ...

  3. Spring(三):bean的自动装配

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

  4. Spring-04 Bean的自动装配

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

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

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

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

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

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

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

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

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

  9. Spring bean的自动装配属性

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

  10. 自动装配[@Autowired]的歧义性

    在使用@Autowired自动装配时,如果一个接口有多个实现类,那么自动装配就会出现错误,因为Spring无法判断到底要装配哪个实现类实例(bean). 1.可以使用@Qualifier(" ...

随机推荐

  1. uniapp+uView搜索列表变颜色

    首先看一下页面效果: <template> <view class="page"> <b-nav-bar title="公司多维图" ...

  2. sqlite3 一条语句替换全表某个字符字段中的某个字符串

    update not_match_files set policy_id_tms = replace(policy_id_tms, substr(policy_id_tms,instr(policy_ ...

  3. 【转载】Python 在已存在的excel表格中写入数据

    由于每天都要汇总日报数据,其实就是个复制粘贴的工作,将多个表的数据汇总成一个表格,工作较枯燥,于是想到用Python帮我完成这个简单又粗糙的工作.写一下我学到的几个小技巧,下次忘记怎么使用的时候,还能 ...

  4. springMVC的定时器

    大家好,本人从事软件行业已有8年,大部分时间从事软件开发编写工作.好了废话少说了哈哈哈,直接干货. 在Java开发过程中有很多业务需求里面需要我们实时处理一些动态的业务比如库存的数据动态更新,实时数据 ...

  5. ACwing语法基础课第一节课例题与习题及个人总结

    第一次课例题 若涉及到浮点数的计算,float一般是6到7位有效数字,double一般是15到16位有效数字,但是为了方便起见,建议直接设为double,因为若涉及浮点数的乘除运算,使用float类型 ...

  6. filter CTF

    filter CTF 输入url http://dc1ce3ad-eed4-48fd-a068-71aef12f7654.node.vaala.ink?file=demo.php 参考题目filter ...

  7. C++ STL的简单应用(vector容器专题)

    #include <iostream> #include <string> #include <stdlib.h> #include <vector> ...

  8. JavaScript 包装类

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. idea导入数据库

    yml文件(在启动项文件(main)里,eg:springbook文件里面) sh-bean里org.example.sh.beans的Category类   CategoryDAO名字要和Categ ...

  10. Net异步委托-泛型委托Action<T>与Func<T,TResult>及 异步调用AsyncCallback

    1.相同点 Func<ReqMode,ResultModel> 与 Action<ReqMode> 1).都是Net3.5 之后内置的委托方法,作用几乎一致 2).都支持lam ...