Spring如何通過(guò)注解存儲(chǔ)和讀取對(duì)象詳解
1. 創(chuàng)建Spring 項(xiàng)目
1) 創(chuàng)建?個(gè)普通 Maven 項(xiàng)?。
2.)添加 Spring 框架?持(spring-context、spring-beans)。
3) 添加啟動(dòng)類。
1.1 創(chuàng)建?個(gè) Maven 項(xiàng)?


1.2 添加 Spring 框架支持
在項(xiàng)?的 pom.xml 中添加 Spring 框架的?持,xml 配置如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>配置國(guó)內(nèi)源
將下面兩個(gè)框都要勾選上


settings.xml 文件配置代碼:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>修改位置如下

配置好之后,如果想下一次的項(xiàng)目也使用該國(guó)內(nèi)源,則需下面的配置


1.3 添加啟動(dòng)類
最后在創(chuàng)建好的項(xiàng)? java ?件夾下創(chuàng)建?個(gè)啟動(dòng)類,包含 main ?法即可

2. 存儲(chǔ) Bean 對(duì)象
存儲(chǔ) Bean 分為以下 3步:
1)存儲(chǔ) Bean 之前,先得有 Bean 才?,因此先要?jiǎng)?chuàng)建?個(gè) Bean。
2) 配置?件 spring-config.xml
3)將創(chuàng)建的 Bean 注冊(cè)到 Spring 容器中。
2.1 創(chuàng)建Bean
Bean 就是 Java 語(yǔ)?中的?個(gè)普通對(duì)象,實(shí)現(xiàn)代碼如下:
public class User {
public static void say(String name){
System.out.println("hello " + name);
}
}2.2 配置 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>再將 User 對(duì)象注冊(cè)到spring-config.xml 中就可以,具體操作是在 <beans> 中添加如下配置:

3. 獲取并使用 Bean 對(duì)象
獲取并使? Bean 對(duì)象,分為以下 3 步:
1. 得到 Spring 上下?對(duì)象,因?yàn)閷?duì)象都交給 Spring 管理了,所以獲取對(duì)象要從 Spring 中獲取,那么就得先得到 Spring 的上下?。
2. 通過(guò) Spring 上下?,獲取某?個(gè)指定的 Bean 對(duì)象。
3. 使? Bean 對(duì)象。
3.1 創(chuàng)建Sprign 上下文
Spring 上下?對(duì)象可使? ApplicationContext,代碼如下
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
}
除了 ApplicationContext 之外,我們還可以使? BeanFactory 來(lái)作為 Spring 的上下?,如下代碼所示
// 1.得到 bean 工廠
BeanFactory factory = new XmlBeanFactory(
new ClassPathResource("spring-config.xml"));
// 2.獲取 bean
User user = (User) factory.getBean("user");
// 3.使用 bean
user.say("黃小小");ApplicationContext 和 BeanFactory 效果是?樣的,ApplicationContext 屬于 BeanFactory 的?類, 它們的區(qū)別如下
1)繼承關(guān)系和功能??來(lái)說(shuō):Spring 容器有兩個(gè)頂級(jí)的接?:BeanFactory 和ApplicationContext。
其中 BeanFactory 提供了基礎(chǔ)的訪問(wèn)容器的能?,? ApplicationContext 屬于 BeanFactory 的?類,它除了繼承了 BeanFactory 的所有功能之外,它還擁有獨(dú)特的特性,還添加了對(duì)國(guó)際化?持、資源訪問(wèn)?持、以及事件傳播等??的?持。
2)從性能??來(lái)說(shuō):ApplicationContext 是?次性加載并初始化所有的 Bean 對(duì)象,? BeanFactory是需要那個(gè)才去加載那個(gè),因此更加輕量。
3.2 獲取指定的 Bean 對(duì)象
//2.根據(jù)上下文對(duì)象提供的方法獲取到 bean
//User user = (User) context.getBean("user");//與spring-config.xml 中的id 一致
//User user = context.getBean(User.class);//不需要強(qiáng)轉(zhuǎn),但不建議使用
User user = context.getBean("user",User.class);//精準(zhǔn)并不需要強(qiáng)轉(zhuǎn),推薦使用

