亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring五大類(lèi)注解讀取存儲(chǔ)Bean對(duì)象的方法

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

前情提要

我們上節(jié)內(nèi)容學(xué)習(xí)了如何創(chuàng)建\注冊(cè)\讀取bean
我們發(fā)現(xiàn)bean對(duì)象操作十分的繁瑣!
所以我們這個(gè)章節(jié),就帶大家來(lái)了解更加簡(jiǎn)單的bean操作,通過(guò)Spring下的注解來(lái)實(shí)現(xiàn)!

配置spring-config文件

我們之前注冊(cè)bean是通過(guò)在xml配置文件中,通過(guò)鍵值對(duì)的方式注冊(cè)bean對(duì)象!
顯然這種方式很麻煩,注冊(cè)一個(gè)對(duì)象,就要添加一項(xiàng)!
有沒(méi)有什么好的方式可以讓spring直接去注冊(cè)對(duì)象!
yes!

我們可以直接在配置文件配置好 spring下你要注冊(cè)對(duì)象的包時(shí)那個(gè)!
當(dāng)spring啟動(dòng)后,spring就會(huì)將bean對(duì)象自動(dòng)注冊(cè)!

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注冊(cè)-->
        <content:component-scan base-package="com"></content:component-scan>
</beans>

當(dāng)然只有一個(gè)配置文件顯然不夠嘛!
我們?nèi)绾沃牢覀兇a中的對(duì)象是bean對(duì)象捏?
這就要引入spring五大注解概念了!
我們通過(guò)在我們創(chuàng)建好的對(duì)象上面添加注解的方式,就是告訴spring這個(gè)對(duì)象需要注冊(cè)到容器中!

類(lèi)注解和方法注解

類(lèi)注解:

@Controller@Service@Repository@Component@Configuration

方法注解:
@Bean

我們可以通過(guò)上述兩種注解將對(duì)象存儲(chǔ)到Spring中!

@Controller(控制器存儲(chǔ))

使用@Controller注解存儲(chǔ)bean

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

我們通過(guò)在UserController類(lèi)上加上spring類(lèi)注解,即可完成注冊(cè)對(duì)象!

在啟動(dòng)類(lèi)中讀取bean對(duì)象即可!

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

在這里插入圖片描述

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

我們?cè)谛陆ㄒ粋€(gè)controller包在其下創(chuàng)建TestController類(lèi),并且通過(guò)@Controller注冊(cè)到Spring中!

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

然后我們通過(guò)ApplicationContext上下文對(duì)象讀取bean

在這里插入圖片描述

可以看到出現(xiàn)異常未找到名為textControllerbean對(duì)象!

結(jié)論:只有在掃描包下的類(lèi)才能被Spring注冊(cè)

@Service(服務(wù)存儲(chǔ))

注冊(cè)bean

package com;

import org.springframework.stereotype.Service;

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

讀取bean

在這里插入圖片描述

@Configuration(配置存儲(chǔ))

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

在這里插入圖片描述

@Repository(倉(cāng)庫(kù)存儲(chǔ))

package com;

import org.springframework.stereotype.Repository;

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

在這里插入圖片描述

@Component(組件存儲(chǔ))

package com;

import org.springframework.stereotype.Component;

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

在這里插入圖片描述

5大類(lèi)注解聯(lián)系

在這里插入圖片描述

可以看到這5大類(lèi)注解使用方式一樣,都可以對(duì)對(duì)象進(jìn)行注冊(cè)!
而且注冊(cè)的方式都一樣,既然如此為何還需要5個(gè)注解呢?

我們聯(lián)系實(shí)際生活中的車(chē)牌號(hào),我們雖然車(chē)牌號(hào)的功能都是一樣,但是不同地區(qū)都有自己的車(chē)牌號(hào)!我們通過(guò)車(chē)牌號(hào)就可以分辨出這車(chē)來(lái)自哪里!
而這里5大類(lèi)注解作用也是如此,我們通過(guò)類(lèi)注解,可以知道當(dāng)前類(lèi)的用途!
例如;

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

程序的工程分層,調(diào)用流程如下:

在這里插入圖片描述

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

