Spring五大類注解讀取存儲Bean對象的方法
前情提要
我們上節(jié)內(nèi)容學習了如何創(chuàng)建\注冊\讀取bean
我們發(fā)現(xiàn)bean對象操作十分的繁瑣!
所以我們這個章節(jié),就帶大家來了解更加簡單的bean操作,通過Spring下的注解來實現(xiàn)!
配置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>當然只有一個配置文件顯然不夠嘛!
我們?nèi)绾沃牢覀兇a中的對象是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

可以看到出現(xiàn)異常未找到名為textController的bean對象!
結(jié)論:只有在掃描包下的類才能被Spring注冊
@Service(服務(wù)存儲)
注冊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大類注解聯(lián)系

可以看到這5大類注解使用方式一樣,都可以對對象進行注冊!
而且注冊的方式都一樣,既然如此為何還需要5個注解呢?
我們聯(lián)系實際生活中的車牌號,我們雖然車牌號的功能都是一樣,但是不同地區(qū)都有自己的車牌號!我們通過車牌號就可以分辨出這車來自哪里!
而這里5大類注解作用也是如此,我們通過類注解,可以知道當前類的用途!
例如;
@Controller:表示業(yè)務(wù)邏輯層@Service:服務(wù)層@Repository:持久層@Configuration:配置層
程序的工程分層,調(diào)用流程如下:

我們拿去銀行辦業(yè)務(wù)做類比:
@Controller層就是保安,先要進行檢查驗證,然后到達Service服務(wù)廳詢問業(yè)務(wù),不同的業(yè)務(wù)來到Repository,不同的窗口,然后進行相應的工作人員辦理業(yè)務(wù)!
類注解之前聯(lián)系:

可以看到其他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對象重命名,可以直接設(shè)置名字!
通過
name={"rename1", "rename2"...}可以重命名多個!
@Component
public class Users {
@Bean(name = {"user1"})
public User user(){
return new User("java",666);
}
}
能否通過之前Spring給我們設(shè)置的名字訪問? 不能

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

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


獲取Bean對象(對象裝配)
這里可能聽了有點迷,啥玩意對象裝配,其實就是獲取對象!
我們將對象注冊到Spring容器下,我們要讀取將對象取出放入到某個類中,這就是對象裝配,也叫對象注入!
實現(xiàn)對象裝配的3種方法
- 屬性注入
- 構(gòu)造方法注入
- Setter注入
下面我們來演示一下這3種注入方式
我們按照實際開發(fā)將Service層的類注入到Controller層的類中!
屬性注入
我們通過@Autowired實現(xiàn)屬性注入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();
}
}
運行結(jié)果:

構(gòu)造方法注入
我們還是通過@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();
}
}
三種注入方式對比
- 屬性注入簡潔,使用方便! 缺點只能適用于IoC容器,在非IoC容器不適用,并且屬性注入只有在是使用的時候才會出現(xiàn)空指針異常(NPE)
- 構(gòu)造方法注入現(xiàn)在官方推薦注入方式! 缺點 如果注入多個對象,就會使得代碼臃腫,不過這就是程序員的問題了,不符合程序設(shè)計的單一職責的設(shè)計模式,優(yōu)點通用性強,在使用前一定可以保證注入的類不為空!
- Setter方式是Spring前期推薦的注入方式,通用性不如構(gòu)造方法注入,現(xiàn)在已經(jīng)認準構(gòu)造方法注入!
在進行類注入時,我們還可以通過@Resource注解進行注入!
我們只需要將@Autowired注解換成@Resource即可!

@Autowired和@Resource區(qū)別
- 出身不同:
@Autowired注解是Spring提供的,@Resource是來自JDK下的注解 - 使用設(shè)置的參數(shù)不同:相比
@Autowired注解,@Resource注解 支持更多的參數(shù)設(shè)置 例如name設(shè)置,根據(jù)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;
}
}

到此這篇關(guān)于Spring五大類注解讀取存儲Bean對象的文章就介紹到這了,更多相關(guān)Spring 讀取存儲Bean對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰
JKS文件由公鑰和密鑰構(gòu)成利用Java?Keytool工具生成的文件,它是由公鑰和密鑰構(gòu)成的,下面這篇文章主要給大家介紹了關(guān)于jdk中keytool的使用以及如何提取jks文件中公鑰和私鑰的相關(guān)資料,需要的朋友可以參考下2024-03-03
Java線程池ThreadPoolExecutor原理及使用實例
這篇文章主要介紹了Java線程池ThreadPoolExecutor原理及使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05
spring mvc利用ajax向controller傳遞對象的方法示例
這篇文章主要給大家介紹了關(guān)于spring mvc利用ajax向controller傳遞對象的相關(guān)資料,文中通過示例代碼將步驟介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來跟著小編一起學習學習吧。2017-07-07
java中Date和Timestamp類型的相互轉(zhuǎn)換方式
這篇文章主要介紹了java中Date和Timestamp類型的相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

