[前端學(xué)java06-SpringBoot實(shí)戰(zhàn)] 注入 + Swagger2 3.0 + 單元測(cè)試JUnit5

導(dǎo)航

[react] Hooks

[React 從零實(shí)踐01-后臺(tái)] 代碼分割
[React 從零實(shí)踐02-后臺(tái)] 權(quán)限控制
[React 從零實(shí)踐03-后臺(tái)] 自定義hooks
[React 從零實(shí)踐04-后臺(tái)] docker-compose 部署react+egg+nginx+mysql
[React 從零實(shí)踐05-后臺(tái)] Gitlab-CI使用Docker自動(dòng)化部署

[源碼-webpack01-前置知識(shí)] AST抽象語法樹
[源碼-webpack02-前置知識(shí)] Tapable
[源碼-webpack03] 手寫webpack - compiler簡(jiǎn)單編譯流程
[源碼] Redux React-Redux01
[源碼] axios
[源碼] vuex
[源碼-vue01] data響應(yīng)式 和 初始化渲染
[源碼-vue02] computed 響應(yīng)式 - 初始化痢毒,訪問塔嬉,更新過程
[源碼-vue03] watch 偵聽屬性 - 初始化和更新
[源碼-vue04] Vue.set 和 vm.$set
[源碼-vue05] Vue.extend

[源碼-vue06] Vue.nextTick 和 vm.$nextTick
[部署01] Nginx
[部署02] Docker 部署vue項(xiàng)目
[部署03] gitlab-CI

[數(shù)據(jù)結(jié)構(gòu)和算法01] 二分查找和排序

[深入01] 執(zhí)行上下文
[深入02] 原型鏈
[深入03] 繼承
[深入04] 事件循環(huán)
[深入05] 柯里化 偏函數(shù) 函數(shù)記憶
[深入06] 隱式轉(zhuǎn)換 和 運(yùn)算符
[深入07] 瀏覽器緩存機(jī)制(http緩存機(jī)制)
[深入08] 前端安全
[深入09] 深淺拷貝
[深入10] Debounce Throttle
[深入11] 前端路由
[深入12] 前端模塊化
[深入13] 觀察者模式 發(fā)布訂閱模式 雙向數(shù)據(jù)綁定
[深入14] canvas
[深入15] webSocket
[深入16] webpack
[深入17] http 和 https
[深入18] CSS-interview
[深入19] 手寫Promise
[深入20] 手寫函數(shù)
[深入21] 數(shù)據(jù)結(jié)構(gòu)和算法 - 二分查找和排序
[深入22] js和v8垃圾回收機(jī)制
[深入23] JS設(shè)計(jì)模式 - 代理渗蟹,策略,單例

[前端學(xué)java01-SpringBoot實(shí)戰(zhàn)] 環(huán)境配置和HelloWorld服務(wù)
[前端學(xué)java02-SpringBoot實(shí)戰(zhàn)] mybatis + mysql 實(shí)現(xiàn)歌曲增刪改查
[前端學(xué)java03-SpringBoot實(shí)戰(zhàn)] lombok奕枝,日志,部署
[前端學(xué)java04-SpringBoot實(shí)戰(zhàn)] 靜態(tài)資源 + 攔截器 + 前后端文件上傳
[前端學(xué)java05-SpringBoot實(shí)戰(zhàn)] 常用注解 + redis實(shí)現(xiàn)統(tǒng)計(jì)功能
[前端學(xué)java06-SpringBoot實(shí)戰(zhàn)] 注入 + Swagger2 3.0 + 單元測(cè)試JUnit5

(一) 前置知識(shí)

(1) 一些單詞

condition 條件 // conditional 條件的 adj
camel 駱駝
swagger 大搖大擺 虛張聲勢(shì)
contact 接觸 聯(lián)系
implicit 隱藏 隱式
assertions 斷言
qualifier 限定符 修飾符

(二) Swagger2 3.0

(1) 安裝Swagger2 maven 依賴場(chǎng)景啟動(dòng)器starter

pom.xml
-------

<!-- Swagger -->
<!-- 自動(dòng)生成 ( 接口文檔 ) 及 ( 自測(cè)工具 ) -->
<!-- Swagger2 3.0 只需要 ( springfox-boot-starter ) 就可以了 -->
<!-- Swagger2 2.x 則需要 ( springfox-swagger2 ) 和 ( springfox-swagger-ui )-->

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