@Controller層就是保安,先要進(jìn)行檢查驗(yàn)證,然后到達(dá)Service服務(wù)廳詢問(wèn)業(yè)務(wù),不同的業(yè)務(wù)來(lái)到Repository,不同的窗口,然后進(jìn)行相應(yīng)的工作人員辦理業(yè)務(wù)!

類(lèi)注解之前聯(lián)系:

在這里插入圖片描述

可以看到其他4個(gè)注解都是Component注解的子類(lèi)!

Spring給Bean命名規(guī)則

我們可以看到我們剛剛讀取bean對(duì)象時(shí),我們并不知道bean對(duì)象注冊(cè)的id而是直接通過(guò)userController讀取!
難道說(shuō)Spring注冊(cè)bean對(duì)象id為類(lèi)名首字母小寫(xiě),直接就小駝峰?

我們查看Spring源碼驗(yàn)證!

在這里插入圖片描述

我們順藤摸瓜下方就是Spring對(duì)Bean對(duì)象進(jìn)行命名的方法!

 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對(duì)象的id命名規(guī)則如下:

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

我們進(jìn)行驗(yàn)證:

在這里插入圖片描述

方法注解@Bean

我們了解了5大類(lèi)注解可以進(jìn)行對(duì)象注冊(cè),我們使用方法注解進(jìn)行對(duì)象注冊(cè)!
注意: 方法注解要和類(lèi)注解配合使用!

方法注解進(jìn)行對(duì)象注冊(cè)

//User類(lèi)
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類(lèi)
@Component
public class Users {
    @Bean
    public User user(){
        return new User("java",666);
    }
}

在這里插入圖片描述

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

重命名Bean

我們既然可以通過(guò)五大類(lèi)注解進(jìn)行對(duì)象注入!那為何還要多此一舉在方法上加上@Bean方法注解呢?

我們可以通過(guò)@Bean方法注解給bean對(duì)象重命名,可以直接設(shè)置名字!

通過(guò) name={"rename1", "rename2"...}可以重命名多個(gè)!

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

能否通過(guò)之前Spring給我們?cè)O(shè)置的名字訪問(wèn)? 不能

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

在這里插入圖片描述

獲取Bean對(duì)象(對(duì)象裝配)

這里可能聽(tīng)了有點(diǎn)迷,啥玩意對(duì)象裝配,其實(shí)就是獲取對(duì)象!
我們將對(duì)象注冊(cè)到Spring容器下,我們要讀取將對(duì)象取出放入到某個(gè)類(lèi)中,這就是對(duì)象裝配,也叫對(duì)象注入!

實(shí)現(xiàn)對(duì)象裝配的3種方法

  • 屬性注入
  • 構(gòu)造方法注入
  • Setter注入

下面我們來(lái)演示一下這3種注入方式

我們按照實(shí)際開(kāi)發(fā)將Service層的類(lèi)注入到Controller層的類(lèi)中!

屬性注入

我們通過(guò)@Autowired實(shí)現(xiàn)屬性注入
service層類(lèi)代碼

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

controller層類(lèi)代碼
通過(guò)屬性注入將service層代碼注入到這

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

運(yùn)行結(jié)果:

在這里插入圖片描述

構(gòu)造方法注入

我們還是通過(guò)@Autowired注解注入

@Controller
public class UserController {

    private UserService userService;
    //構(gòu)造方法注入
    @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();
    }
}

在這里插入圖片描述

三種注入方式對(duì)比

  • 屬性注入簡(jiǎn)潔,使用方便! 缺點(diǎn)只能適用于IoC容器,在非IoC容器不適用,并且屬性注入只有在是使用的時(shí)候才會(huì)出現(xiàn)空指針異常(NPE)
  • 構(gòu)造方法注入現(xiàn)在官方推薦注入方式! 缺點(diǎn) 如果注入多個(gè)對(duì)象,就會(huì)使得代碼臃腫,不過(guò)這就是程序員的問(wèn)題了,不符合程序設(shè)計(jì)的單一職責(zé)的設(shè)計(jì)模式,優(yōu)點(diǎn)通用性強(qiáng),在使用前一定可以保證注入的類(lèi)不為空!
  • Setter方式是Spring前期推薦的注入方式,通用性不如構(gòu)造方法注入,現(xiàn)在已經(jīng)認(rèn)準(zhǔn)構(gòu)造方法注入!

