Spring使用注解存儲和讀取對象詳解
一、存儲Bean對象
之前我們存儲Bean時,需要在spring-config.xml中添加bean注冊才行,這樣的方式并不簡單。我們要想更簡單的存儲和讀取對象的核心是使用注解
1.使用類注解(五大類注解):
@Controller:控制器,驗證用戶請求的數(shù)據(jù)正確性(安保系統(tǒng))
@Service:服務(wù)層,編排和調(diào)度具體執(zhí)行方法的(客服中心)
@Repository:持久層,和數(shù)據(jù)庫進行交互,等同于DAO(Data Access Object) 數(shù)據(jù)訪問層
@Component:組件(工具類)
@Configuration:配置項(配置項目中的一些配置)
2.方法注解:
@Bean路徑
配置掃描
要想將對象成功存儲到Spring中,物品們需要配置一下存儲對象的掃描包路徑,只有被配置的包下的所有類,添加了注解才能被正確的識別并保存到Spring中,需要在spring-config.xnl添加如下配置:
<?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="com.zd.demo"></content:component-scan> </beans>
這步是十分重要的,要是不是在配置掃描包下的類對象,即使加了注解,也是不能存儲到Spring中的
添加注解存儲Bean對象
使用 @Controller 存儲 bean 的代碼如下所示:
@Controller //將對象存儲到Spring中 public class StudentController { public void hello() { System.out.println("hello Im student"); } }
讀取StudentController對象
public static void main(String[] args) { //得到Spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //得到bean StudentController studentController = context.getBean("studentController",StudentController.class); //調(diào)用bean方法 studentController.hello(); }
使用 @Service 存儲 bean 的代碼如下所示:
@Service public class StudentService { public void hello() { System.out.println("hello Im studentService"); } }
獲取Bean對象:
public static void main(String[] args) { //得到Spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //得到bean StudentService studentService = context.getBean("studentService",StudentService.class); //調(diào)用bean方法 studentService.hello(); }
其他幾個類注解的使用方法都是一致的,在這里就不一一演示了
注解使用范圍
1.是否可以與component-scan一起使用?
我們可以發(fā)現(xiàn)是可以一起使用的
2.五大類注解可以不再component-scan包下嗎?
不可以
3.component-scan下的類,沒有加五大類注解,可以存儲到Spring嗎?
不可以
4.componemt-scan下的所有子包下的類只要加了五大類注解,可以存儲到Spring嗎?
子包下的類只要加了五大類注解,同樣可以存儲到Spring中
Bean的命名
我們在獲取Bean對象時,傳入名稱時,一般分為兩種情況:
默認情況下:使用原類名首字母小寫就能讀取到Bean對象
特殊情況:原類名如果首字母和第二個字母都是大寫的情況,那么使用原類名獲取
五大類注解的關(guān)系
可以認為@Controller / @Service / @Repository /@Configuration都是@Component的"子類",都是針對于@Component的一個擴展
為什么需要五大類注解?
我們可以發(fā)現(xiàn),只要我們在類上加了注解,都可以獲取到Bean對象,為什么需要這么多的類注解呢?
為了讓程序員看到注解之后一眼就知道當(dāng)前類的作用
JavaEE標準分層:
1.控制層(Controller)
2.服務(wù)層(Service)
3.數(shù)據(jù)持久層(Dao)
二、方法注解@Bean
五大類注解是添加到某個類上的,而方法注解是放到方法上的
我們首先準備一個實體類,然后使用方法注解@Bean將對象存儲到Spring容器中
public class UserBeans { @Bean public static User getUser() { User user = new User(); user.setUid(1); user.setUsername("張三"); user.setPassword("123456"); return user; } }
然后從Spring容器中獲取對象
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); User user = context.getBean("user",User.class); System.out.println(user); }
我們發(fā)現(xiàn)使用的時候報錯了,沒有名為user的Bean對象,出現(xiàn)這種現(xiàn)象一共有兩大原因:
1.@Bean命名規(guī)則與五大類注解的命名規(guī)則不同,@Bean命名規(guī)則,默認@Bean存儲的對象名稱 == 方法名
2.@Bean注解必須要搭配五大類注解一起使用(Spring為了提升性能所做的規(guī)定)
現(xiàn)在就可以正常獲取到Bean對象了
Bean重命名
我們上述通過方法名獲取Bean對象太抽象了,我們可以通過設(shè)置name屬性給Bean對象進行重命名操作,如下述操作:
我們給Bean起一個user的名字
我們可以發(fā)現(xiàn)就可以通過這個重名獲取了。
我們這里的重命名可以起多個名字,因為我們Spring容器中允許將同一類型的對象,存儲到容器多份
當(dāng)@Bean使用了重命名之后,使用方法名是否還能獲取到對象?
不能,當(dāng)@Bean對象重命名之后,默認的使用方法名獲取的方式就不能使用了
三、對象注入
獲取Bean對象也稱之為對象裝配,就是將對象取出來放到某個類中,有時候也稱之對象注入
對象注入的實現(xiàn)方法有以下三種:
1.屬性注入
2.Setter注入
3.構(gòu)造方法注入
屬性注入
屬性注入是使用@AutoWired注解實現(xiàn)的
@Component public class Group { @Autowired private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
這樣就可以實現(xiàn)屬性注入了,雖然屬性注入實現(xiàn)簡單、使用簡單,但它有以下缺點:
我么將鼠標放在注解上,會提示我們屬性注入不推薦使用
1.無法注入一個不可變對象(final 修飾的對象)
final修飾的對象要么直接復(fù)制,要么在構(gòu)造方法中賦值。放我們屬性注入時,上述兩種都不滿足,所以就注入失敗了
2.通用性,屬性注入只能在IoC容器中使用,其他容器中不支持
3.違背單一設(shè)計原則。簡單理解就是注入方式越簡單,濫用的概率越大,出現(xiàn)違背單一職責(zé)的概率也越大
Setter注入
setter注入也是使用@Autowired注解實現(xiàn)
@Component public class Group { private User user; @Autowired public void setUser(User user) { this.user = user; } public User getUser() { return user; } }
我們使用Setter注入也可以成功存儲取出,Setter注入符合單一職責(zé)的設(shè)計原理,但也有以下缺點:
1.不能注入不可變對象
2.注入的對象可能被修改,因為我們在任何事件都可以調(diào)用setXXX方法來改變注入的對象
構(gòu)造方法注入
構(gòu)造方法注入也是Spring官方推薦的注入方式:
public class Group { private User user; @Autowired public Group(User user) { this.user = user; } }
如果當(dāng)前類只有一個構(gòu)造方法的話,@Autowired注解可以省略
構(gòu)造方法注入。有以下優(yōu)點:
1.可注入不可變對象
2.注入對象不會被修改
構(gòu)造方法在對象創(chuàng)建時只會執(zhí)行一次,因為不存在注入對象被隨時修改的情況
3.完全初始化
構(gòu)造方法是在對象創(chuàng)建之前之前的,當(dāng)我們使用被注入的對象時,會被完全初始化
4.通用性強
支持各種框架
@Autowired 和 @Resource 的區(qū)別
在進行類注入時,除了可以使用@Autowired關(guān)鍵字,我們還可以使用@Resource進行注入
@Autowired 和 @Resource 的區(qū)別:
1.出身不同:@Autowired是Spring的注解,@Resource是JDK的注解
2.查找順序不同:@Autowired 先根據(jù)類型再根據(jù)名稱查詢,而 @Resource 先根據(jù)名稱再根據(jù)類型查詢
3.支持參數(shù)不同,@Autowired支持一個,@Resource支持7個
4.依賴注入支持不同:@Autowired支持三種注入,而@Resource只支持屬性注入和Setter注入
當(dāng)同一類型多個Bean時會報錯
再去獲取對象就會出錯,非唯一的Bean的對象,因為我們Spring中有user1和user2,不知道注入那個,解決方案有兩個:
1.使用@Resource(name = “XXX”)
2.使用@Qualifier注解定義名稱,搭配@Autowired注解使用
以上就是Spring使用注解存儲和讀取對象詳解的詳細內(nèi)容,更多關(guān)于Spring注解存儲和讀取對象的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA配置maven環(huán)境的詳細教程(Unable to import maven project報錯問題的解決)
這篇文章主要介紹了IDEA配置maven環(huán)境的詳細教程(Unable to import maven project問題的解決),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06使用java實現(xiàn)“釘釘微應(yīng)用免登進入某H5系統(tǒng)首頁“功能”
這篇文章主要介紹了用java實現(xiàn)“釘釘微應(yīng)用,免登進入某H5系統(tǒng)首頁“功能”,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10Mybatis-plus配置分頁插件返回統(tǒng)一結(jié)果集
本文主要介紹了Mybatis-plus配置分頁插件返回統(tǒng)一結(jié)果集,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Java使用easypoi快速導(dǎo)入導(dǎo)出的實現(xiàn)
這篇文章主要介紹了實現(xiàn)Java使用easypoi快速導(dǎo)入導(dǎo)出的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03