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

Spring中存儲(chǔ)Bean的常見(jiàn)注解方式

 更新時(shí)間:2024年09月20日 10:32:59   作者:kunkun101  
Spring框架中的控制反轉(zhuǎn)(IoC)和依賴(lài)注入(DI)是核心概念,實(shí)現(xiàn)了對(duì)象的解耦和動(dòng)態(tài)依賴(lài),IoC容器負(fù)責(zé)對(duì)象的生命周期和對(duì)象間的依賴(lài)關(guān)系,通過(guò)DI方式注入依賴(lài),本文介紹Spring中存儲(chǔ)Bean的常見(jiàn)注解方式,感興趣的朋友一起看看吧

IoC & DI

IoC: Inversion of Control (控制反轉(zhuǎn)), 也就是說(shuō) Spring 是?個(gè)"控制反轉(zhuǎn)"的容器.

控制反轉(zhuǎn):也就是控制權(quán)反轉(zhuǎn). 什么的控制權(quán)發(fā)?了反轉(zhuǎn)? 獲得依賴(lài)對(duì)象的過(guò)程被反轉(zhuǎn)了
也就是說(shuō), 當(dāng)需要某個(gè)對(duì)象時(shí), 傳統(tǒng)開(kāi)發(fā)模式中需要??通過(guò) new 創(chuàng)建對(duì)象, 現(xiàn)在不需要再進(jìn)?創(chuàng)
建, 把創(chuàng)建對(duì)象的任務(wù)交給容器
, 程序中只需要依賴(lài)注? (Dependency Injection,DI)就可以了.
這個(gè)容器稱(chēng)為:IoC容器. Spring是?個(gè)IoC容器, 所以有時(shí)Spring 也稱(chēng)為Spring 容器。

DI: Dependency Injection(依賴(lài)注?)
容器在運(yùn)?期間, 動(dòng)態(tài)的為應(yīng)?程序提供運(yùn)?時(shí)所依賴(lài)的資源,稱(chēng)之為依賴(lài)注?

依賴(lài)注?(DI)和控制反轉(zhuǎn)(IoC)是從不同的?度的描述的同?件事情,就是指通過(guò)
引? IoC 容器,利?依賴(lài)關(guān)系注?的?式,實(shí)現(xiàn)對(duì)象之間的解耦。

IOC(控制反轉(zhuǎn))詳解

共有兩類(lèi)注解類(lèi)型可以實(shí)現(xiàn)Bean的存儲(chǔ):
1. 類(lèi)注解:@Controller、@Service、@Repository、@Component、@Configuration.
2. ?法注解:@Bean.

類(lèi)注解

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

使? @Controller 存儲(chǔ) bean 的代碼如下所?: 

@Controller // 將對(duì)象存儲(chǔ)到 Spring 中
public class UserController {
  public void sayHi(){
       System.out.println("hi,UserController...");
      }
}

表示將這個(gè)類(lèi)的對(duì)象存儲(chǔ)到ioc容器當(dāng)中,并表明這是一個(gè)controller類(lèi)。負(fù)責(zé) 接收請(qǐng)求, 對(duì)請(qǐng)求進(jìn)?處理, 并進(jìn)?響應(yīng)。

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

使? @Service 存儲(chǔ) bean 的代碼如下所?:

@Service
public class UserService {
   public void sayHi(String name) {
       System.out.println("Hi," + name);
    }
}

表示將這個(gè)類(lèi)的對(duì)象存儲(chǔ)到ioc容器當(dāng)中,并表明這是一個(gè)service類(lèi)。負(fù)責(zé)處理具體的業(yè)務(wù)邏輯。

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

使? @Repository 存儲(chǔ) bean 的代碼如下所?:

@Repository
public class UserRepository {
  public void sayHi() {
    System.out.println("Hi, UserRepository~");
   }
}

表示數(shù)據(jù)訪問(wèn)層,也稱(chēng)為持久層. 負(fù)責(zé)數(shù)據(jù)訪問(wèn)操作。

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

使? @Component 存儲(chǔ) bean 的代碼如下所?:

@Component
public class UserComponent {
  public void sayHi() {
     System.out.println("Hi, UserComponent~");
   }
}

 單純將這個(gè)類(lèi)的對(duì)象加入到ioc容器中,沒(méi)有其他含義。

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

使? @Configuration 存儲(chǔ) bean 的代碼如下所?:

@Configuration
public class UserConfiguration {
  public void sayHi() {
    System.out.println("Hi,UserConfiguration~");
   }
}

表示配置層. 處理項(xiàng)?中的?些配置信息。

方法注解

@Bean

@Bean注解可以將類(lèi)中的方法注入到ioc容器當(dāng)中,使一個(gè)類(lèi)可以擁有多個(gè)對(duì)象。

