最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring五大類注解讀取存儲Bean對象的方法

 更新時間:2022年09月04日 09:46:35   作者:bug?郭  
這篇文章主要介紹了Spring五大類注解讀取存儲Bean對象,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前情提要

我們上節(jié)內容學習了如何創(chuàng)建\注冊\讀取bean
我們發(fā)現bean對象操作十分的繁瑣!
所以我們這個章節(jié),就帶大家來了解更加簡單的bean操作,通過Spring下的注解來實現!

配置spring-config文件

我們之前注冊bean是通過在xml配置文件中,通過鍵值對的方式注冊bean對象!
顯然這種方式很麻煩,注冊一個對象,就要添加一項!
有沒有什么好的方式可以讓spring直接去注冊對象!
yes!

我們可以直接在配置文件配置好 spring下你要注冊對象的包時那個!
spring啟動后,spring就會將bean對象自動注冊!

spring-config配置文件

<?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:content="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 https://www.springframework.org/schema/context/spring-context.xsd">
       <!--在com包下掃描bean注冊-->
        <content:component-scan base-package="com"></content:component-scan>
</beans>

當然只有一個配置文件顯然不夠嘛!
我們如何知道我們代碼中的對象是bean對象捏?
這就要引入spring五大注解概念了!
我們通過在我們創(chuàng)建好的對象上面添加注解的方式,就是告訴spring這個對象需要注冊到容器中!

類注解和方法注解

類注解:

@Controller@Service@Repository@Component@Configuration

方法注解:
@Bean

我們可以通過上述兩種注解將對象存儲到Spring中!

@Controller(控制器存儲)

使用@Controller注解存儲bean

package com;
import org.springframework.stereotype.Controller;
@Controller //通過Controller注解存儲bean對象
public class UserController {
    public void sayHi(){
        System.out.println("hello Controller注解!");;
    }
}

我們通過在UserController類上加上spring類注解,即可完成注冊對象!

在啟動類中讀取bean對象即可!

//啟動類
public class app{
    public static void main(String[] args) {
        //1.獲取上下文對象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //讀取bean對象!
        UserController userController =
                (UserController) context.getBean("userController");
        //使用
        userController.sayHi();
    }
}

在這里插入圖片描述

如果我們的需要注冊的bean對象不在掃描包下,是否又能注冊成功呢?

我們在新建一個controller包在其下創(chuàng)建TestController類,并且通過@Controller注冊到Spring中!

package controller;
import org.springframework.stereotype.Controller;
@Controller //注冊到Spring中!
public class TestController {
    public void sayHi(){
        System.out.println("該bean不在掃描的包下");
    }
}

然后我們通過ApplicationContext上下文對象讀取bean

在這里插入圖片描述

可以看到出現異常未找到名為textControllerbean對象!

結論:只有在掃描包下的類才能被Spring注冊

@Service(服務存儲)

注冊bean

package com;

import org.springframework.stereotype.Service;

@Service // @Service 注解注冊對象!
public class UserService {
    public  void sayHi(){
        System.out.println("Hello Service注解!");
    }
}

讀取bean

在這里插入圖片描述

@Configuration(配置存儲)

package com;
import org.springframework.context.annotation.Configuration;
@Configuration //Configuration注解注冊bean對象
public class UserConfiguration {
    public void sayHi(){
        System.out.println("Hello Configuration注解!");
    }
}

在這里插入圖片描述

@Repository(倉庫存儲)

package com;

import org.springframework.stereotype.Repository;

@Repository //@Respository 注解注冊對象
public class UserRepository {
    public void sayHi(){
        System.out.println("Hello Respository注解!");
    }
}

在這里插入圖片描述

@Component(組件存儲)

package com;

import org.springframework.stereotype.Component;

@Component //Component注解注冊對象!
public class UserComponent {
    public void sayHi(){
        System.out.println("Hello Component注解!");
    }
}

在這里插入圖片描述

5大類注解聯系

在這里插入圖片描述

可以看到這5大類注解使用方式一樣,都可以對對象進行注冊!
而且注冊的方式都一樣,既然如此為何還需要5個注解呢?

我們聯系實際生活中的車牌號,我們雖然車牌號的功能都是一樣,但是不同地區(qū)都有自己的車牌號!我們通過車牌號就可以分辨出這車來自哪里!
而這里5大類注解作用也是如此,我們通過類注解,可以知道當前類的用途!
例如;

@Controller:表示業(yè)務邏輯層
@Service:服務層
@Repository:持久層
@Configuration:配置層

程序的工程分層,調用流程如下:

在這里插入圖片描述

