目錄
前言:
五大類注解
@Controller
@Service
@Repository
@Component
@Configuration
JavaEE標(biāo)準(zhǔn)分層
阿里分層結(jié)構(gòu)
BeanName命名規(guī)則
方法注解
@Bean
注入方式取Bean
屬性注入
Setter注入
構(gòu)造方法注入
@Resource
前言:
? ? 使用Spring容器,為我們程序開(kāi)發(fā)帶來(lái)了很大的遍歷。那么我們就需要學(xué)習(xí)Spring帶來(lái)的一些機(jī)制,靈活的使用和理解這些機(jī)制,相信會(huì)有很多收獲。
五大類注解
@Controller
? ? 控制器,驗(yàn)證用戶請(qǐng)求數(shù)據(jù)的正確性(安保系統(tǒng))。直接和前端打交到,驗(yàn)證前端發(fā)來(lái)請(qǐng)求是否正確。
@Service
? ? 服務(wù),編排和調(diào)度具體執(zhí)行方法的(客服中心)。不會(huì)直接操作數(shù)據(jù)庫(kù),根據(jù)請(qǐng)求判斷具體調(diào)用哪個(gè)方法。
@Repository
? ? 數(shù)據(jù)持久層,直接和數(shù)據(jù)庫(kù)交互(執(zhí)行者)(DAO層 data access object)
@Component
? ? 組件(工具類)。為整個(gè)項(xiàng)目存放一些需要使用的組件,放在其他位置不是很合適。
@Configuration
? ? 配置項(xiàng)(項(xiàng)目中的一些配置)。當(dāng)項(xiàng)目啟動(dòng)時(shí),如果遇到哪個(gè)類被這個(gè)注解修飾,那么就會(huì)加載其中的一些配置。
注意:
? ? 1)上述五大類注解,xml配置的路徑中只要能查找到(遞歸查詢),其所修飾的類都會(huì)作為bean存儲(chǔ)到spring中(類名需不同)。當(dāng)然如果沒(méi)有上述五大類注解那么當(dāng)前類是不能作為bean存儲(chǔ)到spring中的。
? ? 2)五大類注解存在不同含義,當(dāng)我們看到某一個(gè)注解就可以明確這個(gè)了類是做什么的。
? ? 3)除了Component以外的其他四大類注解,都有Component注解的功能,也就是它的擴(kuò)展。(看源碼可發(fā)現(xiàn)其他四大類注解上面都有@Component注解)。
JavaEE標(biāo)準(zhǔn)分層
阿里分層結(jié)構(gòu)
注意:阿里分層結(jié)構(gòu)是對(duì)JavaEE標(biāo)準(zhǔn)分層在服務(wù)層(Service)做了一個(gè)擴(kuò)展。
BeanName命名規(guī)則
注意:
? ? 逐級(jí)向下看源碼,發(fā)現(xiàn)Spring中使用的jdk中的方法來(lái)作為BeanName的命名規(guī)則。
? ? 1)默認(rèn)是第一個(gè)字母小寫。
? ? 2)如果前兩個(gè)字母的大寫,即BeanName就是原類名。
方法注解
@Bean
注意:
? ? 1)可以將方法的返回值添加到spring中。
? ? 2)方法注解必須搭配類注解使用,spring不會(huì)掃描所有類的方法,只掃描類注解下的方法(提升效率)
? ? 3)@Bean的命名規(guī)則,默認(rèn)是方法名,也可以起多個(gè)名字(name屬性),這個(gè)時(shí)候默認(rèn)的名字就無(wú)效了
? ? 4)控制注入順序(@Order注解)值越大,注入越遲,是類注解。如果對(duì)象一樣,名字也一樣(覆蓋式注入)
注入方式取Bean
@Autowired
屬性注入
? ? 屬性注入(spring會(huì)自動(dòng)的將spring對(duì)象注入到@Autowired修飾的屬性這里)
? ? 根據(jù)類型和名字(spring中的對(duì)象Id),來(lái)確定唯一的一個(gè)對(duì)象,
優(yōu)點(diǎn):
? ? 使用非常簡(jiǎn)單,只需要在屬性上加@Autowired注解即可。
缺點(diǎn):
? ? 1)無(wú)法實(shí)現(xiàn)final修飾的變量注入
? ? 2)兼容不好,只適用于IoC容器
? ? 3)風(fēng)險(xiǎn):因?yàn)閷懛ê?jiǎn)單,所以違背單一設(shè)計(jì)原則概率更大(可以注入多個(gè)對(duì)象,使用多個(gè)屬性)
Setter注入
? ? Setter注入(使用set方法,spring會(huì)將對(duì)象傳入到set方法中)(根據(jù)類名和對(duì)象名來(lái)確定)
優(yōu)點(diǎn):
? ? 符合單一設(shè)計(jì)原則(每個(gè)方法只能傳遞一個(gè)對(duì)象)
缺點(diǎn):
? ? 1)不能注入不可變對(duì)象(final修飾)
? ? 2)使用Setter注入的對(duì)象可能會(huì)被修改(可以調(diào)用set方法進(jìn)行修改參數(shù))
構(gòu)造方法注入
? ? 構(gòu)造方法注入(官方推薦的做法),使用構(gòu)造方法。
? ? 如果只有一個(gè)構(gòu)造方法,可以省略@Autowired,有多個(gè)構(gòu)造方法就不能省略了。
優(yōu)點(diǎn):
? ? 1)可以注入不可變對(duì)象(final修飾的)。
? ? 2)注入的對(duì)象不會(huì)改變,構(gòu)造方法只執(zhí)行一次。
? ? 3)構(gòu)造方法可以保證對(duì)象完全被初始化(類加載時(shí)就會(huì)執(zhí)行)。
? ? 4)通用性更好。
提出問(wèn)題:
? ? 為什么構(gòu)造方法可以注入不可變的對(duì)象而Setter和屬性注入?yún)s不可以呢?
? ? 答:final修飾的對(duì)象需要直接賦值或者在構(gòu)造方法里進(jìn)行初始化。類加載過(guò)程中就會(huì)執(zhí)行構(gòu)造方法,那么就可以初始化final修飾的對(duì)象。而Setter注入和屬性注入是spring實(shí)現(xiàn)的,執(zhí)行時(shí)機(jī)在類加載之后,所以就不能修改final修飾的對(duì)象。
@Resource
? ? 使用JDK 提供的的@Resource注解也可以實(shí)現(xiàn)對(duì)象的注入。
注意:
? ? 1)出身不同:@Autowired 來(lái)自于 Spring,而@Resource 來(lái)自于 JDK 的注解
? ? 2)使用時(shí)設(shè)置的參數(shù)不同:相比于 @Autowired 來(lái)說(shuō),@Resource ?持更多的參數(shù)設(shè)置,例如name 設(shè)置,根據(jù)名稱獲取 Bean。
? ? 3)@Autowired 可用于 Setter 注入、構(gòu)造函數(shù)注?和屬性注入,而@Resource 只能用于?Setter 注入和屬性注入,不能用于構(gòu)造函數(shù)注入
? ? 4)@Autowired先根據(jù)類型查找,之后再根據(jù)名稱查找。
? ? 5)@Resource先根據(jù)名稱查找,再根據(jù)類型查找。
小結(jié):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-422668.html
? ? 使用五大類注解和Bean的更簡(jiǎn)單存儲(chǔ)可以快速提升我們開(kāi)發(fā)的效率,學(xué)習(xí)框架我們要理解框架的本質(zhì)作用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-422668.html
到了這里,關(guān)于Spring五大類注解 || Bean的更簡(jiǎn)單存儲(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!