Spring如何通過注解存儲和讀取對象詳解
1. 創(chuàng)建Spring 項目
1) 創(chuàng)建?個普通 Maven 項?。
2.)添加 Spring 框架?持(spring-context、spring-beans)。
3) 添加啟動類。
1.1 創(chuàng)建?個 Maven 項?
1.2 添加 Spring 框架支持
在項?的 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>
配置國內(nèi)源
將下面兩個框都要勾選上
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>
修改位置如下
配置好之后,如果想下一次的項目也使用該國內(nèi)源,則需下面的配置
1.3 添加啟動類
最后在創(chuàng)建好的項? java ?件夾下創(chuàng)建?個啟動類,包含 main ?法即可
2. 存儲 Bean 對象
存儲 Bean 分為以下 3步:
1)存儲 Bean 之前,先得有 Bean 才?,因此先要創(chuàng)建?個 Bean。
2) 配置?件 spring-config.xml
3)將創(chuàng)建的 Bean 注冊到 Spring 容器中。
2.1 創(chuàng)建Bean
Bean 就是 Java 語?中的?個普通對象,實現(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 對象注冊到spring-config.xml 中就可以,具體操作是在 <beans> 中添加如下配置:
3. 獲取并使用 Bean 對象
獲取并使? Bean 對象,分為以下 3 步:
1. 得到 Spring 上下?對象,因為對象都交給 Spring 管理了,所以獲取對象要從 Spring 中獲取,那么就得先得到 Spring 的上下?。
2. 通過 Spring 上下?,獲取某?個指定的 Bean 對象。
3. 使? Bean 對象。
3.1 創(chuàng)建Sprign 上下文
Spring 上下?對象可使? ApplicationContext,代碼如下
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); }
除了 ApplicationContext 之外,我們還可以使? BeanFactory 來作為 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)繼承關系和功能??來說:Spring 容器有兩個頂級的接?:BeanFactory 和ApplicationContext。
其中 BeanFactory 提供了基礎的訪問容器的能?,? ApplicationContext 屬于 BeanFactory 的?類,它除了繼承了 BeanFactory 的所有功能之外,它還擁有獨特的特性,還添加了對國際化?持、資源訪問?持、以及事件傳播等??的?持。
2)從性能??來說:ApplicationContext 是?次性加載并初始化所有的 Bean 對象,? BeanFactory是需要那個才去加載那個,因此更加輕量。
3.2 獲取指定的 Bean 對象
//2.根據(jù)上下文對象提供的方法獲取到 bean //User user = (User) context.getBean("user");//與spring-config.xml 中的id 一致 //User user = context.getBean(User.class);//不需要強轉(zhuǎn),但不建議使用 User user = context.getBean("user",User.class);//精準并不需要強轉(zhuǎn),推薦使用
3.3 使用Bean
//3.使用 user.say("黃小小");
總代碼:
public class App { public static void main(String[] args) { //1.得到 spring 上下文對象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2.根據(jù)上下文對象提供的方法獲取到 bean //User user = (User) context.getBean("user");//與spring-config.xml 中的id 一致 //User user = context.getBean(User.class);//不需要強轉(zhuǎn),但不建議使用 User user = context.getBean("user",User.class);//精準并不需要強轉(zhuǎn),推薦使用 //3.使用 user.say("黃小小"); } }
4.總結(jié)
更簡單的獲取和存儲對象
5.配置掃描路徑
想要將對象成功的存儲到 Spring 中,我們需要配置?下存儲對象的掃描包路徑,只有被配置的包下的所有類,添加了注解才能被正確的識別并保存到 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.添加注解存儲
bean對象 想要將對象存儲在 Spring 中,有兩種注解類型可以實現(xiàn):
1) 類注解:@Controller、@Service、@Repository、@Component、@Configuration。
2) ?法注解:@Bean
6.1 @Controller(控制器存儲)
使? @Controller 存儲 bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個 UserController 類
import org.springframework.stereotype.Controller; @Controller//將對象存儲到Spring中 public class UserController { public void sayHi() { System.out.println("hello controller"); } }
在main 方法中用讀取對象的?式來讀取上?的 UserController 對象,如下代碼所示
public class App { public static void main(String[] args) { //1. 先得到上下文對象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2.得到bean UserController controller = context.getBean("userController",UserController.class); //3.使用 bean controller.sayHi(); } }
代碼注入解釋:
獲取結(jié)果
6.2 @Service (服務器存儲)
使? @Service 存儲 bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個 UserService類
import org.springframework.stereotype.Service; @Service public class UserService { public void sayHi() { System.out.println("hello service"); } }
在main 方法中用讀取對象的?式來讀取上?的 UserService 對象,如下代碼所示
public class App { public static void main(String[] args) { //1. 先得到上下文對象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2.得到bean UserService service = context.getBean("userService",UserService.class); //3.使用 bean service.sayHi(); } }
6.3 @Repository (倉庫存儲)
使? @Repository 存儲 bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個 UserRepository 類
import org.springframework.stereotype.Repository; @Repository public class UserRepository { public void sayHi() { System.out.println("hello repository"); } }
在main 方法中用讀取對象的?式來讀取上?的 UserController 對象,如下代碼所示
public class App { public static void main(String[] args) { //1. 先得到上下文對象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2.得到bean UserRepository repository = context.getBean("userRepository",UserRepository.class); //3.使用 bean repository.sayHi(); } }
6.4 @Component (組件存儲)
使用 @Component 存儲 bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個 UserComponent 類
import org.springframework.stereotype.Component; @Component public class UserComponent { public void sayHi() { System.out.println("hello component"); } }
在main 方法中用讀取對象的?式來讀取上?的 UserComponent 對象,如下代碼所示
public class App { public static void main(String[] args) { //1. 先得到上下文對象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2.得到bean UserComponent component = context.getBean("userComponent",UserComponent.class); //3.使用 bean component.sayHi(); } }
6.5 @Configuration(配置存儲)
使用 @Configuration 存儲 bean 的代碼如下所示:
在要掃描的根路徑(com.beans)下創(chuàng)建一個 UserConfig 類
@Configuration public class UserConfig { public void sayHi() { System.out.println("hello Configuration"); } }
在main 方法中用讀取對象的?式來讀取上?的 UserConfig 對象,如下代碼所示
public class App { public static void main(String[] args) { //1. 先得到上下文對象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2.得到bean UserConfig config = context.getBean("userConfig",UserConfig.class); //3.使用 bean config.sayHi(); } }
6.6 為什么需要五大注解
讓代碼可讀性提高,能直觀的判斷當前類的用途
查看 @Controller / @Service / @Repository / @Configuration 等注解的源碼發(fā)現(xiàn),
這些注解??都有?個注解 @Component,說明它們本身就是屬于 @Component 的“?類。
6.7 方法注解 @Bean
6.7.1 方法注解配合類注解使用
1)創(chuàng)建一個 bean
在要掃描的根路徑(com.beans)下創(chuàng)建一個 UserBeans 類
在 Spring 框架的設計中,?法注解 @Bean 要配合類注解才能將對象正常的存儲到 Spring 容器中
@Component public class UserBeans { @Bean public User user1() { User user = new User(); user.setId(1); user.setName("黃小小"); return user; } }
然后創(chuàng)建一個User對象
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 方法中用讀取對象的?式來讀取上?的 User 對象,如下代碼所示
public class App { public static void main(String[] args) { //1. 先得到上下文對象 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); User user = context.getBean("user1",User.class); System.out.println(user); } }
6.7.2 重命名Bean
當 User 類里面有多個對象時,可以通過設置 name 屬性給 Bean 對象進?重命名操作,如下代碼
@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("楊通達"); return user2; } }
通過使用 Bean 里面的 name 就可以獲取對象了
public class App { public static void main(String[] args) { //1. 先得到上下文對象 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 對象
獲取 bean 對象也叫做對象裝配,是把對象取出來放到某個類中,有時候也叫對象注?。
類似于把 B 中的對象取出來放到 A 類當中
對象裝配(對象注?)的實現(xiàn)?法以下 3 種:
1. 屬性注?
2. 構(gòu)造?法注?
3. Setter 注?
8.1 屬性注入
屬性注?是使? @Autowired 實現(xiàn)的。
下面將 UserService 類注?到 UserController2 類中。
UserService類
@Service public class UserService { public void sayHi() { System.out.println("hello service"); } }
UserController2 類
@Controller public class UserController2 { //對象注入方式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é)果
整個獲取的調(diào)用鏈過程:
8.2 構(gòu)造方法注入
其中UserService類和上面屬性注入的一樣。
構(gòu)造?法注?是在類的構(gòu)造?法中實現(xiàn)注?,如下代碼所示
@Controller public class UserController3 { private UserService userService; //構(gòu)造方法注入(官方推薦) @Autowired public UserController3(UserService userService) { this.userService = userService; } /* //當有多個構(gòu)造方法時,上面的 @Autowired 不能省略 public UserController3(UserService userService, int num) { this.userService = userService; }*/ public void sayHi() { userService.sayHi(); } }
8.3 Setter 注入
Setter 注?和屬性的 Setter ?法實現(xiàn)類似,只不過在設置 set ?法的時候需要加上 @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)缺點分析
1)屬性注?的優(yōu)點是簡潔,使??便;缺點是只能?于 IoC 容器,如果是? IoC 容器不可?,并且只有在使?的時候才會出現(xiàn) NPE(空指針異常)。
2)構(gòu)造?法注?是 Spring 推薦的注??式,它的缺點是如果有多個注?會顯得?較臃腫,但出現(xiàn)這種情況你應該考慮?下當前類是否符合程序的單?職責的設計模式了,它的優(yōu)點是通?性,在使?之前?定能把保證注?的類不為空。
3)Setter ?式是 Spring 前期版本推薦的注??式,但通?性不如構(gòu)造?法,所有 Spring 現(xiàn)版本已經(jīng)推薦使?構(gòu)造?法注?的?式來進?類注?了
8.5 @Resource:另一種注入關鍵字
在進?類注?時,除了可以使? @Autowired 關鍵字之外,我們還可以使? @Resource 進?注?,如下代碼所示
@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 來自于 JDK ,@Autowrired 是Spring 框架提供的
2)用法不同:@Autowired 支持屬性注入、構(gòu)造方法注入和Setter 注入,而 @Resource 不支持構(gòu)造方法注入。
3)支持的參數(shù)不同:@Resource 支持更多的參數(shù)設置,比如 name 、type 設置,而@Autowired 只支持required 參數(shù)設置。
總結(jié)
到此這篇關于Spring如何通過注解存儲和讀取對象的文章就介紹到這了,更多相關Spring注解存儲和讀取對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java class文件格式之數(shù)據(jù)類型(二)_動力節(jié)點Java學院整理
這篇文章主要介紹了Java class文件格式之數(shù)據(jù)類型(二)的相關資料,需要的朋友可以參考下2017-06-06SpringMVC?RESTFul及REST架構(gòu)風格介紹
這篇文章主要為大家介紹了SpringMVC?RESTFul及REST架構(gòu)風格介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05Springboot整合zookeeper實現(xiàn)對節(jié)點的創(chuàng)建、監(jiān)聽與判斷的案例詳解
這篇文章主要介紹了基于Springboot整合zookeeper實現(xiàn)對節(jié)點的創(chuàng)建、監(jiān)聽與判斷,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06