ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Bean的自动装配(Autowired)

2021-09-09 22:03:13  阅读:254  来源: 互联网

标签:装配 www http Autowired springframework Bean org schema


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的方式实现

标签:装配,www,http,Autowired,springframework,Bean,org,schema
来源: https://www.cnblogs.com/YanAemons/p/15248971.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有