使用@Bean注解存儲(chǔ)bean代碼如下:

@Component
public class BeanConfig {
   @Bean
   public User user(){
      User user = new User();
      user.setName("zhangsan");
      user.setAge(18);
      return user;
    }
}

@Bean注解必須搭配@Component注解使用才能生效。否則無(wú)效。

@Bean注解的優(yōu)勢(shì)在于同一個(gè)類(lèi)可以定義多個(gè)對(duì)象

@Component
public class BeanConfig {
  @Bean
  public User user1(){
    User user = new User();
    user.setName("zhangsan");
    user.setAge(18);
    return user;
  }
  @Bean
  public User user2(){
    User user = new User();
    user.setName("lisi");
    user.setAge(19);
    return user;
  }
}

類(lèi)中的兩個(gè)Bean對(duì)象的名稱(chēng)如下: 

可以通過(guò)設(shè)置 name 屬性給 Bean 對(duì)象進(jìn)?重命名操作,如下代碼所?:

@Bean(name = {"u1","user1"})
public User user1(){
    User user = new User();
    user.setName("zhangsan");
    user.setAge(18);
    return user;
}

 依賴(lài)注入的三種方式

關(guān)于依賴(lài)注?, Spring給我們提供了三種?式:

1. 屬性注?(Field Injection)

屬性注?是使? @Autowired 實(shí)現(xiàn)的,如將 Service 類(lèi)注?到 Controller 類(lèi)中.

Service 類(lèi)的實(shí)現(xiàn)代碼如下:

@Service
public class UserService {
   public void sayHi() {
     System.out.println("Hi,UserService");
  }
}

Controller 類(lèi)的實(shí)現(xiàn)代碼如下:

@Controller
public class UserController {
   //注??法1: 屬性注?
@Autowired
private UserService userService;
   public void sayHi(){
      System.out.println("hi,UserController...");
      userService.sayHi();
   }
}

最終結(jié)果如下:

2. 構(gòu)造方法注?(Constructor Injection)

構(gòu)造?法注?是在類(lèi)的構(gòu)造?法中實(shí)現(xiàn)注?,如下代碼所示:

@Controller
public class UserController2 {
//注??法2: 構(gòu)造?法
  private UserService userService;
  @Autowired
  public UserController2(UserService userService) {
     this.userService = userService;
  }
  public void sayHi(){
    System.out.println("hi,UserController2...");
    userService.sayHi();
  }
}

注意事項(xiàng):如果類(lèi)只有?個(gè)構(gòu)造?法,那么 @Autowired 注解可以省略;如果類(lèi)中有多個(gè)構(gòu)造?法,那么需要添加上 @Autowired 來(lái)明確指定到底使?哪個(gè)構(gòu)造?法。

3. Setter 注?(Setter Injection)

Setter 注?和屬性的 Setter ?法實(shí)現(xiàn)類(lèi)似,只不過(guò)在設(shè)置 set ?法的時(shí)候需要加上 @Autowired 注
解 ,如下代碼所?:

@Controller
public class UserController3 {
//注??法3: Setter?法注?
private UserService userService;
  @Autowired
  public void setUserService(UserService userService) {
     this.userService = userService;
  }
  public void sayHi(){
     System.out.println("hi,UserController3...");
     userService.sayHi();
  }
}

 特殊情況:當(dāng)同一類(lèi)型存在多個(gè)bean對(duì)象時(shí),使用@Autowired會(huì)出現(xiàn)問(wèn)題。

@Component
public class BeanConfig {
  @Bean("u1")
  public User user1(){
    User user = new User();
    user.setName("zhangsan");
    user.setAge(18);
    return user;
  }
  @Bean
  public User user2() {
    User user = new User();
    user.setName("lisi");
    user.setAge(19);
    return user;
  }
}
@Controller
public class UserController {
@Autowired
private UserService userService;
//注?user
@Autowired
private User user;
  public void sayHi(){
    System.out.println("hi,UserController...");
    userService.sayHi();
    System.out.println(user);
  }
}

spring提供了以下解決方案:

@Primary

使?@Primary注解:當(dāng)存在多個(gè)相同類(lèi)型的Bean注?時(shí),加上@Primary注解,來(lái)確定默認(rèn)的實(shí)現(xiàn).

@Component
public class BeanConfig {
@Primary //指定該bean為默認(rèn)bean的實(shí)現(xiàn)
  @Bean("u1")
  public User user1(){
    User user = new User();
    user.setName("zhangsan");
    user.setAge(18);
    return user;
  }
  @Bean
  public User user2() {
    User user = new User();
    user.setName("lisi");
    user.setAge(19);
    return user;
  }
}

 @Qualifier

