<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們上節內容學習瞭如何建立註冊讀取bean
我們發現bean
物件操作十分的繁瑣!
所以我們這個章節,就帶大家來了解更加簡單的bean
操作,通過Spring
下的註解來實現!
我們之前註冊
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種方法
下面我們來演示一下這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(); } }
在進行類注入時,我們還可以通過@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物件的文章就介紹到這了,更多相關Spring 讀取儲存Bean物件內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45