1. 程式人生 > 其它 >Spring之Bean的註解自動裝配

Spring之Bean的註解自動裝配

技術標籤:# SSMspringbean自動裝配

前言

自動裝配是Spring滿足Bean依賴的一種方式。

XML自動裝配比起註解自動裝配還是比較繁瑣的,所以學習一下更簡便的註解自動裝配。

jdk1.5支援註解,spring2.5就支援註解了。

註解自動裝配須知:

  1. 匯入約束
  2. 配置註解的支援
<?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
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
    
</beans>

直接上demo:

貓類:

public class Cat {
    public void shout(){
        System.out.println("貓叫");
    }

}

狗類:

public class Dog {
    public void shout(){
        System.out.println("狗叫");
    }
}

人類:(一個人有一隻貓和一隻狗)

public class People {
    //一個人有一隻貓和一隻狗

   private Cat cat;
    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;
    }

    @Override
    public String toString() {
        return "People{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", 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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="cat" class="cn.Cat"></bean>
    <bean id="dog" class="cn.Dog"></bean>

    <!--byname:會自動在容器上下文中查詢,和自己物件set方法後面值對應的bean id -->
    <!--bytype:會自動在容器上下文中查詢,和自己物件屬性型別相同的bean -->
    <bean id="people" class="cn.People" autowire="byName">
        <property name="name" value="詹大先生"></property>
        <property name="cat" ref="cat"></property>
        <property name="dog" ref="dog"></property>
    </bean>
</beans>

測試類:

public class MyTest {


    //主類  可以通過  psvm打出來  不用一個個程式碼去敲
    public static void main(String[] args) {

        //獲取Spring 的上下文物件
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

         People people=context.getBean("people", People.class);

         people.getCat().shout();
         people.getDog().shout();


    }

}

測試結果:

註解自動裝配後:

人類:(直接在實體類的屬性上加上@Autowired 即可。)

public class People {
    //一個人有一隻貓和一隻狗

    //註解自動裝配
   @Autowired
   private Cat cat;
   @Autowired
    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;
    }

    @Override
    public String toString() {
        return "People{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", 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/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">


    <!--註解支援-->  
     <context:annotation-config/>


    <bean id="cat" class="cn.Cat"></bean>
    <bean id="dog" class="cn.Dog"></bean>
    <bean id="people" class="cn.People"></bean>
</beans>

測試結果:

@Resource

預設通過ByName的方式進行自動裝配(就是根據id來自動裝配)。

@Autowired 和 @Qualifier

假設我們要在beans.xml中再去新增一個id為dog666 型別為cn.Dog 的物件

<bean id="dog666" class="cn.Dog"></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"
       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
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>


    <bean id="cat" class="cn.Cat"></bean>
    <bean id="dog" class="cn.Dog"></bean>
    <bean id="dog666" class="cn.Dog"></bean>

    <bean id="people" class="cn.People"></bean>
</beans>

此時存在2個class為cn.Dog的物件,那麼註解自動裝配單單用使 @Autowired 是不夠的。

我們就需要使用 @Autowired 和 @Qualifier搭配

   //註解自動裝配
   //使用 @Autowired 和 @Qualifier搭配

   @Autowired
   private Cat cat;
   @Autowired
   @Qualifier(value = "dog666")
    private Dog dog;

那麼我們就可以知道,註解自動裝配預設先按照ByType方式裝配。(ByType方式:按照型別進行自動裝配)

看完如果對你有幫助,點贊支援!