<!-- (1) springfox-swagger2 -->
<!--<dependency>-->
<!--<groupId>io.springfox</groupId>-->
<!--<artifactId>springfox-swagger2</artifactId>-->
<!--<version>3.0.0</version>-->
<!--</dependency>-->
<!-- (2) springfox-swagger-ui -->
<!--dependency>-->
<!--<groupId>io.springfox</groupId>-->
<!--<artifactId>springfox-swagger-ui</artifactId>-->
<!--<version>3.0.0</version>-->
<!--</dependency>-->

(2) 編寫 Swagger2 的配置類

src/main/java/com.example.demo/config/Swagger2Config.java
-------

@Configuration // 標(biāo)注當(dāng)前類是一個(gè)啟動(dòng)類瓶堕,即項(xiàng)目啟動(dòng)時(shí)就要去加載了
@EnableSwagger2 // 開啟 Swagger2 的配置
public class Swagger2Config {

    @Bean // 把該組件添加到IOC容器中
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                // Swagger2進(jìn)行包掃描隘道,掃描 controller,這里填寫 controller 的文件夾全路徑
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 標(biāo)題
                .title("react-admin-java-api 使用Swagger2構(gòu)建RESTful APIs")
                // 描述
                .description("react-admin-java-api Swagger2的接口文檔")
                // 作者信息
                .contact(new Contact("woow_wu7", "https://github.com/woow-wu7/7-react-admin-java", "woow_wu7@gmail.com"))
                // 服務(wù)網(wǎng)址
                .termsOfServiceUrl("http://120.53.220.141:81/admin-home")
                .version("1.0")
                .build();
    }
}

(3) 訪問 http://localhost:7777/swagger-ui/index.html

  • 如果是遠(yuǎn)程部署后訪問地址:服務(wù)器地址/swagger-ui/index.html
    image

(4) 相關(guān)注解

  • controller
    • @Api 用在請(qǐng)求的類上,該注解最好不要設(shè)置谭梗,中文不是很好
    • @ApiOperation 用于controller類的方法上忘晤,說明方法的用途和作用
    • @ApiParam 用于請(qǐng)求方法的參數(shù) => 個(gè)人感覺侵入性太強(qiáng),嚴(yán)重影響了閱讀默辨,混入業(yè)務(wù)代碼很亂
    • @ApiImplicitParams 用于請(qǐng)求方法上 => 主要用于post請(qǐng)求
    • @ApiImplicitParam 用于@ApiImplicitParams參數(shù)中
  • models => bean || model || dto
    • @ApiModel
    • @ApiModelProperty
    // 查
    @GetMapping("/getMusicListTest")
    @ApiOperation(value = "查詢歌曲列表") // Swagger2
    public PaginationTestDTO getMusicList(
            @RequestParam(value = "current", defaultValue = "1")
                @ApiParam(name = "current", value = "當(dāng)前頁", defaultValue = "1", required = false) Integer current,
            @RequestParam(value = "pageSize", defaultValue = "10")
                @ApiParam(name = "pageSize", value = "每頁數(shù)量", defaultValue = "10", required = false) Integer pageSize,
            @RequestParam(value = "searchKey", defaultValue = "")
                @ApiParam(name = "searchKey", value = "搜索框", defaultValue = "", required = false) String searchKey
    ) {
        return musicTestService.getMusicList(current, pageSize, searchKey);
    }
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("歌曲")
public class MusicTestBean {
    @ApiModelProperty(name = "name", value = "歌名")
    private String name; // 歌名

    @ApiModelProperty(name = "album", value = "專輯")
    private String album; // 專輯

    @ApiModelProperty(name = "singer", value = "歌手")
    private String singer; // 歌手

    private Integer id;
    private String startTime;
    private String endTime;
}

image

image

(三) 單元測(cè)試 JUnit5

  • SpringBoot已經(jīng)集成了JUint5
  • 使用非常簡(jiǎn)單
    • 編寫測(cè)試方法德频,并用 @Test來標(biāo)注 (unit5版本)
    • JUnit的測(cè)試類具有spring的功能
      • 比如可以使用 @Autowired 來自動(dòng)引入IOC中的組件
      • 比如可以使用 @Transactional 來標(biāo)注測(cè)試方法,測(cè)試完成后自動(dòng)回滾缩幸,事務(wù)
  • 官方文檔

(1) 引入maven場(chǎng)景啟動(dòng)器

