Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法
在上一篇文章中實(shí)現(xiàn)了基本的Spring讀取和存儲(chǔ)對(duì)象。但在操作的過(guò)程中我們發(fā)現(xiàn)讀取和存儲(chǔ)對(duì)象并沒(méi)有想象中的那么“簡(jiǎn)單”。
所以接下來(lái)我們要講解更加簡(jiǎn)單的操作 Bean 對(duì)象的?法。其核心就是,使用注解。
1.Spring的存儲(chǔ)對(duì)象------存儲(chǔ)Bean對(duì)象
之前我們存儲(chǔ) Bean 時(shí),需要在 spring-config 中添加?? bean 注冊(cè)內(nèi)容才?,如下圖所示:
?現(xiàn)在我們只需要?個(gè)注解就可以替代之前要寫??配置的尷尬了。
類注解規(guī)則:1.類名前兩位均為大寫時(shí),返回自身name
2.否則,首字母小寫
1.前置工作,配置掃描路徑
想要將對(duì)象成功的存儲(chǔ)到 Spring 中,我們需要配置?下存儲(chǔ)對(duì)象的掃描包路徑,只有被配置的包下的所有類,添加了注解才能被正確的識(shí)別并保存到 Spring 中。
在spring-config.xml中添加如下配置:
<?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"> <content:component-scan base-package="org.example"></content:component-scan> </beans>
其中標(biāo)紅的一行為注冊(cè)掃描的包,如下圖所示:
注意:即使添加了注解,如果不是在配置的掃描包下的類對(duì)象,也是不能被存儲(chǔ)到Spring中的。
2.添加注解存儲(chǔ)Bean對(duì)象
想要將對(duì)象存儲(chǔ)在 Spring 中,有兩種注解類型可以實(shí)現(xiàn):
1. 類注解:@Controller、@Service、@Repository、@Component、@Configuration。
2. ?法注解:@Bean。
1.@Controller(控制器存儲(chǔ))
使用@Controller存儲(chǔ)Bean的代碼如下所示:
@Controller public class UserController { public void sayHi(){ System.out.println("hi,userController~"); } }
在App中讀取上面的UserController對(duì)象:
public class App { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); UserController userController=(UserController) context.getBean("userController"); userController.sayHi(); } }
運(yùn)行結(jié)果:
這里并沒(méi)有在spring-config.xml中添加id,但是依舊能正確運(yùn)行。是因?yàn)锧Controller注解自動(dòng)的起到了一個(gè)id的作用。作用與如下代碼一致:
<bean id="userController" class="org.example.UserController"></bean>
2.@service(服務(wù)存儲(chǔ))
使用@service存儲(chǔ)Bean的代碼如下所示:
@Service public class UserService { public void doService(){ System.out.println("doService"); } }
在App中讀取上面的UserService對(duì)象:
public class App { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); UserService userService=(UserService) context.getBean("userService"); userService.doService(); } }
3.@Repository(倉(cāng)庫(kù)存儲(chǔ))
使用@Repository存儲(chǔ)Bean的代碼如下所示:
@Repository public class UserRepository { public void sayHi(){ System.out.println("hi,repository"); } }
在App中讀取上面的UserRepository對(duì)象:
public class App { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); UserRepository userRepository=(UserRepository) context.getBean("userRepository"); userRepository.sayHi(); } }
4.@Component(組件存儲(chǔ))
使用@Component存儲(chǔ)Bean的代碼如下所示:
@Component public class UserComponent { public void sayHi(){ System.out.println("hi,component"); } }
在App中讀取上面的UserComponent對(duì)象:
public class App { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); UserComponent userComponent=(UserComponent) context.getBean("userComponent"); userComponent.sayHi(); } }
5.@Configuration(配置存儲(chǔ))
使用@Configuration存儲(chǔ)Bean的代碼如下所示:
@Configuration public class UserConfiguration { public void doConfiguration(){ System.out.println("hi,Configuration"); } }
在App中讀取上面的UserConfiguration對(duì)象:
public class App { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml"); UserConfiguration userConfiguration=(UserConfiguration) context.getBean("userConfiguration"); userConfiguration.doConfiguration(); } }
3.為什么這么多類注解
由以上對(duì)每個(gè)注解的介紹,可以看出,這些注解的功能都是一樣的,那么為什么需要這么多類注解呢?
其目的就是讓程序員看到類注解之后,就能直接了解當(dāng)前類的用途。
@Controller:表示業(yè)務(wù)邏輯層,通常是指程序的入口,比如:參數(shù)校驗(yàn),參數(shù)類型轉(zhuǎn)換等前置處理工作。
@Service:服務(wù)層,一般寫業(yè)務(wù)代碼,服務(wù)編排,比如:調(diào)用DB,調(diào)用第三方接口。
@Repository:持久層,倉(cāng)庫(kù),通常指DB操作相關(guān)的代碼。(通常放在DAO層下面)
@Component:其它的對(duì)象。
@Configuration:配置層。
程序的工程分層,調(diào)用流程如下:
1.類注解之間的關(guān)系
查看 @Controller / @Service / @Repository / @Configuration 等注解的源碼發(fā)現(xiàn):
其實(shí)這些注解??都有?個(gè)注解 @Component,說(shuō)明它們本身就是屬于 @Component 的“子類”。
4.方法注解@Bean
1.方法注解要搭配類注解使用
在 Spring 框架的設(shè)計(jì)中,?法注解 @Bean 要配合類注解才能將對(duì)象正常的存儲(chǔ)到 Spring 容器中,如下代碼所示:
@Configuration public class BeanConfig { @Bean public User user() { User user=new User(); user.setName("溫溫"); user.setAge(18); return user; } }
注意:@Bean對(duì)應(yīng)生產(chǎn)的bean名稱是方法名
2.重命名Bean
可以通過(guò)設(shè)置name屬性給Bean對(duì)象進(jìn)行重命名操作,如下對(duì)象所示:
@Configuration public class BeanConfig { @Bean(name={"wen","user"}) public User user() { User user=new User(); user.setName("溫溫"); user.setAge(18); return user; } }
此時(shí)使用wen和user都可以獲取到User對(duì)象了:
User user=(User) context.getBean("wen"); System.out.println(user.getName());
2.Spring的讀取------獲取Bean對(duì)象(對(duì)象裝配)
獲取 bean 對(duì)象也叫做對(duì)象裝配,是把對(duì)象取出來(lái)放到某個(gè)類中,有時(shí)候也叫對(duì)象注?。
對(duì)象裝配(對(duì)象注?)的實(shí)現(xiàn)?法以下 3 種:
1. 屬性注?
2. 構(gòu)造?法注?
3. Setter 注?
1.屬性注入
屬性注?是使? @Autowired 實(shí)現(xiàn)的,將 Service 類注?到 Controller 類中。
Service類的代碼如下:
@Service public class UserService { public void doService(){ System.out.println("doService"); } }
Controller類的實(shí)現(xiàn)代碼如下:
@Controller public class UserController { @Autowired private UserService userService; public void sayHi(){ userService.doService(); System.out.println("hi,userController~"); } }
最終結(jié)果如下:
2.構(gòu)造方法注入
構(gòu)造方法注入是在類的構(gòu)造方法中實(shí)現(xiàn)注入,實(shí)現(xiàn)代碼如下:
@Controller public class UserController2 { private UserService us; public UserController2(UserService us) { this.us = us; } public void sayHi(){ us.doService(); System.out.println("hi,userController~"); } }
注意:1.如果只有一個(gè)構(gòu)造方法,那么@Autowired可以省略
2.如果有多個(gè)構(gòu)造方法,那么需要添加上@Autowired來(lái)明確指定到底使用哪個(gè)構(gòu)造方法,否則程序會(huì)報(bào)錯(cuò)。
3.Setter注入
Setter 注?和屬性的 Setter ?法實(shí)現(xiàn)類似,只不過(guò)在設(shè)置 set ?法的時(shí)候需要加上 @Autowired 注
解,如下代碼所示:
@Controller public class UserController1 { private UserService us; @Autowired public void setUs(UserService us) { this.us = us; } public void sayHi(){ us.doService(); System.out.println("hi,userController~"); } }
4.三種注入方法的優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) | |
屬性注入 | 簡(jiǎn)介,使用方便 |
補(bǔ)充:final修飾的屬性,需要具備下列兩個(gè)條件之一:
1.初始化賦值
2.構(gòu)造函數(shù)賦值
5.@Resource:另一種注入關(guān)鍵字
在進(jìn)?類注?時(shí),除了可以使? @Autowired 關(guān)鍵字之外,我們還可以使? @Resource 進(jìn)?注?,如下代碼所示:
@Controller public class UserController3 { @Resource private UserService us; public void sayHi(){ us.doService(); System.out.println("hi,userController~"); } }
@Resource和@Autowired的區(qū)別
- 出身不同:@Autowired來(lái)自于Spring,? @Resource 來(lái)?于 JDK 的注解;
- 使?時(shí)設(shè)置的參數(shù)不同:相?于 @Autowired 來(lái)說(shuō),@Resource ?持更多的參數(shù)設(shè)置,例如 name 設(shè)置,根據(jù)名稱獲取 Bean。
- @Autowired 可?于 Setter 注?、構(gòu)造函數(shù)注?和屬性注?,? @Resource 只能?于 Setter 注?和屬性注?,不能?于構(gòu)造函數(shù)注?。
補(bǔ)充:
@Autowired
根據(jù)類型來(lái)獲取bean,如果同一個(gè)類型的bean只有一個(gè),直接注入成功
如果同一個(gè)類型的bean有多個(gè),以名稱匹配,注入相同名稱的bean
如果沒(méi)有名稱相同的,就報(bào)錯(cuò)
6.同一類型多個(gè)@Bean報(bào)錯(cuò)
1.現(xiàn)象
當(dāng)出現(xiàn)以下多個(gè) Bean,返回同?對(duì)象類型時(shí)程序會(huì)報(bào)錯(cuò),如下代碼所示:
@Component public class Users { @Bean public User user1() { User user = new User(); user.setId(1); user.setName("Java"); return user; } @Bean public User user2() { User user = new User(); user.setId(2); user.setName("MySQL"); return user; } }
在另一個(gè)類中獲取User對(duì)象:
@Controller public class UserController4 { // 注? @Resource private User user; public User getUser() { return user; } }
報(bào)錯(cuò)了,報(bào)錯(cuò)原因?yàn)椋悍俏ㄒ坏腂ean對(duì)象
2.報(bào)錯(cuò)處理
解決同?個(gè)類型,多個(gè) bean 的解決?案有以下兩個(gè):
使? @Resource(name="user1") 定義。 使? @Qualifier 注解定義名稱。 使? @Resource(name="xxx")
使? @Qualifier
到此這篇關(guān)于Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的文章就介紹到這了,更多相關(guān)spring讀取和存儲(chǔ)對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理
這篇文章主要介紹了Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理,包括類與方法以及多態(tài)等支持面向?qū)ο笳Z(yǔ)言中的重要特點(diǎn),需要的朋友可以參考下2016-01-01springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實(shí)現(xiàn)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01HttpClient POST請(qǐng)求第三方接口問(wèn)題(多參數(shù)傳參)
這篇文章主要介紹了HttpClient POST請(qǐng)求第三方接口問(wèn)題(多參數(shù)傳參),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Maven?dependency?plugin使用心得總結(jié)
這篇文章主要給大家介紹了關(guān)于Maven?dependency?plugin使用心得的相關(guān)資料,Maven是一個(gè)常用的Java build Manager,使用Maven可以很好的對(duì)Java Project的dependency進(jìn)行管理,需要的朋友可以參考下2023-10-10Java語(yǔ)言實(shí)現(xiàn)最大堆代碼示例
這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)最大堆代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-12-12Java中的線程池ThreadPoolExecutor深入解析
這篇文章主要介紹了Java中的線程池ThreadPoolExecutor深入解析,線程池,thread pool,是一種線程使用模式,線程池維護(hù)著多個(gè)線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務(wù),需要的朋友可以參考下2023-11-11MyBatis-Plus中AutoGenerator的使用案例
AutoGenerator是MyBatis-Plus的代碼生成器,通過(guò)?AutoGenerator?可以快速生成?Pojo、Mapper、?Mapper?XML、Service、Controller?等各個(gè)模塊的代碼,這篇文章主要介紹了MyBatis-Plus中AutoGenerator的詳細(xì)使用案例,需要的朋友可以參考下2023-05-05詳解Idea中HTTP Client請(qǐng)求測(cè)試工具的使用
今天抽空給大家分享Idea中HTTP Client請(qǐng)求測(cè)試工具的使用,小編在這建議使用HTTP Client的Idea版本最好在2018以上,不然的話體驗(yàn)不是多好,今天就給大家介紹Idea中HTTP Client怎么使用的,感興趣的朋友跟隨小編一起看看吧2021-05-05IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解
在使用spring、mybatis等框架時(shí),配置文件很復(fù)雜,有時(shí)復(fù)雜的讓人想放棄Java,使用C#。springboot出現(xiàn)這一切問(wèn)題就都不是問(wèn)題2021-10-10