面試官:小夥子,講一下spring依賴注入吧!網友:就這,就這啊。。。

前言

  • 依賴注入DI(Dependency Injection)的三種注入方法使用介紹
  • set方法
  • 構造方法
  • 註解法

使用set方法注入

以下圖中UseService文件依賴Userdao對象,能夠經過setUserDao11函數設置注入
web

配置文件使用property標籤配置注入內容
注意:配置文件中name參數的值取至set方法後跟的內容同時首字母小寫
例如:set方法名是setUserDao111,那麼name的值就是userDao111。
面試

使用有參構造函數注入

有參構造函數注入使用constructor-arg標籤name是要注入的構造函數的參數名
算法

若是注入的內容是引用類型,就使用‘ref=’給對象賦值,且對象的值必須是在配置文件中註冊過的的對象id,如本文中的userServiceId和userDaoId,若是注入內容是普通數據類型,就使用‘value=’賦值,賦的值能夠是任意值,無需提早註冊。spring

使用註解

使用註解方法時不須要在配置文件中添加各個要注入的內容,而是在配置文件中配置組件掃描便可,源文件也不在須要定義set方法,構造方法。數據庫

在配置文件中添加以下語句,便可讓spring掃描com.syx.dao包下的全部註解,不然spring沒法識別你註解的內容設計模式

<context:component-scan base-package="com.syx.dao"></context:component-scan>

具體註解方法以下:緩存

// 使用Component添加id爲userServiceId的註解至關於配置文件執行了
// <bean id="userServiceId" class="com.syx.dao.service.UserService"/>
@Component("userServiceId")
public class UserService {
    // Autowired和Qualifier組合做用是按照名稱進行注入,使用至關於
    // <constructor-arg name="userdaoparam" ref="userDaoId"></constructor-arg>
    @Autowired
    @Qualifier("userDaoId")
    private UserDao userdaoparam;

    // Value是按照值進行注入,至關於
    // <property name="test_a" value="13"></property>
    // 註解中的值能夠是${...}表達式
    @Value("13")
    private int test_a;

    public void test() {
        System.out.println("注入值是" + test_a);
        userdaoparam.test();
    }
}

經常使用配置文件注入標籤使用示例

<bean id="userServiceId" class="com.syx.dao.service.UserService">
      <property name="userDao11" ref="userDaoId"></property>
      <!-- test_a 是int類型數據注入值100 -->
      <property name="test_a" value="100"></property>
      
      
      <!-- strList是List<String>集合,使用以下方法給集合添加兩個成員aaa和bbb -->
      <property name="strList">
          <list>
              <value>aaa</value>
              <value>bbb</value>
              <!-- 若是集合List存儲的是引用類型數據 需改用ref標籤賦值,以下
              <ref bean="userDaoId"></ref>
              -->
          </list>
      </property>


      <!-- userMap是Map<String, String>類型數據 -->
      <property name="userMap">
          <map>
              <entry key="adc" value="def"></entry>
              <!-- 若是Map的鍵值對均爲引用類型,那麼要使用以下標籤進行注入
              <entry key-ref="adc" value-ref="def"></entry>
              -->
          </map>
      </property>

      <!-- properties是一個Properties類型數據 -->
      <property name="properties">
          <props>
              <prop key="adc">123456</prop >
              <prop key="adc">fkgj</prop >
          </props>
      </property>
  </bean>

註解詳解

  • @Component和@Controller、@Service、@Repository三個註解功能徹底一致,只不事後三個通常分別用於web層,service層和dao層,更能起到表意做用。
  • @Autowired用於字段的依賴注入,當spring容器中只有某類的一個bean時,能夠單獨使用。

@Qualifier結合@Autowired按名稱給字段注入
@Resource(name = 「bean_id」)至關於@Qualifier和@Autowired(「bean_id」)配合使用數據結構

  • @Value 注入普通值屬性,一般Value的值會使用${…}表達式
  • @Scope 設置bean是僅建立單個對象仍是能夠建立多個對象。
  • @PostConstruct設置bean的初始化方法,做用等同於配置文件中的init-methond="…"
  • @PreDestroy設置bean的銷燬方法,做用等同於配置文件的destory-methond="…"

總結

歡迎關注公衆號:前程有光,領取一線大廠Java面試題總結+各知識點學習思惟導+一份300頁pdf文檔的Java核心知識點總結! 這些資料的內容都是面試時面試官必問的知識點,篇章包括了不少知識點,其中包括了有基礎知識、Java集合、JVM、多線程併發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java算法、數據庫、Zookeeper、分佈式緩存、數據結構等等。多線程

相關文章
相關標籤/搜索