pom.xml
-------

<!-- spring-boot-starter-test -->
<!-- 單元測(cè)試 場(chǎng)景啟動(dòng)器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

(2) 單元測(cè)試常用注解

  • @Test 表示該方法是測(cè)試方法
  • @ParameterizedTest 表示該方法是參數(shù)測(cè)試
  • @RepeatedTest 表示方法可重復(fù)執(zhí)行
  • @DisplayName 為測(cè)試類或測(cè)試方法設(shè)置展示名稱
  • @BeforeEach 表示在每個(gè)單元測(cè)試前執(zhí)行
  • @AfterEach
  • @BeforeAll 在所有單元測(cè)試前執(zhí)行
  • @AfterAll
  • @Tag 單元測(cè)試類別
  • @Disabled 表示測(cè)試類或測(cè)試方法不執(zhí)行
  • @Timeout 測(cè)試方法超過定時(shí)后將返回錯(cuò)誤
  • @ExtendWith 為測(cè)試類或測(cè)試方法提供擴(kuò)展類引用
  • @BeforeAll 和 @BeforeEach 的區(qū)別
    • @BeforEach在每個(gè)測(cè)試方法執(zhí)行前都會(huì)執(zhí)行壹置,一個(gè)測(cè)試類中可能有多個(gè)測(cè)試方法,因此@BeforeEach可能會(huì)多次執(zhí)行
    • @BeforeAll在所有測(cè)試方法執(zhí)行前執(zhí)行表谊,也就是說一個(gè)測(cè)試類中@BeforeAll只會(huì)執(zhí)行一次
src/test/java/com.example.demo/Junit5Test.java
-------

/**
 * @SpringBootTest 是下面這些注解的復(fù)合注解
 *    @BootstrapWith(SpringBootTestContextBootstrapper.class)
 *    @ExtendWith(SpringExtension.class) =>  @ExtendWith
 */
@SpringBootTest
@DisplayName("JUnit5功能測(cè)試")
public class Junit5Test {
    @Test
    @DisplayName("測(cè)試方法1 @DisplayName 注解")
    public void testDisplayName1() {
        System.out.println("@DisplayName1");
    }

    @Test
    @DisplayName("測(cè)試方法2 @DisplayName 注解")
    public void testDisplayName2() {
        System.out.println("@DisplayName2");
    }

    @Test
    @Disabled // 禁用
    @DisplayName("測(cè)試方法 @Disabled 注解")
    public void testDisabled() {
        System.out.println("@Disabled");
    }

    @Test
    @RepeatedTest(5) // 重復(fù)測(cè)試5次
    @DisplayName("測(cè)試方法 @RepeatedTest 注解")
    public void testRepeatedTest() {
        System.out.println("@RepeatedTest -----5");
    }

    @Test
    @Timeout(value = 1000, unit = TimeUnit.MILLISECONDS) // 超出時(shí)間報(bào)錯(cuò)
    public void testTimeout() throws InterruptedException {
        Thread.sleep(1200);
        System.out.println("@Timeout");
    }

    @BeforeEach
    public void testBeforeEach() {
        System.out.println("@BeforeEach");
    }

    @AfterEach
    public void testAfterEach() {
        System.out.println("@AfterEach");
    }

    @BeforeAll
    static public void testBeforeAll() {
        // 注意: @BeforeAll 和 @AfterAl 標(biāo)注的方法必須是 ( 靜態(tài)方法 )
        System.out.println("@BeforeAll");
    }

    @AfterAll
    static public void testAfterAll() {
        System.out.println("@AfterAll");
    }
}
image

(3) 斷言 assertions

  • 所有的測(cè)試運(yùn)行結(jié)束后钞护,會(huì)有一個(gè)詳細(xì)的測(cè)試報(bào)告

(3-1) 簡(jiǎn)單斷言

  • Assertions.assertEquals
  • Assertions.assertSame
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;

@SpringBootTest
public class Junit5Test2 {
    int cal(int i, int j) {
        return i+j;
    }
    // (一) 斷言:如果前面的斷言失敗,后面的代碼就都不會(huì)執(zhí)行
    @Test
    @DisplayName("測(cè)試簡(jiǎn)單斷言 assertions")
    void testSimpleAssertions() {
        int cal = cal(2,3);
        // (1) assertEquals => 斷言相等 
        assertEquals(5, cal, "兩個(gè)值不相等"); // ( expected期望值 和 actual真實(shí)計(jì)算的值 ) 是否相等
        // (2) assertSame => 斷言是不是同一個(gè)對(duì)象
        Object obj1 = new Object();
        Object obj2 = obj1;
        assertSame(obj1, obj2, "是不是同i個(gè)對(duì)象 => 不是同一個(gè)對(duì)象"); // 第三個(gè)參數(shù)表示 斷言失敗后會(huì)顯示的信息
    }
}
image

