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