Spring中存取Bean的相關(guān)注解舉例詳解
一、五大類注解
在Spring中,想要將Bean存儲到Spring中,一共有兩種注解類型可以實現(xiàn):
一種是類注解,其包括@Controller,@Service,@Repository,@Component,@Configuration;
另一種則是方法注解,其僅有@Bean
1、五大類注解存儲Bean對象
1.1@Controller(控制器儲存)
使? @Controller 存儲 bean 的代碼如下所示:
package com.java.demo; import org.springframework.stereotype.Controller; @Controller public class User { public void sayHi(){ System.out.println("hi User"); } }
我們再在啟動類中,簡單讀取一下存入的對象
import com.java.demo.User; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("srping-config.xml"); User user = context.getBean("user", User.class); user.sayHi(); } }
運行結(jié)果如下:
1.2@Service(服務(wù)存儲)
使? @Service 存儲 Bean 的代碼如下所示:
@Service public class UserService { public int add(){ System.out.println("hi UserService add"); } }
讀取 bean 的代碼:
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserService userService = context.getBean("userService", UserService.class); userService.add(); } }
運行結(jié)果如下:
1.3@Repository(倉庫存儲)
使用@Repository存儲Bean的代碼如下:
@Repository public class UserRepository { public void add(){ System.out.println("hi UserRepository add"); } }
讀取Bean的代碼:
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserRepository userRepository = context.getBean("userRepository", UserRepository.class); userRepository.add(); } }
運行結(jié)果如下:
1.4@Component(組件存儲)
使用@Component組件存儲Bean的代碼如下:
@Component public class UserComponent { public void add(){ System.out.println("Hi UserComponent add"); } }
讀取Bean的代碼:
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserComponent userComponent = context.getBean("userComponent", UserComponent.class); userComponent.add(); } }
運行結(jié)果如下:
1.5@Configuration(配置存儲)
使用@Configuration存儲Bean的代碼如下:
@Configurable public class UserConfiguration { public void add(){ System.out.println("Hi Configuration add"); } }
讀取Bean的代碼:
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserConfiguration userConfiguration = context.getBean("userConfiguration", UserConfiguration.class); userConfiguration.add(); } }
運行結(jié)果如下:
2、五大類注解小結(jié)
2.1為什么要這么多類注解
讓代碼的可讀性更高,讓程序員能直觀的判斷當前類的用途
Spring框架中有很多類注解,每個注解都有其特定的作用。這些注解使得開發(fā)人員能夠更加方便地配置和管理應(yīng)用程序。以下是其中一些注解的用途:
- @Component:用于將某個類標記為組件,方便自動掃描和注冊為Bean。
- @Controller:用于標記控制器類,處理HTTP請求,并返回相應(yīng)結(jié)果。
- @Service:用于標記服務(wù)類,對業(yè)務(wù)邏輯進行封裝,通常被Controller層調(diào)用。
- @Repository:用于標記倉庫類,封裝對數(shù)據(jù)的訪問和操作,通常被Service層調(diào)用。
- @Configuration:表明該類是Spring配置類,在其中定義Bean的創(chuàng)建和配置規(guī)則。
這些注解使得Spring框架變得更加靈活、可擴展、易用。開發(fā)人員可以根據(jù)需要選擇合適的注解來達到自己的目的。
2.2 五大類注解之間的關(guān)系
Spring框架中,常用注解可以歸為五大類,分別是:
@Component注解及其衍生注解:包括@Controller、@Service、@Repository等。這些注解用于在Spring容器中注冊Bean。
@Configuration注解及其衍生注解:包括@Bean注解。這些注解用于在Spring容器中聲明和配置Bean。
@Autowired注解及其衍生注解:包括@Qualifier、@Resource、@Inject等。這些注解用于進行Bean的自動注入。
@Value注解及其衍生注解:包括@PropertySource、@ConfigurationProperties等。這些注解用于進行配置屬性的注入和讀取。
@Transactional及其衍生注解:包括@Transactional、@TransactionalEventListener等。這些注解用于聲明事務(wù)和監(jiān)聽事務(wù)事件。
這些注解之間的關(guān)系可以總結(jié)為:@Component及其衍生注解是用于定義Bean的注解,可通過自動掃描或手動配置的方式注冊Bean。
@Configuration及其衍生注解用于聲明和配置Bean。
@Autowired及其衍生注解用于進行Bean的自動注入,可以與@Component和@Configuration注解一起使用。
@Value及其衍生注解用于進行配置屬性的注入和讀取。
@Transactional及其衍生注解用于聲明事務(wù)和監(jiān)聽事務(wù)事件,通常用于@Service和@Repository注解的類。總的來說,這些注解是相互關(guān)聯(lián)的,可以結(jié)合使用,達到更加靈活和高效的開發(fā)效果。
二、方法注解
1.方法注解的存儲
1.1 @Bean注解的使用
我們先創(chuàng)建一個用戶類
public class User { public int Id; private String name; @Override public String toString() { return "User{" + "Id=" + Id + ", name='" + name + '\'' + '}'; } public int getId() { return Id; } public void setId(int id) { Id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
與類注解不同,類注解是添加到某個類上的;而方法注解自然就是添加到某個方法上的
之后再創(chuàng)建一個方法類,我們要注意在定義方法Bean的時候也要定義五大類注解,因為@Bean要配合類注解才能將對象正常的存儲到Spring容器中才能獲取到
@Component public class Users { @Bean() public User getUser(){ User user = new User(); user.setId(66); user.setName("竹筒子"); return user; } }
public class test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); User user = (User) context.getBean("getUser"); System.out.println(user.toString()); } }
1.2 @Bean方法的重命名
可以通過設(shè)置 name 屬性給 Bean 對象進?重命名操作,如下圖所示:
Bean命名規(guī)則,當沒有設(shè)置name屬性時,那么bean默認的名稱就是方法名,當設(shè)置了name屬性后,只能通過重命名的name屬性對應(yīng)的值獲取,也就是說重命名后,再使用方法名就獲取不到Bean對象了. 此外要注意Bean name是區(qū)分大小寫的
2.方法注解的獲取
在Spring中獲取Bean對象也叫做對象裝配或者對象注入
從Spring中獲取Bean對象的實現(xiàn)方法有以下三種:
屬性注入,Setter方法注入,以及構(gòu)造方法注入
2.1 屬性注入
屬性注?是使? @Autowired 實現(xiàn)的,將 Service 類注?到 Controller 類中。Service 類的實現(xiàn)代碼如下:
@Controller public class UserController { @Autowired private UserService userService; public User getUser(){ return userService.getUser(); } }
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); UserController userController= context.getBean("userController", UserController.class); userController.Hi(); } }
屬性注入的優(yōu)缺點:
屬性注入的優(yōu)點在于,足夠的簡單以及簡潔
缺點在于只能用于IOC容器,同時無法注入被final修飾的對象,而且較容易違背單一性原則
2.2 Setter注入
Setter注入的實現(xiàn)也需要依賴@Autowired進行實現(xiàn),不過其主要針對setter方法進行
@Controller public class UserController { private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } public User getUser(){ return userService.getUser(); } }
Setter注入的優(yōu)缺點:
Setter注入的優(yōu)點在于,其較不容易違背單一性原則
缺點在于,不如屬性注入來的簡介,同時無法注入被final修飾的對象
2.3 構(gòu)造方法注入
與前面類似,構(gòu)造方法注入從名字上看,其實就是在構(gòu)造器上添加@Autowired注解
@Controller public class StuController { private Stu stu; @Autowired public StuController(Stu stu) { this.stu = stu; } public void sayHi(){ System.out.println(stu); } }
由于構(gòu)造器注入是比較后面出的,其實它也有一定的智能性:當我們只存在一個構(gòu)造器的時候,我們可以選擇不添加@Autowired,但是當有多個構(gòu)造器的時候我們必須手動添加@Autowired來指定構(gòu)造器來進行注入
構(gòu)造方法注入優(yōu)缺點:
優(yōu)點:構(gòu)造器是Spring推薦的注入方式,同時構(gòu)造器注入的通用性較強,能夠注入被final修飾的對象
缺點在于不如屬性注入來的簡介及方便
三、總結(jié)
1.三種注?優(yōu)缺點分析
- 屬性注?的優(yōu)點是簡潔,使??便;缺點是只能?于 IoC 容器,如果是? IoC 容器不可?,并且只有在使?的時候才會出現(xiàn) NPE(空指針異常)
- Setter ?式是 Spring 前期版本推薦的注??式,但通?性不如構(gòu)造?法,所有 Spring 現(xiàn)版本已經(jīng)推薦使?構(gòu)造?法注?的?式來進?類注?了
- 構(gòu)造?法注?是 Spring 推薦的注??式,它的缺點是如果有多個注?會顯得?較臃腫,但出現(xiàn)這種情況你應(yīng)該考慮?下當前類是否符合程序的單?職責的設(shè)計模式了,它的優(yōu)點是通?性,官方推薦,在使?之前?定能把保證注?的類不為空
2.Resource和@Autowired的區(qū)別
當我們在進行類注入的時候,除了使用@Autowired的時候,我們也可以使用@Resource進行注入
@Resource的用法與@Autowired相同
- @Autowired來自Spring,而@Resource來自JDK的注解
- @Resource支持更多的參數(shù)設(shè)置,可以添加name設(shè)置來根據(jù)名稱獲取Bean
- @Resource不能用于構(gòu)造函數(shù)注入
總結(jié)
到此這篇關(guān)于Spring中存取Bean的相關(guān)注解舉例詳解的文章就介紹到這了,更多相關(guān)Spring存取Bean注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring?boot?使用?@Scheduled?注解和?TaskScheduler?接口實現(xiàn)定時任務(wù)
這篇文章主要介紹了spring?boot?使用?@Scheduled?注解和?TaskScheduler?接口實現(xiàn)定時任務(wù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06詳解SimpleDateFormat的線程安全問題與解決方案
這篇文章主要介紹了SimpleDateFormat的線程安全問題與解決方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03詳解Spring 框架中切入點 pointcut 表達式的常用寫法
這篇文章主要介紹了詳解Spring 框架中切入點 pointcut 表達式的常用寫法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Java中的UrlDecoder 和 UrlEncoder_動力節(jié)點Java學院整理
HTML 格式編碼的實用工具類。該類包含了將 String 轉(zhuǎn)換為 application/x-www-form-urlencoded MIME 格式的靜態(tài)方法。下文通過實例代碼給大家介紹Java中的UrlDecoder 和 UrlEncoder知識,感興趣的的朋友一起看看吧2017-07-07IntelliJ?IDEA?2023.2最新版激活方法及驗證ja-netfilter配置是否成功
隨著2023.2版本的發(fā)布,用戶們渴望了解如何激活這個最新版的IDE,本文將介紹三種可行的激活方案,包括許可證服務(wù)器、許可證代碼和idea?vmoptions配置,幫助讀者成功激活并充分利用IDEA的功能,感興趣的朋友參考下吧2023-08-08