(3-2) 數(shù)組斷言

  • Assertions.assertArrayEquals
    @Test
    @DisplayName("測(cè)試數(shù)組斷言1 assertArrayEquals")
    public void testAssertArrayEquals1() {
        assertArrayEquals(new int[]{1, 2}, new int[]{1, 2}, "數(shù)據(jù)內(nèi)容不相等");
    }

    @Test
    @DisplayName("測(cè)試數(shù)組斷言2 assertArrayEquals")
    public void testAssertArrayEquals2() {
        assertArrayEquals(new int[]{1, 2, 3}, new int[]{1, 2}, "數(shù)據(jù)內(nèi)容不相等");
    }

(3-3) 組合斷言

  • Assertion.assertAll
  • 有三個(gè)assertion爆办,分別是a b c难咕,要顯現(xiàn)a斷言要在b和c都成功后才成功
    @Test
    @DisplayName("測(cè)試組合斷言 assertAll")
    public void all() {
        assertAll("test",
                () -> assertTrue(true && true, "不是true"),
                () -> assertEquals(1, 2, "不相等")
        );
        System.out.println("Assertion.assertAll只有斷言都成功,該log才會(huì)打印");
    }
image

(四) Spring IOC 注入 ----- 注意是Spring不是SpringBoot

  • 分為 ( 手動(dòng)注入 ) 和 ( 自動(dòng)注入 )

(1) 手動(dòng)注入

  • set方法注入
    • 1.屬性字段提供set方法
    • 2.在xml配置文件中通過 bean標(biāo)簽的子標(biāo)簽property標(biāo)簽指定屬性
    • 3.這樣在向IOC添加組件時(shí)距辆,就會(huì)自動(dòng)的調(diào)用set注入到IOC中
  • 構(gòu)造器注入 - 和set類似
    image

(2) 自動(dòng)注入

  • @Resource
  • @Autowired

(2-1) 自動(dòng)注入環(huán)境配置

src/main/resources/bean.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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--手動(dòng)注入-->
    <!-- id: 表示組件在容器中的名字余佃,隨便取 -->
    <!-- class: 表示bean對(duì)象的全路徑 -->
    <!-- property: 表示bean對(duì)象中的屬性 -->
    <!-- name: 表示具體的屬性名 -->
    <!-- ref: 表示容器中的組建名,即bean標(biāo)簽的中id屬性 -->

    <!--<bean id="userService" class="org.example.UserService">-->
        <!--property name="userBean" ref="userBean"/>-->
    <!--</bean>-->
    <!--<bean id="userBean" class="org.example.UserBean"></bean>-->

    <!--自動(dòng)注入-->
    <!--1. 自動(dòng)注入配置需要添加 beans => xmlns:context="http://www.springframework.org/schema/context" -->
    <!--2. 自動(dòng)注入配置需要添加 beans => xsi:schemaLocation也要添加一些內(nèi)容跨算,如上 -->
    <!--3. 自動(dòng)注入配置需要添加 <context:annotation-config/> 如下 -->
    <!--4. 注意自動(dòng)注入和手動(dòng)注入xml配置除了123還有一個(gè)區(qū)別:UserService中要使用userBean爆土,自動(dòng)注入不需要使用 property -->
    <context:annotation-config/>
    <bean id="userService" class="org.example.UserService"></bean>
    <bean id="userBean" class="org.example.UserBean"></bean>
</beans>

(2-2) @Resource 注解的使用

/**
 * 手動(dòng)注入
 * set 方法注入
 * 1. 屬性字段提供set方法
 * 2. 在xml配置文件中通過 bean標(biāo)簽的子標(biāo)簽property標(biāo)簽指定屬性
 * 3. 這樣在向IOC添加組件時(shí),就會(huì)自動(dòng)的調(diào)用set注入到IOC中
 */

