1. 程式人生 > 實用技巧 >bean的自動裝配及初識註解開發

bean的自動裝配及初識註解開發

bean的自動裝配及初識註解開發

  • 自動依賴是Spring滿足bean依賴的一種方式
  • Spring會在上下文中自動尋找,並自動給bean裝配屬性

在Spring中有三種裝配方式:

  1. 在xml中顯示的配置
  2. 在java中顯示的裝配
  3. 隱式的自動裝配bean【重要】

測試

環境搭建:一個人有兩個寵物

1、建立實體類

Dog.java

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

Cat.java

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

Human.java

public class Human {
	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 "Address [cat=" + cat + ", dog=" + dog + ", name=" + name + "]";
	}
	
}

2、建立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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="cat" class="Cat" />
    <bean id="dog" class="Dog" />
    
	<bean id="human" class="Human">
		<property name="name" value="張三" /> 
        <property name="dog" ref="dog" /> 
        <property name="cat" ref="cat" /> 
	</bean>
</beans>

3、例項化容器,獲取物件測試

public class MyTest {
    
    public static void main(String[] args) {
    //獲取上下文時就已經建立好了物件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
    //我們的物件現在都在Spring中的管理了,我們要使用,直按去裡面取出來就可以!
    Human human = (Human) context.getBean("human");
	human.getDog().shout();
    human.getCat().shout();
}

4、優化:自動裝配

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

	<bean id="cat" class="Cat" />
        <bean id="dog" class="Dog" />
    
        <!--
		byName:會自動在容器上下文中找,和自己的物件Set方法後面的值對應的bean id
		byType:會自動在容器上下文中找,和自己的物件型別屬性相同對應的bean id
	-->
	<bean id="human" class="Human" autowire="byName | byType">
		<property name="name" value="張三" /> 
	</bean>
</beans>

小結:

  • byName 的時候,需要保證所有bean的id唯一 ,並且這個bean需 要和自動注入的屬性的set方法的值一致!
  • byType 的時候,需要保證所有bean的class唯一,並且這個bean需要和自動注入的屬性的型別一致!

5、優化:使用註解自動裝配

jdk 1.5開始支援註解,Spring從2.5開始支援註解

  • 要使用註解須知

    • 匯入約束: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:p="http://www.springframework.org/schema/p"
          xmlns:aop="http://www.springframework.org/schema/aop"
          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
              http://www.springframework.org/schema/aop
              https://www.springframework.org/schema/aop/spring-aop.xsd">
      
          <!-- 開啟註解支援 -->
          <context:annotation-config/>
      
      </beans>
      

5.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"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

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

    <bean id="cat" class="Cat" />
    <bean id="dog" class="Dog" />
    <bean id="human" class="Human" />
</beans>

5.2、在實體類上使用註解

  • @Autowired:自動裝配,可以直接寫在類屬性上Set方法

使用Autowired我們可以不用編寫Set方法了,前提是你這個自動裝配的屬性在IOC(Spring) 容器中存在,且符合型別byType!

public class Human {
    //直接匯入,自動裝配
    @Autowired
	private Cat cat;
    
    //如果顯示定義Autowired的required屬性為false, 說明這個物件可以為null, 否則不允許為null
	@Autowired(required = false)
    
    //指定裝配的值->>  <bean id="dog222" class="Dog" />
    @Qualifier(value="dog222")
    
	private Dog dog;
	private String name;
	public Cat getCat() {
		return cat;
	}
    @Autowired
	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 "Address [cat=" + cat + ", dog=" + dog + ", name=" + name + "]";
	}
	
}

總結:

如果@Autowired自動裝配的環境比較複雜,自動裝配無法通過一個註解[@Autowired]完成的時候、

我們可以使@Qualifier(value="xx")去配置@Autowired的使用,指定一個唯一的bean物件注入!

  • @Resource

    public class Human {
        
        @Resource
    	private Cat cat;  
        
        @Resource(name="dog222")
    	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 "Address [cat=" + cat + ", dog=" + dog + ", name=" + name + "]";
    	}
    	
    }
    

總結:@Resource 和 @Autowired 的區別:

  • 都是用來自動裝配的,都可以放在屬性欄位上
  • @Autowired 是通過 byType 來實現的,而且必須要求這個物件存在!也可以通過 @Qualifier(value="dog222") byName實現【常用】
  • @Resource 預設通過 byName 的方式實現,如果找不到名字,則通過 byType 實現!如果兩個都找不到,則報錯!【常用】
  • 執行順序不同:@Autowired 是通過 byType 來實現的,@Resource 預設通過 byName 的方式實現。