3.3 使用Bean
//3.使用
user.say("黃小小");總代碼:
public class App {
public static void main(String[] args) {
//1.得到 spring 上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
//2.根據(jù)上下文對(duì)象提供的方法獲取到 bean
//User user = (User) context.getBean("user");//與spring-config.xml 中的id 一致
//User user = context.getBean(User.class);//不需要強(qiáng)轉(zhuǎn),但不建議使用
User user = context.getBean("user",User.class);//精準(zhǔn)并不需要強(qiáng)轉(zhuǎn),推薦使用
//3.使用
user.say("黃小小");
}
}
4.總結(jié)

更簡(jiǎn)單的獲取和存儲(chǔ)對(duì)象
5.配置掃描路徑
想要將對(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="com.beans"></content:component-scan>
</beans>
6.添加注解存儲(chǔ)
bean對(duì)象 想要將對(duì)象存儲(chǔ)在 Spring 中,有兩種注解類型可以實(shí)現(xiàn):
1) 類注解:@Controller、@Service、@Repository、@Component、@Configuration。
2) ?法注解:@Bean
6.1 @Controller(控制器存儲(chǔ))
使? @Controller 存儲(chǔ) bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個(gè) UserController 類
import org.springframework.stereotype.Controller;
@Controller//將對(duì)象存儲(chǔ)到Spring中
public class UserController {
public void sayHi() {
System.out.println("hello controller");
}
}在main 方法中用讀取對(duì)象的?式來(lái)讀取上?的 UserController 對(duì)象,如下代碼所示
public class App {
public static void main(String[] args) {
//1. 先得到上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
//2.得到bean
UserController controller = context.getBean("userController",UserController.class);
//3.使用 bean
controller.sayHi();
}
}代碼注入解釋:

獲取結(jié)果

6.2 @Service (服務(wù)器存儲(chǔ))
使? @Service 存儲(chǔ) bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個(gè) UserService類
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void sayHi() {
System.out.println("hello service");
}
}在main 方法中用讀取對(duì)象的?式來(lái)讀取上?的 UserService 對(duì)象,如下代碼所示
public class App {
public static void main(String[] args) {
//1. 先得到上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
//2.得到bean
UserService service = context.getBean("userService",UserService.class);
//3.使用 bean
service.sayHi();
}
}6.3 @Repository (倉(cāng)庫(kù)存儲(chǔ))
使? @Repository 存儲(chǔ) bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個(gè) UserRepository 類
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
public void sayHi() {
System.out.println("hello repository");
}
}在main 方法中用讀取對(duì)象的?式來(lái)讀取上?的 UserController 對(duì)象,如下代碼所示
public class App {
public static void main(String[] args) {
//1. 先得到上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
//2.得到bean
UserRepository repository = context.getBean("userRepository",UserRepository.class);
//3.使用 bean
repository.sayHi();
}
}6.4 @Component (組件存儲(chǔ))
使用 @Component 存儲(chǔ) bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個(gè) UserComponent 類
import org.springframework.stereotype.Component;
@Component
public class UserComponent {
public void sayHi() {
System.out.println("hello component");
}
}在main 方法中用讀取對(duì)象的?式來(lái)讀取上?的 UserComponent 對(duì)象,如下代碼所示
public class App {
public static void main(String[] args) {
//1. 先得到上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
//2.得到bean
UserComponent component = context.getBean("userComponent",UserComponent.class);
//3.使用 bean
component.sayHi();
}
}6.5 @Configuration(配置存儲(chǔ))
使用 @Configuration 存儲(chǔ) bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個(gè) UserConfig 類
@Configuration
public class UserConfig {
public void sayHi() {
System.out.println("hello Configuration");
}
}在main 方法中用讀取對(duì)象的?式來(lái)讀取上?的 UserConfig 對(duì)象,如下代碼所示
public class App {
public static void main(String[] args) {
//1. 先得到上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
//2.得到bean
UserConfig config = context.getBean("userConfig",UserConfig.class);
//3.使用 bean
config.sayHi();
}
}6.6 為什么需要五大注解
讓代碼可讀性提高,能直觀的判斷當(dāng)前類的用途

