文章目錄
- 🌴序言
- 🍀前置?作:配置掃描路徑
- 🎄添加注解存儲 Bean 對象
- 🌳類注解
- 🚩為什么要這么多類注解
- 🚩注解之間的聯系
- 🎋?法注解 @Bean
- 🚩?法注解需要配合類注解使?
- ?總結
🌴序言
在博主前面所寫的《【JavaEE進階】 Spring 的創建和使?》中我們已經可以實現基本的 Spring 讀取和存儲對象的操作了,但在操作的過程中我們發現讀取和存儲對象并沒有想象中的那么“簡單”,所以接下來我們要學習更加簡單的操作 Bean 對象的?法。
在 Spring 中想要更簡單的存儲和讀取對象的核?是使?注解
之前我們存儲 Bean 時,需要在 spring-config 中添加?? bean 注冊內容才?,如下圖所示:
?現在我們只需要?個注解就可以替代之前要寫??配置的尷尬了,不過在開始存儲對象之前,我們先要來點準備?作
🍀前置?作:配置掃描路徑
注意:
- 想要將對象成功的存儲到 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="org.example"></content:component-scan>
</beans>
其中標紅的??為注冊掃描的包,如下圖所示
注意
- 如果不是在配置的掃描包下的類對象,即使添加了注解,也是不能被存儲到 Spring 中的
🎄添加注解存儲 Bean 對象
想要將對象存儲在 Spring 中,有兩種注解類型可以實現:
-
類注解:@Controller、@Service、@Repository、@Component、@Configuration。
-
?法注解:@Bean。
🌳類注解
由于這五種類注解的使用方式基本相同,所以博主在這里只演示一種即可
@Controller // 將對象存儲到 Spring 中
public class UserController {public void sayHi(String name) {System.out.println("Hi," + name);}
}
我們只需要在存儲的對象上面添加相應的注解就好,不同的注解有著不同的含義,不過基本使用相同,后面會進行詳細介紹
使用注意事項:
- 由于這是類存儲,并不能存儲一個類的多個對象
那么如何進行獲取呢?
后面會講更加簡單的獲取,這里我們還是使用《【JavaEE進階】 Spring 的創建和使?》中所講的獲取方式
public class Application {public static void main(String[] args) {// 1.得到 spring 上下?ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");// 2.得到 beanUserController userController = context.getBean("userController",UserController.class);// 3.調? bean ?法userController.sayHi("遇事問春風乄");}
}
讀取時的注意事項:
- 由于時類注解,所以我們在獲取對象時,我們所填的 id 處的參數有如下約定
- 當首字母和第二字母沒有全部大寫時采用:類名首字母小寫作為id
- 當首字母和第二字母全部大寫時采用:類名首字母和第二個字母全部小寫
🚩為什么要這么多類注解
既然功能是?樣的,為什么需要這么多的類注解呢?
這和為什么每個省/市都有??的?牌號是?樣的??如陜?的?牌號就是:陜X:XXXXXX,北京的?牌號:京X:XXXXXX,?樣。甚??個省不同的縣區也是不同的,?如?安就是,陜A:XXXXX,咸陽:陜B:XXXXXX,寶雞,陜C:XXXXXX,?樣。這樣做的好處除了可以節約號碼之外,更重要的作?是可以直觀的標識?輛?的歸屬地。
那么為什么需要怎么多的類注解也是相同的原因,就是讓程序員看到類注解之后,就能直接了解當前類的?途,?如:
五大類注解用途(重點) :
-
@Controller (控制器) :歸屬于業務邏輯層,用來控制用戶的行為,它用來檢查用戶參數的有效性(比如檢查用戶輸入的用戶名是否有效)。
-
@Service (服務) :歸屬于服務層,調用持久化類實現相應的功能。[不直接和數據庫交互的,它類似于控制中心]
-
@Repository (倉庫) :歸屬于持久層,是直接和數據庫進行交互的。通常每一個表都會對應一個@Repos i tory。
-
@Configuration (配置) :歸屬于配置層,是用來配置當前項目的一些信息。
-
@Component (組件) :歸屬于公共工具類,提供某些公共方法。
🚩注解之間的聯系
查看 @Controller / @Service / @Repository / @Configuration 等注解的源碼發現:
其實這些注解??都有?個注解 @Component,說明它們本身就是屬于 @Component 的“?類”
🎋?法注解 @Bean
類注解是添加到某個類上的,??法注解是放到某個?法上的,如以下代碼的實現:
首先我們準備Student類如下:
public class Student {private String name;private int old;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", old=" + old +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getOld() {return old;}public void setOld(int old) {this.old = old;}
}
然后再創建Students類進行獲取每一個Student的對象
package org.example;import org.springframework.context.annotation.Bean;public class Students {@Beanpublic Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}
然?,當我們寫完以上代碼,嘗試獲取 bean 對象中的 user1 時卻發現,根本獲取不到
package org.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Student student = context.getBean("student",Student.class);student.toString();}
}
以上程序的執?結果如下:
🚩?法注解需要配合類注解使?
在 Spring 框架的設計中,?法注解 @Bean 要配合類注解才能將對象正常的存儲到 Spring 容器中(在哪一類中使用了注解方法,該類就得加上類注解),如下代碼所示:
package org.example;import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;@Controller
public class Students {@Beanpublic Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}
注意事項:
- 添加類注解的類與添加注解方法的返回類一定要不一樣
否則就會出現以下問題:
除此之外,在使用時我們還得知道
我們再進行獲取的時候的 id 屬性默認為你的方法名
我們也可以對通過設置 name 屬性給 Bean 對象進?重命名操作。而且可以設置多個,且都能獲取到
- 注意:一但進行重命名操作后,就不能使用默認方法名了
使用代碼如下:
@Controller
public class Students {@Bean(name = {"st1","st2","st3"})public Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}
public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Student student1 = context.getBean("st1",Student.class);System.out.println(student1.toString());Student student2 = context.getBean("st2",Student.class);System.out.println(student2.toString());Student student3 = context.getBean("st3",Student.class);System.out.println(student3.toString());}
}
但我們再次使用默認方法名時就會報錯:
另外我們在書寫時 name={} 可以省略,如下代碼所示
@Controller
public class Students {@Bean({"st1","st2","st3"})public Student student() {Student stu = new Student();stu.setName("遇事問春風乄");stu.setOld(21);return stu;}
}
?總結
關于《【JavaEE進階】 Spring使用注解存儲對象》就講解到這兒,對于取對象,Spring也有更簡單的寫法,后續博主會給大家一一介紹!感謝大家的支持,歡迎各位留言交流以及批評指正,如果文章對您有幫助或者覺得作者寫的還不錯可以點一下關注,點贊,收藏支持一下!