1. 程式人生 > >spring_(13)通過註解配置之二

spring_(13)通過註解配置之二

元件裝配

  • < context:component-scan >元素還會自動註冊AutowiredAnnotationBeanPostProcessor例項,該例項可以自動裝配具有@Autowired和@Resource、@Inject註解的屬性

  • @Autowired註解自動裝配具有相容型別的單個Bean屬性

    1. 構造器,普通欄位(即使是非public),一切具有引數的方法都可以應用@Authwired註解
    2. 預設情況下,所有使用@Authwired註解的屬性都需要被設定.當Spring找不到匹配的Bean裝配屬性時,會丟擲異常,
      若某一屬性允許不被設定,可以設定@Authwired註解的required屬性為false
    3. 預設情況下,當IOC容器裡存在多個型別相容的Bean時,通過型別的自動裝配將無法工作。此時可以在**@Qualifier**註解裡提供Bean的名稱。Spring允許對方法入參標註@Qualifiter已指定注入Bean的名稱
    4. @Authwired註解也可以應用在陣列型別的屬性上,此時Spring將會把所有匹配的Bean進行自動裝配
    5. @Authwired註解也可以應用在集合屬性上,此時Spring讀取該集合的型別資訊,然後自動裝配所有與之相容的Bean
    6. @Authwired註解用在java.util.Map
      上時,若該Map的鍵值為String,那麼Spring將自動裝配與之Map值型別相容的Bean,此時Bean的名稱作為鍵值
  • ### 使用@Resource或@Inject自動裝配Bean,- Spring還支援@Resource和@Inject註解,這兩個註解和@Autowired註解的功能類似,- @Resource註解要求提供一個Bean名稱的屬性,若該屬性為空,則自動採用標註的標量或方法名作為Bean的名稱,- @Inject和@Autowired註解一樣也是按型別匹配注入的Bean,但沒有reqired屬性,- 建議使用@Autowired註解

例子程式

基本結構

在這裡插入圖片描述

還有一個上文的配置檔案.xml

TestObject.java

package com.spring.beans.annotation;
public class TestObject {

}

UserRepository.java

package com.spring.beans.annotation.repository;
public interface UserRepository {
    void save();
}

UserRepositoryImpl.java

package com.spring.beans.annotation.repository;

import com.spring.beans.annotation.TestObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository("userRepository")//這裡的名字可以讓多個repository存在時,找到這個repository
public class UserRepositoryImpl implements UserRepository {

    @Autowired(required = false)
    private TestObject testObject;

    @Override
    public void save() {
        System.out.println("UserRepository Save...");
        System.out.println(testObject);
    }
}

UserJdbcRepository.java

package com.spring.beans.annotation.repository;

import org.springframework.stereotype.Repository;

@Repository
public class UserJdbcRepository implements UserRepository{
    @Override
    public void save() {
        System.out.println("UserJdbcRepository save...");
    }
}

UserService.java

package com.spring.beans.annotation.service;

import com.spring.beans.annotation.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    @Qualifier("userRepositoryImpl")  //指定裝配哪一個repository
    private UserRepository userRepository;

    //另外一種方法
//    @Autowired
//    public void setUserRepository(@Qualifier("userRepositoryImpl") UserRepository userRepository) {
//        this.userRepository = userRepository;
//    }

    public void add(){
        System.out.println("UserService add...");
        userRepository.save();
    }

}

beans-annotation.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">

    <!--指定spring IOC 容器掃描的包-->
    <!--可以通過resource-pattern指定掃描的資源-->
    <!--<context:component-scan
            base-package="com.spring.beans.annotation"
    resource-pattern="repository/*.class">

    </context:component-scan>-->

    <!--exclude-filter  子節點指定排除哪些指定表示式的元件-->
    <!--context:include-filter 子節點指定包含哪些表示式的元件,該子節點需要 use-default-filters 配合使用-->
    <context:component-scan
            base-package="com.spring.beans.annotation">
           <!-- 只包含時需要新增這個屬性use-default-filters="false"-->


        <!--不包含<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->

        <!--只包含<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
    
        <!--不包含這個介面以及介面的實現類<context:exclude-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository"/>-->

        <!--只包含這個介面以及介面的實現類<context:include-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository"/>-->

    </context:component-scan>

</beans>

Main.java

package com.spring.beans.annotation;

import com.spring.beans.annotation.controller.UserController;
import com.spring.beans.annotation.repository.UserRepository;
import com.spring.beans.annotation.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");

//        TestObject to = (TestObject) ctx.getBean("testObject");
//        System.out.println(to);

        UserController userController =(UserController) ctx.getBean("userController");
        System.out.println(userController);
        userController.execute();


//        UserService userService = (UserService) ctx.getBean("userService");
//        System.out.println(userService);
//
//        UserRepository userRepository = (UserRepository) ctx.getBean("userRepository");
//        System.out.println(userRepository);

    }


}

執行結果
在這裡插入圖片描述