javascript
Spring注解开发入门教程
注解開發(fā):
什么是驅(qū)動(dòng)注解?
注解啟動(dòng)時(shí)使用注解的形式替代xml配置,將繁雜的spring配置文件從工程中徹底消除掉,簡(jiǎn)化書寫
注解驅(qū)動(dòng)的弊端
- 為了達(dá)成注解驅(qū)動(dòng)的目的,可能會(huì)將原先很簡(jiǎn)單的書寫,變的更加復(fù)雜
- XML中配置第三方開發(fā)的資源是很方便的,但使用注解驅(qū)動(dòng)無法在第三方開發(fā)的資源中進(jìn)行編輯,因此會(huì)增大開發(fā)工作量(但是第三方資源開發(fā)中編輯的畢竟比較少,所以注解的優(yōu)勢(shì)依舊大于配置)
啟動(dòng)注解功能:
啟動(dòng)注解掃描,加載類中配置的注解項(xiàng)
<context:component-scan base-package="包名"/>說明:
- 在進(jìn)行包所掃描時(shí),會(huì)對(duì)配置的包及其子包中所有文件進(jìn)行掃描
- 掃描過程是以文件夾遞歸迭代的形式進(jìn)行的
- 掃描過程僅讀取合法的java文件
- 掃描時(shí)僅讀取spring可識(shí)別的注解
- 掃描結(jié)束后會(huì)將可識(shí)別的有效注解轉(zhuǎn)化為spring對(duì)應(yīng)的資源加入IoC容器
注意:
- 無論是注解格式還是XML配置格式,最終都是將資源加載到IoC容器中,差別僅僅是數(shù)據(jù)讀取方式不同
- 從加載效率上來說注解優(yōu)于XML配置文件(注解找到這個(gè)類以后直接可以加載,配置文件是先找類然后加載)
bean的定義:
名稱:@Component @Controller @Service @Repository
-
類型:類注解
-
位置:類定義上方
-
作用:設(shè)置該類為spring管理的bean
-
范例:
說明:
@Controller(表現(xiàn)層)、@Service (業(yè)務(wù)層)、@Repository(dao)是@Component的衍生注解,功能同@Component,對(duì)應(yīng)三層架構(gòu),寫哪個(gè)都是一樣的
相關(guān)屬性:
value:默認(rèn)會(huì)加上value,定義時(shí)不需要寫,只要寫bean的訪問id即可
bean的作用域:
-
名稱:@Scope
-
類型:類注解
-
位置:類定義上方
-
作用:設(shè)置該類作為bean對(duì)應(yīng)的scope屬性
-
范例:
相關(guān)屬性
value(默認(rèn)):定義bean的作用域,默認(rèn)為singleton
bean的生命周期:
-
名稱:@PostConstruct、@PreDestroy
-
類型:方法注解
-
位置:方法定義上方
-
作用:設(shè)置該類作為bean對(duì)應(yīng)的生命周期方法
-
范例:
加載第三方資源:
-
名稱:@Bean
-
類型:方法注解
-
位置:方法定義上方
-
作用:設(shè)置該方法的返回值作為spring管理的bean
-
范例:
-
說明:
-
因?yàn)榈谌絙ean無法在其源碼上進(jìn)行修改,使用@Bean解決第三方bean的引入問題
-
該注解用于替代XML配置中的靜態(tài)工廠與實(shí)例工廠創(chuàng)建bean,不區(qū)分方法是否為靜態(tài)或非靜態(tài)
-
@Bean所在的類必須被spring掃描加載,否則該注解無法生效
-
相關(guān)屬性:
value(默認(rèn)):定義bean的訪問id
bean的非引用類型屬性注入:
-
名稱:@Value
-
類型:屬性注解、方法注解
-
位置:屬性定義上方,方法定義上方
-
作用:設(shè)置對(duì)應(yīng)屬性的值或?qū)Ψ椒ㄟM(jìn)行傳參
-
范例:
-
說明:
-
value值僅支持非引用類型數(shù)據(jù),賦值時(shí)對(duì)方法的所有參數(shù)全部賦值
-
value值支持讀取properties文件中的屬性值,通過類屬性將properties中數(shù)據(jù)傳入類中
-
value值支持SpEL
-
@value注解如果添加在屬性上方,可以省略set方法(set方法的目的是為屬性賦值)
-
相關(guān)屬性:
value(默認(rèn)):定義對(duì)應(yīng)的屬性值或參數(shù)值
bean的引用類型屬性注入:
-
名稱:@Autowired、@Qualifier
-
類型:屬性注解、方法注解
-
位置:屬性定義上方,方法定義上方
-
作用:設(shè)置對(duì)應(yīng)屬性的對(duì)象或?qū)Ψ椒ㄟM(jìn)行引用類型傳參
-
范例:
-
說明:
- @Autowired默認(rèn)按類型自動(dòng)裝配
- @Qualifier后可以指定自動(dòng)裝配的bean的id(比如有userDao1、userDao2,可以指定名稱加載)
-
相關(guān)屬性
- required:定義該屬性是否允許為null
bean的引用類型屬性注入:
-
名稱:@Primary
-
類型:類注解
-
位置:類定義上方
-
作用:設(shè)置類對(duì)應(yīng)的bean按類型裝配時(shí)優(yōu)先裝配
-
范例:
說明:
@Autowired默認(rèn)按類型裝配,當(dāng)出現(xiàn)相同類型的bean,使用@Primary提高按類型自動(dòng)裝配的優(yōu)先級(jí),多個(gè)@Primary會(huì)導(dǎo)致優(yōu)先級(jí)設(shè)置無效
例:比如有userDao1、userDao2類,但是兩個(gè)類的@Component都沒寫id,配置加載的是userDao,這個(gè)時(shí)候會(huì)報(bào)錯(cuò)說匹配不到,就可以在類上加@Primary,加在哪個(gè)類,哪個(gè)類優(yōu)先加載
bean的引用類型屬性注入:
-
名稱:@Inject、@Named、@Resource
-
說明:
- @Inject與@Named是JSR330規(guī)范中的注解,功能與@Autowired和@Qualifier完全相同,適用于不同架構(gòu)場(chǎng)景
- @Resource是JSR250規(guī)范中的注解,可以簡(jiǎn)化書寫格式,說白了就是把@Autowired、@Qualifier合并成@Resource
-
@Resource相關(guān)屬性
-
name:設(shè)置注入的bean的id(就是@Autowired)
-
type:設(shè)置注入的bean的類型,接收的參數(shù)為Class類型(就是@Qualifier)
-
加載properties文件:
-
名稱:@PropertySource
-
類型:類注解
-
位置:類定義上方
-
作用:加載properties文件中的屬性值
-
范例:
說明:
不支持*通配格式,一旦加載,所有spring控制的bean中均可使用對(duì)應(yīng)屬性值
相關(guān)屬性:
-
value(默認(rèn)):設(shè)置加載的properties文件名
-
ignoreResourceNotFound:如果資源未找到,是否忽略,默認(rèn)為false
純注解格式:
-
名稱:@Configuration、@ComponentScan
-
類型:類注解
-
位置:類定義上方
-
作用:設(shè)置當(dāng)前類為spring核心配置加載類
-
范例:
AnnotationConfigApplicationContext
加載純注解格式上下文對(duì)象,需要使用AnnotationConfigApplicationContext加載配置
public static void main(String[] args) {// ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");// 加載配置類的字節(jié)碼AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = (UserService) ctx.getBean("userService");UserDao userDao = (UserDao) ctx.getBean("userDao");BookDao bookDao = (BookDao) ctx.getBean("bookDao");userService.save();userDao.save();bookDao.save();}說明:
-
核心配合類用于替換spring核心配置文件,此類可以設(shè)置空的,不設(shè)置變量與屬性
-
bean掃描工作使用注解@ComponentScan替代
第三方bean配置與管理:
-
名稱:@Import
-
類型:類注解
-
位置:類定義上方
-
作用:導(dǎo)入第三方bean作為spring控制的資源
-
范例:
-
說明:
-
@Import注解在同一個(gè)類上,僅允許添加一次,如果需要導(dǎo)入多個(gè),使用數(shù)組的形式進(jìn)行設(shè)定,加大括號(hào),用逗號(hào)隔開
-
在被導(dǎo)入的類中可以繼續(xù)使用@Import導(dǎo)入其他資源
-
@Bean所在的類可以使用導(dǎo)入的形式進(jìn)入spring容器,無需聲明為bean
-
bean加載控制:
@DependsOn
-
名稱:@DependsOn
-
類型:類注解、方法注解
-
位置:bean定義的位置(類上或方法上)
-
作用:控制bean的加載順序,使其在指定bean加載完畢后再加載
-
范例:
-
說明:
-
配置在方法上,使@DependsOn指定的bean優(yōu)先于@Bean配置的bean進(jìn)行加載
-
配置在類上,使@DependsOn指定的bean優(yōu)先于當(dāng)前類中所有@Bean配置的bean進(jìn)行加載
-
配置在類上,使@DependsOn指定的bean優(yōu)先于@Component等配置的bean進(jìn)行加載
-
相關(guān)屬性
- value(默認(rèn)):設(shè)置當(dāng)前bean所依賴的bean的id
應(yīng)用場(chǎng)景:
-
聊天通信:先啟動(dòng)發(fā)消息再啟動(dòng)接收消息,用于bean的加載順序控制
-
雙11活動(dòng)期間:零點(diǎn)前是結(jié)算策略A,零點(diǎn)后是結(jié)算策略B,策略B操作的數(shù)據(jù)為促銷數(shù)據(jù)。策略B加載順序與促銷數(shù)據(jù)的加載順序
@Order
-
名稱:@Order
-
類型:配置類注解
-
位置:配置類定義的位置(類上)
-
作用:控制配置類的加載順序
-
范例:
應(yīng)用場(chǎng)景:
- 多個(gè)種類的配置出現(xiàn)后,優(yōu)先加載系統(tǒng)級(jí)的,然后加載業(yè)務(wù)級(jí)的,避免細(xì)粒度的加載控制
@Lazy
-
名稱:@Lazy
-
類型:類注解、方法注解
-
位置:bean定義的位置(類上或方法上)
-
作用:控制bean的加載時(shí)機(jī),使其延遲加載
-
范例:
應(yīng)用場(chǎng)景:
- 程序?yàn)?zāi)難出現(xiàn)后對(duì)應(yīng)的應(yīng)急預(yù)案處理是啟動(dòng)容器時(shí)加載時(shí)機(jī)
總結(jié)
以上是生活随笔為你收集整理的Spring注解开发入门教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC响应使用案例(带数据页
- 下一篇: Spring事务详解与使用