在進(jìn)行類(lèi)注入時(shí),我們還可以通過(guò)@Resource注解進(jìn)行注入!
我們只需要將@Autowired注解換成@Resource即可!

在這里插入圖片描述

@Autowired@Resource區(qū)別

  • 出身不同: @Autowired注解是Spring提供的,@Resource是來(lái)自JDK下的注解
  • 使用設(shè)置的參數(shù)不同:相比@Autowired注解,@Resource注解 支持更多的參數(shù)設(shè)置 例如name設(shè)置,根據(jù)name獲取對(duì)象

注入同一類(lèi)型多個(gè)Bean對(duì)象

我們?cè)?code>Users類(lèi)中注冊(cè)了2個(gè)相同類(lèi)型的Bean對(duì)象!

@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;
    }
}

當(dāng)我們直接注入到Controller類(lèi)中!

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

在這里插入圖片描述

因?yàn)槲覀冊(cè)?code>Spring中注冊(cè)了2個(gè)相同類(lèi)型的User對(duì)象,所以進(jìn)行對(duì)象裝配時(shí),也需要通過(guò)name屬性進(jìn)行聲明你要裝配的對(duì)象名!

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

在這里插入圖片描述

注意:

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

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

在這里插入圖片描述

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

相關(guān)文章

  • jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    JKS文件由公鑰和密鑰構(gòu)成利用Java?Keytool工具生成的文件,它是由公鑰和密鑰構(gòu)成的,下面這篇文章主要給大家介紹了關(guān)于jdk中keytool的使用以及如何提取jks文件中公鑰和私鑰的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • java實(shí)現(xiàn)菜單滑動(dòng)效果

    java實(shí)現(xiàn)菜單滑動(dòng)效果

    這篇文章主要介紹了java實(shí)現(xiàn)菜單滑動(dòng)效果,效果非常棒,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • idea中導(dǎo)入別人的springboot項(xiàng)目的方法(圖文)

    idea中導(dǎo)入別人的springboot項(xiàng)目的方法(圖文)

    這篇文章主要介紹了idea中導(dǎo)入別人的springboot項(xiàng)目的方法(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • RocketMQ?producer容錯(cuò)機(jī)制源碼解析

    RocketMQ?producer容錯(cuò)機(jī)制源碼解析

    這篇文章主要為大家介紹了RocketMQ?producer容錯(cuò)機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java線程池ThreadPoolExecutor原理及使用實(shí)例

    Java線程池ThreadPoolExecutor原理及使用實(shí)例

    這篇文章主要介紹了Java線程池ThreadPoolExecutor原理及使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • java實(shí)現(xiàn)適用于安卓的文件下載線程類(lèi)

    java實(shí)現(xiàn)適用于安卓的文件下載線程類(lèi)

    本文給大家分享的是java實(shí)現(xiàn)適用于安卓的文件下載線程類(lèi)的代碼,有需要的小伙伴可以參考下
    2015-07-07
  • spring mvc利用ajax向controller傳遞對(duì)象的方法示例

    spring mvc利用ajax向controller傳遞對(duì)象的方法示例

    這篇文章主要給大家介紹了關(guān)于spring mvc利用ajax向controller傳遞對(duì)象的相關(guān)資料,文中通過(guò)示例代碼將步驟介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • spring系列筆記之常用注解

    spring系列筆記之常用注解

    這篇文章主要給大家介紹了關(guān)于spring系列筆記之常用注解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java中Date和Timestamp類(lèi)型的相互轉(zhuǎn)換方式

    java中Date和Timestamp類(lèi)型的相互轉(zhuǎn)換方式

    這篇文章主要介紹了java中Date和Timestamp類(lèi)型的相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java中的布隆過(guò)濾器原理實(shí)現(xiàn)和應(yīng)用

    Java中的布隆過(guò)濾器原理實(shí)現(xiàn)和應(yīng)用

    Java中的布隆過(guò)濾器是一種基于哈希函數(shù)的數(shù)據(jù)結(jié)構(gòu),能夠高效地判斷元素是否存在于一個(gè)集合中。它廣泛應(yīng)用于緩存、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)查詢等領(lǐng)域,在提高程序性能和減少資源消耗方面具有顯著優(yōu)勢(shì)
    2023-04-04

最新評(píng)論