首頁 > 軟體

Spring IOC容器Bean註解建立物件元件掃描

2022-05-30 22:04:06

Spring IOC Bean註解物件元件掃描

什麼是註解?

註解是程式碼裡的特殊標記,格式:

@註解名稱(屬性名稱=屬性值, 屬性名稱2=屬性值...)

可以作用在:類、方法、屬性上面。

使用註解的目的:簡化 xml 設定,讓使用設定更簡潔優雅。

一、spring 針對 bean 管理中建立物件提供註解

  • @Component
  • @Service
  • @Controller
  • @Repository

這 4 個註解功能是一樣的,都可以用來建立 bean 範例。

但是通常實際應用中,為了讓開發人員更加清晰當前元件所扮演的角色,一般會讓它們各自應用在不同的層。比如 @Service 用在邏輯層、@Service 用在web層等。

範例

1. 引入依賴

引入 AOP 依賴,可以在這裡搜尋下載需要的 jar 包。

2. 開啟元件掃描

其實就是告訴 spring 你要在什麼地方使用註解。通過在 xml 裡設定,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"
       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:component-scan base-package="com.pingguo.spring5.dao"></context:component-scan>
</beans>

現在,我這裡有多個包:

如果要掃描多個包,可以用逗號,隔開:

<context:component-scan base-package="com.pingguo.spring5.dao, com.pingguo.spring5.service"></context:component-scan>

如果所有下層的包都要掃描,那也可以之間寫上層的目錄:

<context:component-scan base-package="com.pingguo.spring5"></context:component-scan>

3. 建立類,並新增註解來建立物件

package com.pingguo.spring5.service;
import org.springframework.stereotype.Component;
@Component(value = "userService")
public class UserService {
    public void add() {
        System.out.println("service add() ... ...");
    }
}

現在終於不用去 xml 寫 bean 標籤了。

@Component(value = "userService"),這裡 value 的值,等同於 <bean id="userService" ...裡的 id 。@Component(value = "userService"),這裡括號裡的 value 可以不寫,預設就是類名稱的首字母小寫。比如 類 UserService 就是 userService 。

4. 測試一下

package com.pingguo.spring5.testdemo;
import com.pingguo.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestService {
    @Test
    public void testService() {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    }
}

執行一下:

com.pingguo.spring5.service.UserService@60611244
service add() ... ...
Process finished with exit code 0

成功。

如果把註解換成其他幾個,重新執行測試方法,結果也是一樣的。

二、元件掃描的其他過濾條件

在上述的開啟掃描設定:

<!--開啟元件掃描-->
<context:component-scan base-package="com.pingguo.spring5"></context:component-scan>

意思就是說掃描包路徑com.pingguo.spring5下的所有類。

其實這裡有個屬性 use-default-filters,預設情況下就是等於true,也就是使用預設過濾規則,會去掃描路徑下的所有。

那如果use-default-filters="false",就是不使用預設過濾條件,我們可以自己設定過濾。

1. include-filter

在指定的包路徑下,只掃描包含了某種註解的類。比如:

<context:component-scan base-package="com.pingguo.spring5" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

這就是說,在路徑com.pingguo.spring5下,只掃描Service註解的類。

2. exclude-filter

與上面相反,這裡是除了xx之外,都去掃描。

<context:component-scan base-package="com.pingguo.spring5" use-default-filters="false">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

做了改動之後,意思也變了。現在是說在路徑com.pingguo.spring5下,除了Service註解的類,其他都掃描。

以上就是Spring IOC容器Bean註解建立物件元件掃描的詳細內容,更多關於Spring IOC Bean註解物件元件掃描的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com