使?@Qualifier注解:指定當(dāng)前要注?的bean對(duì)象。 在@Qualifier的value屬性中,指定注?的bean的名稱(chēng)。
• @Qualifier注解不能單獨(dú)使?,必須配合@Autowired使?

@Controller
public class UserController {
@Qualifier("user2") //指定bean名稱(chēng)
@Autowired
private User user;
  public void sayHi(){
    System.out.println("hi,UserController...");
    System.out.println(user);
  }
}

 @Resource

使?@Resource注解:是按照bean的名稱(chēng)進(jìn)?注?。通過(guò)name屬性指定要注?的bean的名稱(chēng)。

@Controller
public class UserController {
@Resource(name = "user2")
private User user;
  public void sayHi(){
     System.out.println("hi,UserController...");
     System.out.println(user);
  }
}

常??試題:
@Autowird 與 @Resource的區(qū)別
• @Autowired 是spring框架提供的注解,?@Resource是JDK提供的注解
• @Autowired 默認(rèn)是按照類(lèi)型注?,?@Resource是按照名稱(chēng)注?. 相?于 @Autowired 來(lái)說(shuō),
@Resource ?持更多的參數(shù)設(shè)置,例如 name 設(shè)置,根據(jù)名稱(chēng)獲取 Bean。

以上關(guān)于IOC與DI,希望對(duì)你有所幫助。

到此這篇關(guān)于Spring中存儲(chǔ)Bean的常見(jiàn)注解方式的文章就介紹到這了,更多相關(guān)Spring存儲(chǔ)Bean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程

    Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程

    Geotools作為一款功能強(qiáng)大且開(kāi)源的地理工具庫(kù),為地理數(shù)據(jù)的處理和分析提供了豐富的類(lèi)庫(kù)和便捷的接口,能夠很好地滿足從DEM數(shù)據(jù)中讀取高程信息這一實(shí)戰(zhàn)需求,本文將深入講解如何利用Geotools從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過(guò)程,需要的朋友可以參考下
    2025-03-03
  • 解決springmvc使用@PathVariable路徑匹配問(wèn)題

    解決springmvc使用@PathVariable路徑匹配問(wèn)題

    這篇文章主要介紹了解決springmvc使用@PathVariable路徑匹配問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java基于Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除

    java基于Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除

    本篇文章主要介紹了Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除,實(shí)現(xiàn)了FTP文件上傳(斷點(diǎn)續(xù)傳)、FTP文件下載、FTP文件重命名、FTP文件刪除等功能,有需要的可以了解一下。
    2016-11-11
  • 解決IDEA 2020.3 lombok失效問(wèn)題

    解決IDEA 2020.3 lombok失效問(wèn)題

    這篇文章主要介紹了IDEA 2020.3 lombok失效問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java中進(jìn)行異步調(diào)用失敗的解決方法詳解

    Java中進(jìn)行異步調(diào)用失敗的解決方法詳解

    異步編程是一種非阻塞的編程模式,允許程序在等待某個(gè)操作完成時(shí)繼續(xù)執(zhí)行其他任務(wù),而不是一直等待,下面我們就來(lái)看看異步調(diào)用失敗的相關(guān)解決方法吧
    2026-01-01
  • Java 給PDF簽名時(shí)添加可信時(shí)間戳的方法

    Java 給PDF簽名時(shí)添加可信時(shí)間戳的方法

    這篇文章主要介紹了Java 給PDF簽名時(shí)添加可信時(shí)間戳,關(guān)于jar導(dǎo)入的問(wèn)題,本文給大家?guī)?lái)兩種方法,一種是手動(dòng)導(dǎo)入另一種是maven配置導(dǎo)入,需要的朋友可以參考下
    2021-07-07
  • Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解

    Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解,ThreadPoolExecutor 使用 int 的高 3 位來(lái)表示線程池狀態(tài),低 29 位表示線程數(shù)量,之所以將信息存儲(chǔ)在一個(gè)變量中,是為了保證原子性,需要的朋友可以參考下
    2024-01-01
  • Maven的使用之繼承與聚合

    Maven的使用之繼承與聚合

    這篇文章主要為大家詳細(xì)介紹了Maven的繼承和聚合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2023-04-04
  • springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    下面小編就為大家分享一篇springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 最新評(píng)論

    巴林左旗| 通化市| 莱州市| 崇信县| 洛阳市| 涿州市| 吉木乃县| 嘉峪关市| 山阴县| 顺平县| 阿勒泰市| 北碚区| 宜宾县| 夏邑县| 黑山县| 华蓥市| 江山市| 随州市| 普陀区| 香港 | 抚宁县| 海林市| 吉林省| 关岭| 南陵县| 靖安县| 思南县| 太和县| 南和县| 岱山县| 磴口县| 利辛县| 潜江市| 甘孜县| 银川市| 靖江市| 玉环县| 海安县| 铜川市| 肇源县| 神农架林区|