總述 有關: 本篇文章是和(三)緊挨著的兄弟文章,代碼同樣是(三)中的那些。
內容(這篇只是一些新手入門,進階請看番外)
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的父類,(二)中提過;
@PostConstruct public void init(){ System.out.println("Book被 初始化了"); } @PreDestroy public 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時,就會在控制台列印輸出這句話。
),用在屬性上
只執行方法的賦值
//假如在一個類(比如是store)中這樣寫,也就是將@Resource,寫在 類名 名字;前 @Resource private Book book; // 此時,該類將會獲得其中的方法 String str="applicationContext.xml"; ApplicationContext ac=new ClassPathXmlApplicationContext(str); Store s=ac.getBean("store",Teacher.class); System.out.println(s.getBook().getName());@Component("book")//這是此時的Book類public class Book implements Serializable{@Value("100")private String bookId;@Value("hadoop權威指南")private String bookName;public Book() {System.out.println("我建立了");}public String getBookId() {return bookId;}public void setBookId(String bookId) {this.bookId = bookId;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}@PostConstructpublic void init(){System.out.println("我被初始化了");}@PreDestroypublic void destroy(){System.out.println("我被銷毀了");}}/*則會輸出:我建立了// 建立Book我被初始化了// init()hadoop權威指南// <span style="font-family: Arial, Helvetica, sans-serif;">.getBook().getName()*/</span>
常用於,減少代碼量,進行對象注入。
注意點:
1) @Resouce是JAVAEE中的,建議使用降低與spring的耦合,而@Autowired是Spring中的。
2)@Autowired尋找類型是“byType”,@Resouce是"byName",@Qualifier("XXX")與@Autowired配合可以將byType轉為byName,其中XXX為name;