溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring如何讀取存儲Bean對象

發布時間:2022-09-05 09:31:33 來源:億速云 閱讀:201 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring如何讀取存儲Bean對象”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring如何讀取存儲Bean對象”文章能幫助大家解決問題。

    配置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五大注解概念了!
    我們通過在我們創建好的對象上面添加注解的方式,就是告訴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();
        }
    }

    Spring如何讀取存儲Bean對象

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

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

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

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

    Spring如何讀取存儲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

    Spring如何讀取存儲Bean對象

    @Configuration(配置存儲)

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

    Spring如何讀取存儲Bean對象

    @Repository(倉庫存儲)

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

    Spring如何讀取存儲Bean對象

    @Component(組件存儲)

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

    Spring如何讀取存儲Bean對象

    5大類注解聯系

    Spring如何讀取存儲Bean對象

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

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

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

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

    Spring如何讀取存儲Bean對象

    我們拿去銀行辦業務做類比:

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

    類注解之前聯系:

    Spring如何讀取存儲Bean對象

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

    Spring給Bean命名規則

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

    我們查看Spring源碼驗證!

    Spring如何讀取存儲Bean對象

    我們順藤摸瓜下方就是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命名規則如下:

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

    我們進行驗證:

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

    Spring如何讀取存儲Bean對象

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

    重命名Bean

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

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

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

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

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

    Spring如何讀取存儲Bean對象

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

    Spring如何讀取存儲Bean對象

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

    Spring如何讀取存儲Bean對象

    Spring如何讀取存儲Bean對象

    獲取Bean對象(對象裝配)

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

    實現對象裝配的3種方法

    • 屬性注入

    • 構造方法注入

    • Setter注入

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

    我們按照實際開發將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();
        }
    }

    運行結果:

    Spring如何讀取存儲Bean對象

    構造方法注入

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

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

    Spring如何讀取存儲Bean對象

    Setter注入

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

    Spring如何讀取存儲Bean對象

    三種注入方式對比

    • 屬性注入簡潔,使用方便! 缺點只能適用于IoC容器,在非IoC容器不適用,并且屬性注入只有在是使用的時候才會出現空指針異常(NPE)

    • 構造方法注入現在官方推薦注入方式! 缺點 如果注入多個對象,就會使得代碼臃腫,不過這就是程序員的問題了,不符合程序設計的單一職責的設計模式,優點通用性強,在使用前一定可以保證注入的類不為空!

    • Setter方式是Spring前期推薦的注入方式,通用性不如構造方法注入,現在已經認準構造方法注入!

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

    Spring如何讀取存儲Bean對象

    @Autowired@Resource區別

    • 出身不同: @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如何讀取存儲Bean對象

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

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

    Spring如何讀取存儲Bean對象

    注意:

    @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對象”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女