JAVA_OA管理系統(四):基於註解的組件掃描__SpringMVC

來源:互聯網
上載者:User
總述 有關: 本篇文章是和(三)緊挨著的兄弟文章,代碼同樣是(三)中的那些。

內容(這篇只是一些新手入門,進階請看番外)

     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;










聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.