JAVA_OA管理系统(四):基于注解的组件扫描
總述
有關:
本篇文章是和(三)緊挨著的兄弟文章,代碼同樣是(三)中的那些。內容(這篇只是一些新手入門,進階請看番外)
? ? ?1 ?什么是組件掃描
? ? ?2 ?指定掃描類路徑? ? ?3 ?自動掃描的注解標記
? ? ?4 ?自動掃描注解命名
? ? ?5 ?指定組件的作用域
? ? ?6 ?指定初始化和銷毀方法
? ? ?7 ?指定依賴注入關系
? ? ?8 ?注入spring的表達式 ?
1 ?什么是組件掃描
? ? ? ? ?指定一個包路徑,Spring會自動掃描該包及其子包所有組件類,當發現組件類定義前有特定的注解標記時,就將該組件納入到Spring容器中,等價于原來的XML配置bean
的功能。
2 ?指定掃描類路徑
? ? ? ? 使用組件掃描,首先需要在XML配置中指定掃描父級package路徑,容器會自動去掃描Com.throne包及其自包下的所有組件,并且實例化bean
<context:component-scan base-package="com.throne"></context:component-scan>
而我們的(三)中的java包都在該路徑下;
3 ?自動掃描的注解標記
? ? ? ? 指定掃描的類路徑后,并且不是所有的該路徑下的組件都會被掃描到Spring容器,只有在組件類定義前有一下標記的,才會掃描到Spring容器。
?4 ?自動掃描注解命名(需要導入webMVC的jar包)
? ? ? ? 當一個組件在掃描過程中被檢測到時,會生成一個默認的id值,默認id值為小寫
? 開頭的類名,也可以在注解中自定義id。注意:使用注解既然要導入jar包,那么自然要import jar包; //比如我們之前的Book類@Component("book") public class Book implements Serializable{//屬性-->也是注解來注入的@Value("100") private String bookPrice;@Value("hadoop權威指南")private String bookName;//getter and setter}//至于獲取,則變為注解時添加的IDBook b1=ac.getBean("book",Book.class);//沒有添加id時,為默認的小寫首字母的類名(類的規范:首字母大寫) System.out.println(s.getBook().getBookName()); System.out.println(s.getBook().getBookId());結果:hadoop權威指南100
這時則不需要再配置xml文件中的bean,因此可見通過更方便的注解來代替原來的xml文件配置,則大大簡化編程流程。
5 ?指定組件的作用域
? ? ? ? ?Spring管理的組件,默認的作用域是”singleton”(單例模式),如果需要其他的作用域? ? ? ? 也可以使用@Scope注解,只要在注解中提供作用域的名稱即可,此處屬性值與(二)中所講的是一樣的。 //比如我們之前的Book類@Component("book") public class Book implements Serializable{//屬性-->也是注解來注入的@Value("100") private String bookPrice;@Value("hadoop權威指南")private String bookName;//getter and setter}//至于獲取,則變為注解時添加的IDBook b1=ac.getBean("book",Book.class); Book b2=ac.getBean("book",Book.class);System.out.println(b1==b2);結果:true 而 @Component("book") @Scope("prototype") public class Book implements Serializable{ }System.out.println(b1==b2);此時運行結果則為:false
6 ?指定初始化和銷毀方法 (了解即可)
? ? ? ?@PostConstruct 指定初始化方法? ? ? ?@PreDestroy 指定銷毀方法
注意:但單例的時候才能關閉,多例時沒有關閉
AbstractApplicationContext才有銷毀,他是ApplicationContext的父類,(二)中提過;
@PostConstructpublic void init(){System.out.println("Book被 初始化了");}@PreDestroypublic void destroy(){System.out.println("Book被銷毀了");}7 ?指定依賴注入關系
? ? ? ? ? ?具有依賴關系的bean對象,利用下面任意一種注解都可以實現關系的注入? ? ? ? ? 基本類型的值注入可以使用 @value() 標記
// ? ? ??@Component(通用注解,當你不知道用什么的時候,可以試試這個)
?具有依賴關系的bean對象,利用下面任意一種注解都可以實現關系的注入
? ? ? ? ?注意: Setter注入推薦使用@Resource ?構造器推薦使用@Autowired
? ? ? ? ?1 ?@Autowired/@Qualifier ? 可以處理構造器注入和Setter注入
? ? ? ? ? ? ? @Autowired寫在構造器前面,申明需要為其注入bean
? ? ? ? ? ? ? @Qualifier寫在參數 前面,申明需要注入的bean的id
// ? ? ? ? ? ?這樣可以減少代碼量,簡化編寫流程。
詳細的可以看這篇文章(這篇文章的代碼比較詳細):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Spring@Autowired注解與自動裝配
@Autowired寫在屬性上面 ? ?只會執行構造器的一句 賦值 不會全部執行 ? ? ? ? ?
? ? ? ? ? ? ? 如果在單例模式中 @Qualifier可以省略
2 @Autowired也可以寫在set方法上面
? ? ? ? ? ? ?注入對象單例時,@Qualifier可以省略。此時,Spring按照類型匹配參數。
? ? ? ? ? ? ?@Autowired也可以寫在屬性上,作用和寫在set方法上類似,但只會執行
? ? ? ? ? ? ?賦值語句
3 ?使用@Resouce注解
? ? ? ? ? ?只能用在set方法上和屬性上,用在set 方法中 ,執行所有的方法體(
比如
? ? ? ?在setter中添加一句:System.out.println("我在set中被@Resouce執行了!");
那么在執行zhegeset時,就會在控制臺打印輸出這句話。
),用在屬性上
? ? ? ? ? ? 只執行方法的賦值
常用于,減少代碼量,進行對象注入。
注意點:
1)?@Resouce是JAVAEE中的,建議使用降低與spring的耦合,而@Autowired是Spring中的。
2)@Autowired查找類型是“byType”,@Resouce是"byName",@Qualifier("XXX")與@Autowired配合可以將byType轉為byName,其中XXX為name;
總結
以上是生活随笔為你收集整理的JAVA_OA管理系统(四):基于注解的组件扫描的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA_OA管理系统(二)番外篇:Io
- 下一篇: JAVA_OA管理系统(四)番外篇:使用