<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【Spring】Bean的自動裝配(Autowird)和注解開發(Annotation)

      Bean的自動裝配 和 注解開發

      本文介紹了Spring框架中Bean的自動裝配機制,重點講解了通過注解實現自動裝配的方法。
      主要內容包括:
      Bean自動裝配的概念和三種裝配機制(XML顯式配置、Java顯式配置、隱式自動裝配)
      自動裝配的兩個關鍵操作:組件掃描和依賴注入 按名稱(byName)和按類型(byType)自動裝配的實現方式及注意事項 重點推薦使用注解方式(@Autowired)實現自動裝配。

      Bean的自動裝配 :Autowired

      • 自動裝配是使用spring滿足bean依賴的一種方法
      • spring會在應用上下文中為某個bean尋找其依賴的bean。

      Spring中bean有三種裝配機制,分別是:

      1. xml中顯式配置; beans.xml /applicationContext.xml
      2. java中顯式配置;
      3. 隱式的bean發現機制和自動裝配。[重要]

      這里我們主要講第三種:自動化的裝配bean

      Spring的自動裝配需要從兩個角度來實現,或者說是兩個操作:

      1. 組件掃描(component scanning):spring會自動發現應用上下文中所創建的bean;
      2. 自動裝配(autowiring):spring自動滿足bean之間的依賴,也就是我們說的IoC/DI

      組件掃描自動裝配組合發揮巨大威力,使的顯示的配置降低到最少。

      推薦不使用自動裝配**<font style="color:#DF2A3F;">xml</font>**配置 , 而使用注解 .

      1、測試環境搭建

      1. 新建一個項目
      2. 新建兩個實體類,Cat Dog 都有一個叫的方法
      public class Cat {
          public void shout() {
              System.out.println("miao~");
          }
      }
      
      public class Dog {
          public void shout() {
              System.out.println("wang~");
          }
      }
      
      1. 新建一個用戶類 User
      package com.demo.pojo;
      
      import org.springframework.beans.factory.annotation.Autowired;
      
      
      public class Person {
      
          private String name;
      
          private Cat cat;
      
          private Dog dog;
      
          public Person() {
          }
      
          public Person(String name, Cat cat, Dog dog) {
              this.name = name;
              this.cat = cat;
              this.dog = dog;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.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;
          }
      }
      
      
      1. 編寫Spring配置文件
      <?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.xsd">
      
        <bean id="dog" class="com.demo.pojo.Dog"/>
        <bean id="cat" class="com.demo.pojo.Cat"/>
      
        <bean id="person" class="com.demo.pojo.Person">
          <property name="name" value="zhang"/>
          <property name="cat" ref="cat"/>
          <property name="dog" ref="dog"/>
        </bean>
      </beans>
      
      1. 測試
      public class MyTest {
          @Test
          public void testMethodAutowire() {
              ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
              Person person = (Person) context.getBean("person");
              person.getCat().shout();
              person.getDog().shout();
          }
      }
      

      結果正常輸出,環境OK

      2、按名稱 byName

      autowire byName (按名稱自動裝配)

      由于在手動配置xml過程中,常常發生字母缺漏和大小寫等錯誤,而無法對其進行檢查,使得開發效率降低。

      采用自動裝配將避免這些錯誤,并且使配置簡單化。

      測試:

      1. 修改bean配置,增加一個屬性 autowire=”byName”
      <bean id="user" class="com.kuang.pojo.User" autowire="byName">
          <property name="str" value="zhang"/>
      </bean>
      
      1. 再次測試,結果依舊成功輸出!
      2. 我們將 cat 的bean id修改為 catXXX,同一個實體類有兩個 bean 注入
      <bean id="cat1" class="com.demo.pojo.Cat"/>
      <bean id="cat" class="com.demo.pojo.Cat"/>
      <bean id="dog" class="com.demo.pojo.Dog"/>
      
      1. 再次測試, 執行時報空指針java.lang.NullPointerException。因為按byName規則找不對應set方法,真正的setCat就沒執行,對象就沒有初始化,所以調用時就會報空指針錯誤。

      小結:

      當一個bean節點帶有 autowire ``byName的屬性時。

      1. 將查找其類中所有的set方法名,例如setCat,獲得將set去掉并且首字母小寫的字符串,即cat。
      2. 去spring容器中尋找是否有此字符串名稱id的對象。
      3. 如果有,就取出注入;如果沒有,就報空指針異常。

      3、按類型 byType

      autowire byType (按類型自動裝配)

      使用autowire byType首先需要保證:同一類型的對象,在spring容器中 唯一。如果不唯一,會報不唯一的異常。NoUniqueBeanDefinitionException

      測試:

      1. 將user的bean配置修改一下 : autowire="byType"
      2. 測試,正常輸出
      3. 在注冊一個cat 的bean對象!
          <bean id="cat1" class="com.demo.pojo.Cat"/>
          <bean id="cat" class="com.demo.pojo.Cat"/>
          <bean id="dog" class="com.demo.pojo.Dog"/>
      
      <bean id="user" class="com.demo.pojo.User" autowire="byType">
        <property name="str" value="Person Wang"/>
      </bean>
      
      1. 測試,報錯:NoUniqueBeanDefinitionException
      2. 刪掉cat1,將cat的bean名稱改掉!測試!因為是按類型裝配,所以并不會報異常,也不影響最后的結果。甚至將id屬性去掉,也不影響結果。

      這就是按照類型自動裝配!

      4、使用注解 [重點]

      jdk1.5開始支持注解,spring2.5開始全面支持注解。

      準備工作:** 利用注解的方式注入屬性。 **

      Using @Autowired :: Spring Framework

      <?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. 在spring配置文件中引入context文件頭
      • xmlns:context="http://www.springframework.org/schema/context"
      • [http://www.springframework.org/schema/context](http://www.springframework.org/schema/context)
      • [http://www.springframework.org/schema/context/spring-context.xsd](http://www.springframework.org/schema/context/spring-context.xsd)

      導入后如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://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. 開啟屬性注解支持!
      • <context:annotation-config/>
      4.1、@Autowired
      • @Autowired是按類型自動轉配的,不支持id匹配。
      • 需要導入 spring-aop的包!

      測試:

      1. 將User類中的set方法去掉,使用@Autowired注解
      public class User {
          @Autowired
          private Cat cat;
      
          @Autowired
          private Dog dog;
      
          private String str;
      
          public Cat getCat() {
              return cat;
          }
          public Dog getDog() {
              return dog;
          }
          public String getStr() {
              return str;
          }
      }
      
      1. 此時配置文件內容
      <context:annotation-config/>
      
      <bean id="dog" class="com.demo.pojo.Dog"/>
      <bean id="cat" class="com.demo.pojo.Cat"/>
      <bean id="user" class="com.demo.pojo.User"/>
      
      1. 測試,成功輸出結果!

      @Autowired(required=false)說明:false,對象可以為null`;true,對象必須存對象,不能為null。

      @Nullable 使用該注解 標志這個字段可以為Null。

      //如果允許對象為null,設置required = false,默認為true
      @Autowired(required = false)
      private Cat cat;
      
      4.2、@Qualifier

      如果單單使用Autowired不能實現的情況 可以使用Qualifar輔助進行使用。

      測試實驗步驟:

      1. 配置文件修改內容,保證類型存在對象。且名字不為類的默認名字!
      <bean id="dog1" class="com.demo.pojo.Dog"/>
      <bean id="dog2" class="com.demo.pojo.Dog"/>
      <bean id="cat1" class="com.demo.pojo.Cat"/>
      <bean id="cat2" class="com.demo.pojo.Cat"/>
      
      1. 沒有加Qualifier測試,直接報錯
      2. 在屬性上添加Qualifier注解,指定要加加載的類
      @Autowired
      @Qualifier(value = "cat2")
      private Cat cat;
      @Autowired
      @Qualifier(value = "dog2")
      private Dog dog;
      
      1. 測試,成功輸出!
      4.3、@Resource
      • @Resource如有指定的name屬性,先按該屬性進行byName方式查找裝配;
      • 其次再進行默認的byName方式進行裝配;
      • 如果以上都不成功,則按byType的方式自動裝配。
      • 都不成功,則報異常。

      實體類:

      public class User {
          //如果允許對象為null,設置required = false,默認為true
          @Resource(name = "cat2")
          private Cat cat;
          @Resource
          private Dog dog;
          private String str;
      }
      

      beans.xml

      <bean id="dog" class="com.kuang.pojo.Dog"/>
      <bean id="cat1" class="com.kuang.pojo.Cat"/>
      <bean id="cat2" class="com.kuang.pojo.Cat"/>
      
      <bean id="user" class="com.kuang.pojo.User"/>
      

      測試:結果OK

      配置文件2:beans.xml , 刪掉cat2

      <bean id="dog" class="com.kuang.pojo.Dog"/>
      <bean id="cat1" class="com.kuang.pojo.Cat"/>
      

      實體類上只保留注解

      @Resource
      private Cat cat;
      @Resource
      private Dog dog;
      

      結果:OK

      結論:先進行byName查找,失敗;再進行byType查找,成功。

      5、小結

      @Autowired@Resource異同:

      1. @Autowired@Resource都可以用來裝配bean。都可以寫在屬性字段上,或寫在setter方法上。
      2. @Autowired默認按(ByType)類型裝配(屬于spring規范),默認情況下必須要求依賴對象必須存在,如果要允許null 值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用
      3. @Resource(屬于J2EE復返),默認按照名稱進行裝配,名稱可以通過name屬性進行指定。如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行按照名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。 當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

      它們的作用相同都是用注解方式注入對象,但執行順序不同。@AutowiredByType@ResourceByName

      使用注解開發 Annotation

      1、說明

      在spring4之后,想要使用注解形式,必須得要引入aop的包

      在配置文件當中,還得要引入一個context約束

      <?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.xsd
              http://www.springframework.org/schema/context
              https://www.springframework.org/schema/context/spring-context.xsd">
      
          <context:annotation-config/>
      </beans>
      
      

      2、Bean的實現

      我們之前都是使用 bean 的標簽進行bean注入,但是實際開發中,我們一般都會使用注解!

      1. 配置掃描哪些包下的注解
      <!--指定注解掃描包-->
      <context:component-scan base-package="com.demo.pojo"/>
      
      1. 在指定包下編寫類,增加注解
      @Component("user")
      // 相當于配置文件中 <bean id="user" class="當前注解的類"/>
      public class User {
          public String name = "zhang";
      }
      
      1. 測試
      @Test
      public void test(){
          ApplicationContext applicationContext =
          new ClassPathXmlApplicationContext("beans.xml");
          User user = (User) applicationContext.getBean("user");
          System.out.println(user.name);
      }
      

      3、屬性注入

      使用注解注入屬性

      1. 可以不用提供set方法,直接在直接名上添加@value(“值”)
      <bean id="user" class="com.demo.pojo.User" >
        <constructor-arg name="name" value="張三"/>
        <property id="name" value="zhang"/> 
      </bean>
      

      使用注解實現上面的功能就是如下:

      @Component("user")
      // 相當于配置文件中 <bean id="user" class="當前注解的類"/>
      public class User {
          // @Value("zhang") 等同于賦值xml中的property 的 value="zhang"
          @Value("張三")
          public String name;
      }
      
      1. 如果提供了set方法,在set方法上添加 value(“值”);
      @Component("user")
      public class User {
      
          public String name;
      
          @Value("zhang")
          public void setName(String name) {
              this.name = name;
          }
      }
      

      4、衍生注解

      我們這些注解,就是替代了在配置文件當中配置步驟而已!更加的方便快捷!

      @Component三個衍生注解

      為了更好的進行分層,Spring可以使用其它三個注解,功能一樣,目前使用哪一個功能都一樣。

      寫上這些注解,就相當于將這個類交給Spring管理裝配了!

      @Controller
      public class UserController {
      }
      
      @Service
      public class UserService {
      }
      
      @Repository
      public class UserDao {
      }
      
      

      5、自動裝配注解

      詳見: Bean的自動裝配

      6、作用域

      scope

      • singleton:默認的,Spring會采用單例模式創建這個對象。關閉工廠 ,所有的對象都會銷毀。
      • prototype:多例模式。關閉工廠 ,所有的對象不會銷毀。內部的垃圾回收機制會回收
      @Controller("user")
      @Scope("prototype")
      public class User {
          @Value("張三")
          public String name;
      }
      

      7、小結

      XML與注解比較

      • XML可以適用任何場景 ,結構清晰,維護方便
      • 注解不是自己提供的類使用不了,開發簡單方便

      xml與注解整合開發 :推薦最佳實踐

      • xml管理Bean
      • 注解(@xxx)完成屬性注入
      • 使用注解開發,一定要注意到一個問題:注解一定要生效,需要開啟對于注解的支持
      • 使用過程中,可以不用掃描,掃描是為了類上的注解

      <context:annotation-config/>作用:

      • 進行注解驅動注冊,從而使注解生效
      • 用于激活那些已經在spring容器里注冊過的bean上面的注解,也就是顯示的向Spring注冊
      • 如果不掃描包,就需要手動配置bean
      • 如果不加注解驅動,則注入的值為null!

      8、基于Java類進行配置

      不使用Spring的xml配置,直接全程使用java來進行操作;

      Java-based Container Configuration :: Spring Framework

      JavaConfig 原來是 Spring 的一個子項目,它通過 Java 類的方式提供 Bean 的定義信息,在 Spring4 的版本, JavaConfig 已正式成為 Spring4 的核心功能 。

      測試:

      1. 編寫一個實體類,Dog
      @Component  //將這個類標注為Spring的一個組件,放到容器中!
      public class Dog {
          public String name = "dog";
      }
      
      1. 新建一個config配置包,編寫一個MyConfig配置類
      @Configuration  //代表這是一個配置類
      public class MyConfig {
      
          @Bean //通過方法注冊一個bean,這里的返回值就Bean的類型,方法名就是bean的id!
          public Dog dog(){
              return new Dog();
          }
      
      }
      
      1. 測試
      @Test
      public void test2(){
          ApplicationContext applicationContext =
          new AnnotationConfigApplicationContext(MyConfig.class);
          Dog dog = (Dog) applicationContext.getBean("dog");
          System.out.println(dog.name);
      }
      
      1. 成功輸出結果!

      導入其他配置如何做呢?

      1. 我們再編寫一個配置類!
      @Configuration  //代表這是一個配置類
      public class MyConfig2 {
      }
      
      1. 在之前的配置類中我們來選擇導入這個配置類
      @Configuration
      @Import(MyConfig2.class)  //導入合并其他配置類,類似于配置文件中的 inculde 標簽
      public class MyConfig {
      
          @Bean
          public Dog dog(){
              return new Dog();
          }
      
      }
      

      關于這種Java類的配置方式,我們在之后的SpringBootSpringCloud中還會大量看到,我們需要知道這些注解的作用即可!

      posted @ 2025-07-24 18:41  柯基大大  閱讀(39)  評論(0)    收藏  舉報  來源
      主站蜘蛛池模板: 视频一区视频二区视频三区| 在线观看国产午夜福利片| 屯留县| 亚洲av与日韩av在线| 国产精品一区二区久久岳| 免费无码黄十八禁网站| a4yy私人毛片| 激情视频乱一区二区三区| 国产欧美va欧美va在线| 精品人妻少妇一区二区三区| 色综合久久精品亚洲国产| 中日韩精品视频一区二区三区 | 国产伦一区二区三区久久| 日韩有码精品中文字幕| 国产亚洲另类无码专区| 亚洲男女羞羞无遮挡久久丫| 福利一区二区不卡国产| 色综合五月伊人六月丁香| 久久精品人人做人人爽97| 人妻少妇久久久久久97人妻| 视频一区二区三区四区不卡 | 国产美女被遭强高潮免费一视频| 香蕉影院在线观看| 久久热这里只有精品99| 国产普通话刺激视频在线播放| 凤冈县| 乱人伦人妻中文字幕不卡| 精品国产一区二区三区麻豆 | 国产精品国产精品偷麻豆| 国产首页一区二区不卡| 久久精品国产精品亚洲毛片| 麻豆一区二区三区蜜桃免费| av中文字幕一区二区| 隆昌县| 正在播放肥臀熟妇在线视频| 久久99国产精一区二区三区!| 永清县| 亚洲免费人成视频观看| 亚洲国产精品一二三四五| 欧洲性开放老太大| 亚洲人成人伊人成综合网无码|