/**
 * 自動(dòng)注入
 *
 * @Resource 可以實(shí)現(xiàn)自動(dòng)注入诸蚕,通過反射類實(shí)現(xiàn)
 * 1. 默認(rèn)通過 ( 屬性字段名稱 ) 來查找對(duì)應(yīng)的 ( bean對(duì)象 ) => ( 屬性名 ) 和 ( bean標(biāo)簽 id ) 保持一致
 * 2. 如果 ( 屬性名 ) 和 ( bean標(biāo)簽id ) 不一致步势,則會(huì)通過 ( bean標(biāo)簽的class ) 去查找
 * 3. 可以提供set,也可以不提供set
 * 4. 可以標(biāo)注在 ( 屬性上 ) 或者 ( set方法 ) 上
 * 5. 可以設(shè)置name屬性背犯,但需要和bean標(biāo)簽的id保持一致坏瘩,  @Resource(name="userBean")
 * 6. 6.1 當(dāng)注入接口時(shí),如果接口只有一個(gè)實(shí)現(xiàn)類漠魏,則正常實(shí)例化
 *    6.2 如果接口有多個(gè)實(shí)現(xiàn)類倔矾,需要通過參數(shù)name來指定具體的實(shí)現(xiàn)類,參數(shù)就是xml配置文件中bean標(biāo)簽的id
 */
public class UserService {
    // 手動(dòng)實(shí)例話
    // UserBean userBean = new UserBean();

    // JavaBean對(duì)象
    @Resource(name = "userBean")
    private UserBean userBean;

    @Resource(name = "userImplements")
    // 該接口有兩個(gè)實(shí)現(xiàn)類 ( UserImplements ) 和 ( UserImplements2)
    // 此時(shí)需要通過 @Resource(name = "xml配置文件中bean標(biāo)簽的id")
    private UserInterface userInterface;

    public void test() {
        userBean.getName2();
        userInterface.getName3();
    }
}
image

(2-3) @Autowired + @Qualifier

  • @AutoWired 默認(rèn)是按照xml中的bean標(biāo)簽的 class 屬性去查找的
  • 屬性字段可以提供set方法柱锹,也可以不提供set方法
  • @Autowire可以寫在set方法上哪自,也可以寫在屬性上
  • 如果想要通過指定名稱查找bean對(duì)象,需要結(jié)合 @Qualifier 注解
  • @Qualifier(value = "autowiredBean2") 中的value的值和xml中bean標(biāo)簽的 id 屬性一一對(duì)應(yīng)
src/main/resources/bean.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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--手動(dòng)注入-->
    <!-- id: 表示組件在容器中的名字奕纫,隨便取 -->
    <!-- class: 表示bean對(duì)象的全路徑 -->
    <!-- property: 表示bean對(duì)象中的屬性 -->
    <!-- name: 表示具體的屬性名 -->
    <!-- ref: 表示容器中的組建名提陶,即bean標(biāo)簽的中id屬性 -->

    <!--<bean id="userService" class="org.example.UserService">-->
        <!--property name="userBean" ref="userBean"/>-->
    <!--</bean>-->
    <!--<bean id="userBean" class="org.example.UserBean"></bean>-->

    <!--自動(dòng)注入-->
    <!--1. 自動(dòng)注入配置需要添加 beans => xmlns:context="http://www.springframework.org/schema/context" -->
    <!--2. 自動(dòng)注入配置需要添加 beans => xsi:schemaLocation也要添加一些內(nèi)容,如上 -->
    <!--3. 自動(dòng)注入配置需要添加 <context:annotation-config/> 如下 -->
    <!--4. 注意自動(dòng)注入和手動(dòng)注入xml配置除了123還有一個(gè)區(qū)別:UserService中要使用userBean匹层,自動(dòng)注入不需要使用 property -->
    <context:annotation-config/>
    <bean id="userService" class="org.example.UserService"></bean>
    <bean id="userBean" class="org.example.UserBean"></bean>
    <bean id="userImplements" class="org.example.UserImplements"></bean>
    <bean id="userImplements2" class="org.example.UserImplements2"></bean>

    <bean id="autowiredBean2" class="org.example.AutowiredBean"></bean>
</beans>
src/main/java/org.example/UserService.java
-------

/**
 * 手動(dòng)注入
 * set 方法注入
 * 1. 屬性字段提供set方法
 * 2. 在xml配置文件中通過 bean標(biāo)簽的子標(biāo)簽property標(biāo)簽指定屬性
 * 3. 這樣在向IOC添加組件時(shí)隙笆,就會(huì)自動(dòng)的調(diào)用set注入到IOC中
 */