我們拿去銀行辦業(yè)務做類比:

@Controller層就是保安,先要進行檢查驗證,然后到達Service服務廳詢問業(yè)務,不同的業(yè)務來到Repository,不同的窗口,然后進行相應的工作人員辦理業(yè)務!

類注解之前聯系:

在這里插入圖片描述

可以看到其他4個注解都是Component注解的子類!

Spring給Bean命名規(guī)則

我們可以看到我們剛剛讀取bean對象時,我們并不知道bean對象注冊的id而是直接通過userController讀取!
難道說Spring注冊bean對象id為類名首字母小寫,直接就小駝峰?

我們查看Spring源碼驗證!

在這里插入圖片描述

我們順藤摸瓜下方就是Spring對Bean對象進行命名的方法!

 public static String decapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                        Character.isUpperCase(name.charAt(0))){
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }

可以看到我們這里bean對象的id命名規(guī)則如下:

對象類類名一般采用大駝峰的形式也就是單詞第一個字母大小,所以Spring直接bean對象改為小駝峰,`第一個字母分成小寫!對象類類名不規(guī)范,不是大駝峰,第二個字母和第一個字母都是大小!Spring直接將bean對象命名為類名!

我們進行驗證:

在這里插入圖片描述

方法注解@Bean

我們了解了5大類注解可以進行對象注冊,我們使用方法注解進行對象注冊!
注意: 方法注解要和類注解配合使用!

方法注解進行對象注冊

//User類
public class User {
    private String name;
    private int id;
    public User(String name, int id) {
        this.name = name;
        this.id = id;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}
//Users類
@Component
public class Users {
    @Bean
    public User user(){
        return new User("java",666);
    }
}

在這里插入圖片描述

可以看到@Bean注解適用于返回值返回對象的方法中!

重命名Bean

我們既然可以通過五大類注解進行對象注入!那為何還要多此一舉在方法上加上@Bean方法注解呢?

我們可以通過@Bean方法注解給bean對象重命名,可以直接設置名字!

通過 name={"rename1", "rename2"...}可以重命名多個!

@Component
public class Users {
    @Bean(name = {"user1"})
    public User user(){
        return new User("java",666);
    }
}

能否通過之前Spring給我們設置的名字訪問? 不能

在這里插入圖片描述

@Bean(name={"user1","user2"}) 重命名多個!

在這里插入圖片描述

我們也可以將name省略
@Bean({"user1"})

在這里插入圖片描述

在這里插入圖片描述

獲取Bean對象(對象裝配)

這里可能聽了有點迷,啥玩意對象裝配,其實就是獲取對象!
我們將對象注冊到Spring容器下,我們要讀取將對象取出放入到某個類中,這就是對象裝配,也叫對象注入!

實現對象裝配的3種方法

  • 屬性注入
  • 構造方法注入
  • Setter注入

下面我們來演示一下這3種注入方式

我們按照實際開發(fā)將Service層的類注入到Controller層的類中!

屬性注入

我們通過@Autowired實現屬性注入
service層類代碼

@Service
public class UserService {
    public User getUser(){
        return new User("Mysql",666);
    }
}

controller層類代碼
通過屬性注入將service層代碼注入到這

@Controller
public class UserController {
    //屬性注入
    @Autowired
    private UserService userService;
    public User getUser(){
        return userService.getUser();
    }
}

運行結果:

在這里插入圖片描述

構造方法注入

我們還是通過@Autowired注解注入

@Controller
public class UserController {

    private UserService userService;
    //構造方法注入
    @Autowired
    public UserController(UserService userService){
        this.userService = userService;
    }
    public User getUser(){
        return userService.getUser();
    }
}

在這里插入圖片描述

Setter注入

@Controller
public class UserController {
    //Setter注入
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService){
        this.userService = userService;
    }
    public User getUser(){
        return userService.getUser();
    }
}

在這里插入圖片描述

三種注入方式對比

  • 屬性注入簡潔,使用方便! 缺點只能適用于IoC容器,在非IoC容器不適用,并且屬性注入只有在是使用的時候才會出現空指針異常(NPE)
  • 構造方法注入現在官方推薦注入方式! 缺點 如果注入多個對象,就會使得代碼臃腫,不過這就是程序員的問題了,不符合程序設計的單一職責的設計模式,優(yōu)點通用性強,在使用前一定可以保證注入的類不為空!
  • Setter方式是Spring前期推薦的注入方式,通用性不如構造方法注入,現在已經認準構造方法注入!

在進行類注入時,我們還可以通過@Resource注解進行注入!
我們只需要將@Autowired注解換成@Resource即可!

在這里插入圖片描述

@Autowired@Resource區(qū)別

  • 出身不同: @Autowired注解是Spring提供的,@Resource是來自JDK下的注解
  • 使用設置的參數不同:相比@Autowired注解,@Resource注解 支持更多的參數設置 例如name設置,根據name獲取對象

注入同一類型多個Bean對象

我們在Users類中注冊了2個相同類型的Bean對象!

@Component
public class Users {
    @Bean(name = "user1")
    public User user1(){
        User user =  new User("java",666);
        return user;
    }
    @Bean(name = "user2")
    public User user2(){
        User user = new User("MySQL",666);
        return user;
    }
}

當我們直接注入到Controller類中!

@Controller
public class UserController {
    @Resource
    private User user;
    public User getUser(){
        return user;
    }
}

在這里插入圖片描述

因為我們在Spring中注冊了2個相同類型的User對象,所以進行對象裝配時,也需要通過name屬性進行聲明你要裝配的對象名!

@Controller
public class UserController {
    @Resource(name = "user2")
    private User user;
    public User getUser(){
        return user;
    }
}

在這里插入圖片描述

注意:

@Resource注解才提供了name屬性,如果用@Autowried需要加上@Qualifier 注解定義名稱

@Controller
public class UserController {
//    @Resource(name = "user2")
    @Autowired
    @Qualifier(value = "user1")
    private User user;
    public User getUser(){
        return user;
    }
}

在這里插入圖片描述

到此這篇關于Spring五大類注解讀取存儲Bean對象的文章就介紹到這了,更多相關Spring 讀取存儲Bean對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java工作環(huán)境的配置與Eclipse的安裝過程

    Java工作環(huán)境的配置與Eclipse的安裝過程

    這篇文章主要介紹了Java工作環(huán)境的配置與Eclipse的安裝過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 關于SpringCloud灰度發(fā)布的實現

    關于SpringCloud灰度發(fā)布的實現

    這篇文章主要介紹了關于SpringCloud灰度發(fā)布的實現,灰度發(fā)布又稱金絲雀發(fā)布,是在系統升級的時候能夠平滑過渡的一種發(fā)布方式,灰度發(fā)布可以保證整體系統的穩(wěn)定,在初始灰度的時候就可以發(fā)現、調整問題,以保證其影響度,需要的朋友可以參考下
    2023-08-08
  • 利用Java實現文件鎖定功能

    利用Java實現文件鎖定功能

    這篇文章主要為大家詳細介紹了如何利用Java語言實現文件鎖定功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-08-08
  • 分模塊構建Maven工程的方法步驟

    分模塊構建Maven工程的方法步驟

    這篇文章主要介紹了分模塊構建Maven工程的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • SpringBoot引入Thymeleaf的實現方法

    SpringBoot引入Thymeleaf的實現方法

    這篇文章主要介紹了SpringBoot引入Thymeleaf的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Spring重試支持Spring Retry的方法

    Spring重試支持Spring Retry的方法

    本篇文章主要介紹了Spring重試支持Spring Retry的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • java中List集合及其遍歷詳解

    java中List集合及其遍歷詳解

    這篇文章主要介紹了java中List集合及其遍歷詳解的相關資料,需要的朋友可以參考下
    2015-07-07
  • Java對象級別與類級別的同步鎖synchronized語法示例

    Java對象級別與類級別的同步鎖synchronized語法示例

    這篇文章主要為大家介紹了Java對象級別與類級別的同步鎖synchronized語法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Java Stream 流實現合并操作示例

    Java Stream 流實現合并操作示例

    這篇文章主要介紹了Java Stream 流實現合并操作,結合實例形式詳細分析了Java Stream 流實現合并操作原理與相關注意事項,需要的朋友可以參考下
    2020-05-05
  • Postman form-data、x-www-form-urlencoded的區(qū)別及說明

    Postman form-data、x-www-form-urlencoded的區(qū)別及說明

    這篇文章主要介紹了Postman form-data、x-www-form-urlencoded的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

凉山| 宜州市| 江津市| 兰考县| 古浪县| 江华| 大洼县| 剑阁县| 广元市| 竹山县| 南雄市| 介休市| 兴义市| 监利县| 浦县| 河源市| 贵南县| 航空| 修文县| 商都县| 天水市| 阳西县| 贺州市| 遵化市| 静海县| 高唐县| 黑水县| 朝阳县| 博客| 芦山县| 运城市| 南昌县| 常德市| 银川市| 阿克陶县| 南部县| 石狮市| 长兴县| 连云港市| 神农架林区| 罗源县|