?
目錄
使用類注解
前置工作?
Bean命名規(guī)則
?五大類的實現(xiàn)
JavaEE標(biāo)準(zhǔn)分層
之前我們存儲Bean時,是在spring-config.xml文件中添加bean注冊內(nèi)容來實現(xiàn)的
通過"注解"我們可以替代這一項工作
更加簡單的存儲方式:
使用類注解
五大類注解:
@Controller(控制器):用來控制前端提交的請求,驗證用戶請求的數(shù)據(jù)的正確性(安保系統(tǒng))
@Service(服務(wù)):編排和調(diào)度具體的執(zhí)行方法
@Repository:持久層,和數(shù)據(jù)庫交互=DAO(Data Access Object)數(shù)據(jù)訪問層?
@Component:組件,存放工具類
@Configuration:配置項,項目中的配置
前置工作?
創(chuàng)建好Spring項目后,進(jìn)行前置工作:配置掃描路徑
要將對象存儲到Spring中,需要配置一下存儲對象的掃描路徑, 只有配置的包下的所有類,添加了注解才會正確的被識別并保存到Spring
<?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.aaa.service"></content:component-scan>
</beans>
?創(chuàng)建.xml配置文件,將上述代碼粘貼到這里
?
<content:component-scan base-package="com.java.demo"></content:component-scan>
只有這個包下的類,才會掃描是否有五大類注解的.如果這個類沒加注解,也不會被加入Spring
但是,如果加了五大類注解,卻沒在這個包下的類,也不會被存儲到Spring中
Bean命名規(guī)則
新建類,然后使用注解添加類到Spring中
package com.java.demo;
import org.springframework.stereotype.Controller;
@Controller//將當(dāng)前類存儲到Spring中
public class StudentController {
public void say(){
System.out.println("student-hello");
}
}
import com.java.demo.StudentController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
StudentController studentController =
context.getBean("StudentController",StudentController.class);
studentController.say();
}
}
?我們使用上文所說,第三種類型+名稱的方式獲取Bean
名稱先用類名試一試,報錯了
?使用原類名首字母小寫的形式試試,成功了
?那么名稱是需要使用原類名首字母小寫的形式,這是個spring的約定
那如果是這種形式的類名呢?
package com.java.demo;
public class SController {
public void say(){
System.out.println("SController-hello");
}
}
通過原類名首字母小寫的形式,獲取不到bean
規(guī)則:
如果類名是第一個字母大寫,第二個字母小寫,就可以原類名首字母小寫形式去訪問
如果類名是第一個字母大寫,第二個字母也是大寫,就只能用原類名形式訪問
我們從源碼角度分析,為什么是這樣的規(guī)則?
?
?看這段代碼
如過name.length()大于1并且下標(biāo)為1的字符是大寫并且第0個字符也為大寫寫,那么就返回name
對應(yīng)的是第二條規(guī)則
否則,將第0個字符轉(zhuǎn)換成小寫并返回
對應(yīng)的是第一條規(guī)則
Bean,命名規(guī)則:默認(rèn)情況下是首字母小寫,如果類名首字母和第二個字母都為大寫,Bean名稱為原類名
我們使用這個方法測試一下不同的名稱
import java.beans.Introspector;
public class BeanNameTest {
public static void main(String[] args) {
String name1 = "USer";
String name2 = "User";
System.out.println("name1 => "+Introspector.decapitalize(name1));
System.out.println("name2 => "+Introspector.decapitalize(name2));
}
}
與我們分析的相同?
?
?五大類的實現(xiàn)
@Controller實現(xiàn)了對Bean的存取
將注解替換為@Service
?效果:也能獲取到Bean并使用
?換成@Repository也能成功
換成@Component也能成功?
換成@Configuration,也可以
?這五大類注解,都都更加簡單的存儲獲取Bean
<bean>標(biāo)簽?zāi)芊窨梢院蚦ontent-scan一起使用呢?新建一個包創(chuàng)建類試試
使用bean標(biāo)簽
?成功執(zhí)行了,說明<bean>標(biāo)簽和?content-scan是可以一起使用的.
這種場景是在這個類不合適放在content-scan掃描的包下的,但是有需要這個類,就將它用bean標(biāo)簽配置,相當(dāng)于對content-scan的補(bǔ)充
如果 去掉 bean標(biāo)簽,再加上注解,能獲取到userService嗎?
也就是,如果沒在content-scan掃描路徑下的類,加了五大類注解能不能存取Bean?
看結(jié)果:代碼雖然沒有報錯,但是結(jié)果?是找不到userService這個bean的
所以答案是不可以!
如果不再掃描路徑下,就不會被掃描
那要是在掃描路徑下,沒加五大類注解呢??
也是不行的,即使在掃描路徑下,沒有五大類注解,也是不能被存儲到Spring中的
還有個結(jié)論:如果在content-scan下的所有子包下的類,只要加了五大類注解,都能被存儲到Spring中
建議:不要有重名的類,導(dǎo)包很可能導(dǎo)錯,如果報錯了,可以加別名來區(qū)分
五大類注解既然都能進(jìn)行存儲Bean對象,那么為啥要設(shè)置五個類注解?
先看看每個注解的實現(xiàn)
?
可以看到,這四個注解都是基于Component實現(xiàn)的,都是它的一個子類,是針對于它的功能的擴(kuò)展
回到問題,為什么需要五大類注解呢?
JavaEE標(biāo)準(zhǔn)分層
需要先學(xué)習(xí)JavaEE標(biāo)準(zhǔn)分層
為什么要分層?
高內(nèi)聚:分層的設(shè)計可以簡化系統(tǒng)設(shè)計,讓不同的層專注做某一模塊的事
低耦合:層與層之間通過接口或API來交互,依賴方不用知道被依賴方的細(xì)節(jié)
復(fù)用:分層之后可以做到很高的復(fù)用
擴(kuò)展性:分層架構(gòu)可以讓我們更容易做橫向擴(kuò)展
如果系統(tǒng)沒有分層,當(dāng)業(yè)務(wù)規(guī)模增加或流量增大時我們只能針對整體系統(tǒng)來做擴(kuò)展。分層之后可以很方便的把一些模塊抽離出來,獨立成一個系統(tǒng)
JavaEE標(biāo)準(zhǔn)分層至少三層(后端三層架構(gòu))
1.請求處理層(驗證參數(shù)):業(yè)務(wù)邏輯層
2.業(yè)務(wù)邏輯層(服務(wù)調(diào)度)
3.數(shù)據(jù)持久層(直接操作數(shù)據(jù)庫)DAO層
這個分層是我們做項目的基礎(chǔ)?
這是阿里的分層標(biāo)準(zhǔn)
細(xì)化了原來的三層架構(gòu),添加了Manager 通用業(yè)務(wù)處理層
mannger層作用
一、可以將原先 Service 層的一些通用能力下沉到這一層,比如與緩存和存儲交互策略,中間件的接入;二、也可以在這一層封裝對第三方接口的調(diào)用,比如調(diào)用支付服務(wù),調(diào)用審核服務(wù)等RPC接口。
優(yōu)點:相比于三層方式,添加了通用處理層對接外部平臺。 上下游對接劃分的比較清晰
缺點:核心業(yè)務(wù)邏輯層沒有劃分
適應(yīng)場景:業(yè)務(wù)邏輯不復(fù)雜的常用業(yè)務(wù)
回到問題,為什么要設(shè)置五大類?注解?
設(shè)置五大類注解的作用就很明了了,為了方便程序員使用,看到某個注解時,就知道是什么層面的代碼,這些注解底層都是Component,功能都是相同的,目的就是為了讓程序員看到注解就能知道當(dāng)前類的作用!
方法注解也可以存儲bean:@Bean文章來源:http://www.zghlxwxcb.cn/news/detail-424546.html
下文再介紹文章來源地址http://www.zghlxwxcb.cn/news/detail-424546.html
到了這里,關(guān)于更簡單的存取Bean的方式(一)-五大類注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!