/**
 * 自動(dòng)注入
 *
 * @Resource 可以實(shí)現(xiàn)自動(dòng)注入锌蓄,通過反射類實(shí)現(xiàn)
 * 1. 默認(rèn)通過 ( 屬性字段名稱 ) 來查找對(duì)應(yīng)的 ( bean對(duì)象 ) => ( 屬性名 ) 和 ( bean標(biāo)簽 id ) 保持一致
 * 2. 如果 ( 屬性名 ) 和 ( bean標(biāo)簽id ) 不一致,則會(huì)通過 ( bean標(biāo)簽的class ) 去查找
 * 3. 可以提供set撑柔,也可以不提供set
 * 4. 可以標(biāo)注在 ( 屬性上 ) 或者 ( set方法 ) 上
 * 5. 可以設(shè)置name屬性瘸爽,但需要和bean標(biāo)簽的id保持一致,  @Resource(name="userBean")
 * 6. 6.1 當(dāng)注入接口時(shí)铅忿,如果接口只有一個(gè)實(shí)現(xiàn)類剪决,則正常實(shí)例化
 *    6.2 如果接口有多個(gè)實(shí)現(xiàn)類,需要通過參數(shù)name來指定具體的實(shí)現(xiàn)類檀训,參數(shù)就是xml配置文件中bean標(biāo)簽的id
 */

/**
 * 自動(dòng)注入
 *
 * @Autowired 可以實(shí)現(xiàn)自動(dòng)注入柑潦,通過反射類實(shí)現(xiàn)
 * 1. @Autowired注解模式是通過 xml配置文件中的bean標(biāo)簽的class屬性去查找bean對(duì)象的,與屬性字段沒有關(guān)系
 * 2. 可以提供set峻凫,也可以不提供set
 * 3. 可以標(biāo)注在 ( 屬性上 ) 或者 ( set方法 ) 上
 * 4. 如果想要通過指定名稱查找bean對(duì)象渗鬼,需要結(jié)合 @Qualifier注解
 */

public class UserService {
    // 手動(dòng)實(shí)例話
    // UserBean userBean = new UserBean();

    // JavaBean對(duì)象
    @Resource(name = "userBean")
    private UserBean userBean;

    @Resource(name = "userImplements")
    // 該接口有兩個(gè)實(shí)現(xiàn)類 ( UserImplements ) 和 ( UserImplements2)
    // 此時(shí)需要通過 @Resource(name = "xml配置文件中bean標(biāo)簽的id")
    private UserInterface userInterface;

    @Qualifier(value = "autowiredBean2")
    @Autowired
    AutowiredBean autowiredBean;

    public void test() {
        userBean.getName2();
        userInterface.getName3();
        autowiredBean.testAutowired();
    }
}

image

項(xiàng)目源碼

資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凡橱,一起剝皮案震驚了整個(gè)濱河市坷澡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爬立,老刑警劉巖命锄,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堰乔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脐恩,警方通過查閱死者的電腦和手機(jī)镐侯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來被盈,“玉大人析孽,你說我怎么就攤上這事搭伤≈辉酰” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵怜俐,是天一觀的道長(zhǎng)身堡。 經(jīng)常有香客問我,道長(zhǎng)拍鲤,這世上最難降的妖魔是什么贴谎? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮擅这,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘景鼠。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布湿镀。 她就那樣靜靜地躺著蚀腿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磁玉。 梳的紋絲不亂的頭發(fā)上席赂,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天喊熟,我揣著相機(jī)與錄音,去河邊找鬼姐刁。 笑死芥牌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聂使。 我是一名探鬼主播壁拉,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拐叉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了扇商?” 一聲冷哼從身側(cè)響起凤瘦,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎案铺,沒想到半個(gè)月后蔬芥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡控汉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年笔诵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姑子。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乎婿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出街佑,到底是詐尸還是另有隱情谢翎,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布沐旨,位于F島的核電站森逮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏磁携。R本人自食惡果不足惜褒侧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谊迄。 院中可真熱鬧闷供,春花似錦、人聲如沸统诺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篙议。三九已至唾糯,卻和暖如春怠硼,著一層夾襖步出監(jiān)牢的瞬間鬼贱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工香璃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留这难,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓葡秒,卻偏偏與公主長(zhǎng)得像姻乓,于是被迫代替她去往敵國(guó)和親嵌溢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容