欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring框架學(xué)習(xí)筆記之方法注解@Bean的使用

 更新時間:2023年12月06日 09:06:29   作者:小浪學(xué)編程  
這篇文章主要給大家介紹了關(guān)于Spring框架學(xué)習(xí)筆記之方法注解@Bean使用的相關(guān)資料,這是一個我們很常用的注解,作用是指示一個方法生成一個由Spring管理的Bean,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、如何使用方法注解

??1、前面介紹過,類注解是寫到類上面的,那么方法注解是寫到對應(yīng)的方法上的;

    @Bean(name = "user1") 
    public User getUser1() {
        User user = new User();
        user.setId(1);
        user.setName("張三");
        return user;
    }

2、方法注解的話是不能夠單獨(dú)使用的,如果我們只給一個方法注解@Bean的話,看是否能運(yùn)行;

 ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
 User user = context.getBean(User.class);//只使用類屬性
 System.out.println(user);

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

6b10299ea7a04d3a9d1dc8ced9646992.png

如何解決?我們只需要在方法注解的類中添加一個類注解即可;

887ef81e144847ccb2e749d6c50baa23.png

再次運(yùn)行:

91c3018dc0df43f8972d1b31be2ca865.png

注意Bean 的命名規(guī)則,當(dāng)沒有設(shè)置 name 屬性時,那么 bean 默認(rèn)的名稱就是方法名,當(dāng)設(shè)置了 name 屬性之后,只能通過重命名的 name 屬性對應(yīng)的值來獲取,也就是說重命名之后,再使用方法名就獲取不到 bean 對象;

比如已經(jīng)給bean重命名了,我們在啟動類App中通過方法名來獲取Bean對象;

7f7bcc809f0945e3981d10756c22c023.png

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

2f5341d04adf49ed87b55fa725772cda.png

二、同一類型的對象注入多次的問題

1、在UserBeans類中寫兩個對象注解;

@Component
public class UserBeans {
    @Bean(name = "user1") // 【注意事項:只使用一個 @Bean 是無法將對象存儲到容器中的】
    public User getUser1() {
        User user = new User();
        user.setId(1);
        user.setName("張三");
        return user;
    }
 
    @Bean(name = "user2") // 【注意事項:只使用一個 @Bean 是無法將對象存儲到容器中的】
    public User getUser2() {
        User user = new User();
        user.setId(2);
        user.setName("李四");
        return user;
    }

2、通過啟動類來獲取對象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean(User.class);//只使用類屬性
System.out.println(user);

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

9d11f93964b14f7496cad85c3d4aaac9.png

翻譯過來的意思就是:沒有可用的“com.User”類型的合格bean:應(yīng)為單個匹配bean,但找到2:user1,user2;

那么,如何解決呢?這里我們提供了三種解決方案;

1、精準(zhǔn)的描述bean的名稱(將注入的名稱寫對)

比如我們在啟動類中使用id+class的形式來取對象;

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean("user1",User.class);//只使用類屬性
System.out.println(user);

運(yùn)行結(jié)果:沒有問題;

a95764c8b2994e24b7719b05c6a2a250.png

2、使用@Resource設(shè)置name的方式來重命名注入的對象;

1、這里我們通過UserController類來進(jìn)行演示;注意我們添加的注解@Resource,下面新寫了一個對象user1;

package com;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
 
import javax.annotation.Resource;
 
@Controller
public class UserController {
    @Resource
    private User user1;
    public void sayHi(){
        System.out.println("User"+user1);
    }
}

啟動類App中代碼:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean(UserController.class);
userController.sayHi();

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

c3427d0324524f45a5b33326909721b0.png

3、使用@AutoWired+@Qualifier來篩選bean對象;

UserController代碼:

package com;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
 
import javax.annotation.Resource;
 
@Controller
public class UserController {
    @Autowired
    @Qualifier(value = "user2")
    private User user2;
    public void sayHi(){
        System.out.println("User"+user2);
    }
}

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

7dfeb12369de4c22a18d8fa934dc987a.png

對象注入的三種方法

1、屬性注入

屬性注?是使? @Autowired 實現(xiàn)的,將 Service 類注?到 Controller 類中。

package com;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
/**
 * 根據(jù)屬性實現(xiàn) bean 對象的注入
 */
@Controller
public class UserController2 {
    // 對象注入方式1:屬性注入
    @Autowired
    private UserService userService;
    public void sayHi() {
        userService.sayHi();
    }
 
}

啟動類App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2 = context.getBean(UserController2.class);
userController2.sayHi();

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

9e0802c7718e4f1890216f6f47e8e847.png

2、構(gòu)造方法注入

package com;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
 
/**
 * 使用構(gòu)造方法實現(xiàn) bean 注入
 */
@Controller
public class UserController3 {
 
    private UserService userService;
 
    // 構(gòu)造方法注入(官廣推薦寫法)
    @Autowired
    public UserController3(UserService userService) {
//        userService = new UserService(); // 傳統(tǒng)的寫法
        this.userService = userService;
    }
    