查看 @Controller / @Service / @Repository / @Configuration 等注解的源碼發(fā)現(xiàn),

這些注解??都有?個(gè)注解 @Component,說(shuō)明它們本身就是屬于 @Component 的“?類。
6.7 方法注解 @Bean
6.7.1 方法注解配合類注解使用
1)創(chuàng)建一個(gè) bean
在要掃描的根路徑(com.beans)下創(chuàng)建一個(gè) UserBeans 類
在 Spring 框架的設(shè)計(jì)中,?法注解 @Bean 要配合類注解才能將對(duì)象正常的存儲(chǔ)到 Spring 容器中
@Component
public class UserBeans {
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("黃小小");
return user;
}
}然后創(chuàng)建一個(gè)User對(duì)象
public class User {
private 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) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}在main 方法中用讀取對(duì)象的?式來(lái)讀取上?的 User 對(duì)象,如下代碼所示
public class App {
public static void main(String[] args) {
//1. 先得到上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean("user1",User.class);
System.out.println(user);
}
}
6.7.2 重命名Bean
當(dāng) User 類里面有多個(gè)對(duì)象時(shí),可以通過(guò)設(shè)置 name 屬性給 Bean 對(duì)象進(jìn)?重命名操作,如下代碼
@Component
public class UserBeans {
@Bean(name = "in")
public User user1() {
User user1 = new User();
user1.setId(1);
user1.setName("黃小小");
return user1;
}
@Bean(name = "to")
public User user2() {
User user2 = new User();
user2.setId(2);
user2.setName("楊通達(dá)");
return user2;
}
}通過(guò)使用 Bean 里面的 name 就可以獲取對(duì)象了
public class App {
public static void main(String[] args) {
//1. 先得到上下文對(duì)象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
User user1 = context.getBean("in",User.class);
System.out.println(user1);
User user2 = context.getBean("to",User.class);
System.out.println(user2);
}
}
8.獲取 Bean 對(duì)象
獲取 bean 對(duì)象也叫做對(duì)象裝配,是把對(duì)象取出來(lái)放到某個(gè)類中,有時(shí)候也叫對(duì)象注?。
類似于把 B 中的對(duì)象取出來(lái)放到 A 類當(dāng)中
對(duì)象裝配(對(duì)象注?)的實(shí)現(xiàn)?法以下 3 種:
1. 屬性注?
2. 構(gòu)造?法注?
3. Setter 注?
8.1 屬性注入
屬性注?是使? @Autowired 實(shí)現(xiàn)的。
下面將 UserService 類注?到 UserController2 類中。
UserService類
@Service
public class UserService {
public void sayHi() {
System.out.println("hello service");
}
}UserController2 類
@Controller
public class UserController2 {
//對(duì)象注入方式1:屬性注入
@Autowired
private UserService userService;
public void sayHi() {
userService.sayHi();
}
}main方法
public class App2 {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
UserController2 userController2 =
context.getBean(UserController2.class);
userController2.sayHi();
}
}獲取結(jié)果

整個(gè)獲取的調(diào)用鏈過(guò)程:

