這篇文章主要介紹“Spring如何讀取存儲Bean對象”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring如何讀取存儲Bean對象”文章能幫助大家解決問題。
我們之前注冊
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
注解存儲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
包在其下創建TestController
類,并且通過@Controller
注冊到Spring
中!
package controller; import org.springframework.stereotype.Controller; @Controller //注冊到Spring中! public class TestController { public void sayHi(){ System.out.println("該bean不在掃描的包下"); } }
然后我們通過ApplicationContext
上下文對象讀取bean
可以看到出現異常未找到名為textController
的bean
對象!
結論:只有在掃描包下的類才能被Spring
注冊
注冊bean
package com; import org.springframework.stereotype.Service; @Service // @Service 注解注冊對象! public class UserService { public void sayHi(){ System.out.println("Hello Service注解!"); } }
讀取bean
package com; import org.springframework.context.annotation.Configuration; @Configuration //Configuration注解注冊bean對象 public class UserConfiguration { public void sayHi(){ System.out.println("Hello Configuration注解!"); } }
package com; import org.springframework.stereotype.Repository; @Repository //@Respository 注解注冊對象 public class UserRepository { public void sayHi(){ System.out.println("Hello Respository注解!"); } }
package com; import org.springframework.stereotype.Component; @Component //Component注解注冊對象! public class UserComponent { public void sayHi(){ System.out.println("Hello Component注解!"); } }
可以看到這5大類注解使用方式一樣,都可以對對象進行注冊!
而且注冊的方式都一樣,既然如此為何還需要5個注解呢?
我們聯系實際生活中的車牌號,我們雖然車牌號的功能都是一樣,但是不同地區都有自己的車牌號!我們通過車牌號就可以分辨出這車來自哪里!
而這里5大類注解作用也是如此,我們通過類注解,可以知道當前類的用途!
例如;
@Controller
:表示業務邏輯層@Service
:服務層@Repository
:持久層@Configuration
:配置層
程序的工程分層,調用流程如下:
我們拿去銀行辦業務做類比:
@Controller
層就是保安,先要進行檢查驗證,然后到達Service
服務廳詢問業務,不同的業務來到Repository
,不同的窗口,然后進行相應的工作人員辦理業務!
類注解之前聯系:
可以看到其他4個注解都是Component
注解的子類!
我們可以看到我們剛剛讀取
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
命名規則如下:
對象類類名一般采用大駝峰的形式也就是單詞第一個字母大小,所以Spring
直接bean
對象改為小駝峰,`第一個字母分成小寫!對象類類名不規范,不是大駝峰,第二個字母和第一個字母都是大小!Spring
直接將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
對象重命名,可以直接設置名字!
通過
name={"rename1", "rename2"...}
可以重命名多個!
@Component public class Users { @Bean(name = {"user1"}) public User user(){ return new User("java",666); } }
能否通過之前Spring
給我們設置的名字訪問? 不能
@Bean(name={"user1","user2"})
重命名多個!
我們也可以將name
省略@Bean({"user1"})
這里可能聽了有點迷,啥玩意對象裝配,其實就是獲取對象!
我們將對象注冊到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(); } }
運行結果:
我們還是通過@Autowired
注解注入
@Controller public class UserController { private UserService userService; //構造方法注入 @Autowired public UserController(UserService userService){ this.userService = userService; } public User getUser(){ return userService.getUser(); } }
@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容器不適用,并且屬性注入只有在是使用的時候才會出現空指針異常(NPE)
構造方法注入現在官方推薦注入方式! 缺點 如果注入多個對象,就會使得代碼臃腫,不過這就是程序員的問題了,不符合程序設計的單一職責的設計模式,優點通用性強,在使用前一定可以保證注入的類不為空!
Setter方式是Spring前期推薦的注入方式,通用性不如構造方法注入,現在已經認準構造方法注入!
在進行類注入時,我們還可以通過@Resource
注解進行注入!
我們只需要將@Autowired
注解換成@Resource
即可!
@Autowired
和@Resource
區別
出身不同: @Autowired
注解是Spring
提供的,@Resource
是來自JDK
下的注解
使用設置的參數不同:相比@Autowired
注解,@Resource
注解 支持更多的參數設置 例如name
設置,根據name
獲取對象
我們在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; } }
關于“Spring如何讀取存儲Bean對象”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。