    public void sayHi() {
        userService.sayHi();
    }
 
}

注:如果當(dāng)前類只存在一個構(gòu)造方法,那么@Autowired注解可以省略;

啟動類App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController3 userController3 = context.getBean(UserController3.class);
userController3.sayHi();

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

2c933cecf82e437c9f62bbdfb0d0a68b.png

3、Setter方法注入

package com;
 
import org.springframework.stereotype.Controller;
 
import javax.annotation.Resource;
 
/**
 * 使用 Setter 實現(xiàn) bean 注入
 */
@Controller
public class UserController4 {
 
    private UserService userService;
 
    @Resource
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
    public void sayHi() {
        userService.sayHi();
    }
}

啟動類App:

ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
UserController4 userController4 = context.getBean(UserController4.class);
userController4.sayHi();

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

36282f832a3b4bfa8814fb3273fce9be.png

屬性注入和構(gòu)造方法注入以及 Setter 注入的區(qū)別是什么?

??1、屬性注入:特點(diǎn)寫法簡單。但是通用性不好,它只能運(yùn)行在 IoC 容器下,如果是非 IOC 容器就會出現(xiàn)問題。

??2、Setter 注入:早期 Spring 版本推薦的寫法,Setter 注入通用性沒有構(gòu)造方法注入通用。

??3、構(gòu)造方法注入: 通用性更好、它能確保在使用注入對象之前,此注入對象一定初始化過了。當(dāng)構(gòu)造方法注入?yún)?shù)過多時,此時開發(fā)者就要檢查自己所寫的代碼是否符合單一設(shè)計原則的規(guī)范了,此注入方式也是 spring后期版本中推薦的注入方式。

注意:@Resource注解只支持屬性注入和Setter注入,不支持構(gòu)造方法注入;

@Resource VS @Autowired?

??出身不同: @Resource 來著與 JDK (Java 親兒子) ,@Autowired 是 Spring 框架提供的。

??2、用法不同: @Autowired 支持屬性注入、構(gòu)造方法注入和 Setter 注入,而 @Resource 不支持構(gòu)造方法注入。

??3、支持的參數(shù)不同: @Resource 支持更多的參數(shù)設(shè)置,比如 name、type 設(shè)置;@Autowired 只支持required 參數(shù)設(shè)置。

總結(jié)

到此這篇關(guān)于Spring框架學(xué)習(xí)筆記之方法注解@Bean的使用的文章就介紹到這了,更多相關(guān)Spring方法注解@Bean使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java http請求封裝工具類代碼實例

    Java http請求封裝工具類代碼實例

    這篇文章主要介紹了Java http請求封裝工具類代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    這篇文章主要為大家介紹了Java內(nèi)存管理垃圾回收基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • java對接第三方接口的3種常用方式

    java對接第三方接口的3種常用方式

    java語言中調(diào)用第三方接口,可以使用的方法有很多,下面這篇文章主要給大家介紹了關(guān)于java對接第三方接口的3種常用方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Java中異常Exception和捕獲以及自定義異常詳解

    Java中異常Exception和捕獲以及自定義異常詳解

    在工作過程中,我們常常需要在合適的地方拋出合適的異常,除了java自帶的一些異常,我們可以在項目中定制自己的異常,并且全局捕獲它,下面這篇文章主要給大家介紹了關(guān)于Java中異常Exception和捕獲以及自定義異常的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • java實現(xiàn)飯店點(diǎn)菜系統(tǒng)

    java實現(xiàn)飯店點(diǎn)菜系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)飯店點(diǎn)菜系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringBoot Actuator未授權(quán)訪問漏洞解決方案

    SpringBoot Actuator未授權(quán)訪問漏洞解決方案

    工作的時候遇到過提示Spring Boot后端存在Actuator未授權(quán)訪問漏洞,網(wǎng)上有很多詳細(xì)的解釋文章,在這里做一個簡單的總結(jié)、介紹和分享,需要的朋友可以參考下
    2023-09-09
  • spring mvc rest 接口選擇性加密解密詳情

    spring mvc rest 接口選擇性加密解密詳情

    這篇文章主要介紹了spring mvc rest 接口選擇性加密解密詳情,spring mvc rest接口以前是采用https加密的,但是現(xiàn)在需要更加安全的加密。而且不是對所有的接口進(jìn)行加密,是對部分接口進(jìn)行加密,接口返回值進(jìn)行解密
    2022-07-07
  • java線程池ThreadPoolExecutor類使用小結(jié)

    java線程池ThreadPoolExecutor類使用小結(jié)

    這篇文章主要介紹了java線程池ThreadPoolExecutor類使用,本文主要對ThreadPoolExecutor的使用方法進(jìn)行一個詳細(xì)的概述,示例代碼介紹了ThreadPoolExecutor的構(gòu)造函數(shù)的相關(guān)知識,感興趣的朋友一起看看吧
    2022-03-03
  • Maven屬性與版本管理詳細(xì)步驟分解

    Maven屬性與版本管理詳細(xì)步驟分解

    這篇文章主要介紹了Maven中關(guān)于屬性與版本控制管理的步驟操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評論