8.2 構(gòu)造方法注入
其中UserService類和上面屬性注入的一樣。
構(gòu)造?法注?是在類的構(gòu)造?法中實(shí)現(xiàn)注?,如下代碼所示
@Controller
public class UserController3 {
private UserService userService;
//構(gòu)造方法注入(官方推薦)
@Autowired
public UserController3(UserService userService) {
this.userService = userService;
}
/*
//當(dāng)有多個(gè)構(gòu)造方法時(shí),上面的 @Autowired 不能省略
public UserController3(UserService userService, int num) {
this.userService = userService;
}*/
public void sayHi() {
userService.sayHi();
}
}8.3 Setter 注入
Setter 注?和屬性的 Setter ?法實(shí)現(xiàn)類似,只不過(guò)在設(shè)置 set ?法的時(shí)候需要加上 @Autowired 注 解,如下代碼所示:
@Controller
public class UserController4 {
private UserService userService;
//Setter 注?
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
public void sayHi() {
userService.sayHi();
}
}8.4 三種注?優(yōu)缺點(diǎn)分析
1)屬性注?的優(yōu)點(diǎn)是簡(jiǎn)潔,使??便;缺點(diǎn)是只能?于 IoC 容器,如果是? IoC 容器不可?,并且只有在使?的時(shí)候才會(huì)出現(xiàn) NPE(空指針異常)。
2)構(gòu)造?法注?是 Spring 推薦的注??式,它的缺點(diǎn)是如果有多個(gè)注?會(huì)顯得?較臃腫,但出現(xiàn)這種情況你應(yīng)該考慮?下當(dāng)前類是否符合程序的單?職責(zé)的設(shè)計(jì)模式了,它的優(yōu)點(diǎn)是通?性,在使?之前?定能把保證注?的類不為空。
3)Setter ?式是 Spring 前期版本推薦的注??式,但通?性不如構(gòu)造?法,所有 Spring 現(xiàn)版本已經(jīng)推薦使?構(gòu)造?法注?的?式來(lái)進(jìn)?類注?了
8.5 @Resource:另一種注入關(guān)鍵字
在進(jìn)?類注?時(shí),除了可以使? @Autowired 關(guān)鍵字之外,我們還可以使? @Resource 進(jìn)?注?,如下代碼所示
@Controller
public class UserController4 {
private UserService userService;
//Setter 注?
//@Autowired
@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}
public void sayHi() {
userService.sayHi();
}
}@Autowired 和 @Resource 的區(qū)別
1)出身不同:@Resource 來(lái)自于 JDK ,@Autowrired 是Spring 框架提供的
2)用法不同:@Autowired 支持屬性注入、構(gòu)造方法注入和Setter 注入,而 @Resource 不支持構(gòu)造方法注入。
3)支持的參數(shù)不同:@Resource 支持更多的參數(shù)設(shè)置,比如 name 、type 設(shè)置,而@Autowired 只支持required 參數(shù)設(shè)置。
總結(jié)
到此這篇關(guān)于Spring如何通過(guò)注解存儲(chǔ)和讀取對(duì)象的文章就介紹到這了,更多相關(guān)Spring注解存儲(chǔ)和讀取對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 5個(gè)人坐在一起(有關(guān)第五個(gè)人歲數(shù)的問(wèn)題)
利用遞歸的方法,遞歸分為回推和遞推兩個(gè)階段。要想知道第五個(gè)人歲數(shù),需知道第四人的歲數(shù),依次類推,推到第一人(10歲),再往回推,需要的朋友可以參考下2017-02-02
jenkins+Maven從SVN上構(gòu)建項(xiàng)目的方法
這篇文章主要介紹了jenkins+Maven從SVN上構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Eureka源碼閱讀解析Server服務(wù)端啟動(dòng)流程實(shí)例
這篇文章主要為大家介紹了Eureka源碼閱讀解析Server服務(wù)端啟動(dòng)流程實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Java?精煉解讀時(shí)間復(fù)雜度與空間復(fù)雜度
對(duì)于一個(gè)算法,其時(shí)間復(fù)雜度和空間復(fù)雜度往往是相互影響的,當(dāng)追求一個(gè)較好的時(shí)間復(fù)雜度時(shí),可能會(huì)使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲(chǔ)空間,這篇文章主要給大家介紹了關(guān)于Java時(shí)間復(fù)雜度、空間復(fù)雜度的相關(guān)資料,需要的朋友可以參考下2022-03-03

