歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Spring--通過注解來配置bean

Spring--通過注解來配置bean

日期:2017/3/1 9:18:08   编辑:Linux編程

Spring通過注解配置bean
  基於注解配置bean
  基於注解來配置bean的屬性

在classpath中掃描組件
  組件掃描(component scanning):Spring能夠從classpath下自動掃描,偵測和實例化具有特定注解的組件。
  特定的組件包括:
    -@Component:基本注解,標識了一個受Spring管理的組件
    -@Responsitory:標識持久層組件
    -@Service:標識服務層(業務層)組件
    -@Controller:標識表現層組件
  對於掃描到的組件,Spring有默認的命名策略:使用非限定類名,第一個字母小寫。也可以在注解中通過value屬性值標識組件的名稱。
  當在組件類上使用了特定的注解之後,還需要在Spring的配置文件中聲明<context:component-scan>:
    base-package屬性指定一個需要掃描的基類包,Spring容器將會掃描這個基類包裡及其子包中的所有類
    當需要掃描多個包時,可以使用逗號分隔
    如果僅希望掃描特定的類而非基包下的所有類,可使用resource-pattern屬性過濾特定的類,示例:
    <context:component-sacn base-package="com.yl.spring.beans" resource-pattern="autowire/*.class"/>
    <context:include-filter>子節點表示要包含的目標類
    <context:exclude-filter>子節點表示要排除在外的目標類
    <context:component-sacn>下可以擁有若干個<context:include-filter>和<context:exclude-filter>子節點


<context:include-filter>和<context:exclude-filter>子節點支持多種類型的過濾表達式:

類別 示例 說明 annotation com.yl.XxxAnnotation 所有標注了XxxAnnotation的類,該類型采用目標類是否標注了某個注解進行過濾 assinable com.yl.XxxService 所有繼承或擴展XxxService的類,該類型采用了目標類是否繼承或擴展某個特定類進行過濾 aspectj com.yl.*Service 所有類名義Service結束的類及繼承或擴展它們的類,該類型采用AspectJ表達式進行過濾 regex com.yl.anno.* 所有com.yl.anno包下的類。該類型采用正則表達式,根據類的類名進行過濾 custom com.yl.XxxTypeFilter 采用XxxTypeFilter通過代碼的方式定義過濾原則。該類必須實現org.springframework.core.type.TypeFilter接口


組件裝配
<context:component-scan>元素還會自動注冊AutowiredAnnotationBeanPostProcessor實例,該實例可以自動裝配具有@Autowired和@Resource、和@Inject注解的屬性

使用@Autowired自動裝配bean
  @Autowired注解自動裝配具有兼容類型的單個bean屬性
  -構造器,普通字段(即使是非public),一切只有參數的方法都可以應用@Autowired
  -默認情況下,所有使用@Autowired注解的屬性都需要被設置,當Spring找不到匹配的bean裝配屬性時,會拋出異常。若某一屬性允許不被設置,可以設置@Autowired注解的required屬性為false
  -默認情況下,當IOC容器裡存在多個類型兼容的bean時,通過類型的自動裝配將無法工作。此時可以在@Qualifiter注解裡提供bean的名稱,Spring允許對方法的入參標注 @Qualifiter已指定注入bean的名稱
  -@Autowired注解也可以應用在數組類型的屬性上,此時Spring將會把所有匹配的bean進行自動匹配
  -@Autowired注解也可以應用在集合屬性上,此時Spring讀取該集合的類型信息,然後自動裝配所有與之兼容的bean
  -@Autowired注解用在java.util.Map上時,若該Map的鍵值作為String,那麼Spring將自動裝配與之Map值類型兼容的bean,此時bean的名稱作為鍵值

TestObject.java

1 package com.yl.annotation;
2 
3 import org.springframework.stereotype.Component;
4 
5 @Component
6 public class TestObject {
7     
8 }

UserRepository.java接口

1 package com.yl.annotation.repository;
2 
3 public interface UserRepository {
4     public void save();
5     
6 }

UserRepositoryImpl.java

 1 package com.yl.annotation.repository;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Repository;
 5 
 6 import com.yl.annotation.TestObject;
 7 
 8 @Repository
 9 //@Repository("userRepository")
10 public class UserRepositoryImpl implements UserRepository {
11     
12     @Autowired(required=false)
13     private TestObject testObject;
14     
15     @Override
16     public void save() {
17         System.out.println("UserRepository save...");
18         System.out.println(testObject);
19     }
20 
21 }

UserJdbcRepository.java

 1 package com.yl.annotation.repository;
 2 
 3 import org.springframework.stereotype.Repository;
 4 
 5 @Repository
 6 public class UserJdbcRepository implements UserRepository {
 7 
 8     @Override
 9     public void save() {
10         System.out.println("UserJdbcRepository save...");
11     }
12 
13 }

UserService.java

 1 package com.yl.annotation.service;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.beans.factory.annotation.Qualifier;
 5 import org.springframework.stereotype.Service;
 6 
 7 import com.yl.annotation.repository.UserRepository;
 8 
 9 @Service
10 public class UserService {
11     @Autowired
12     @Qualifier("userJdbcRepository")
13     private UserRepository userRepository;
14     
15     /*@Autowired
16     @Qualifier("userJdbcRepository")
17     public void setUserRepository(UserRepository userRepository) {
18         this.userRepository = userRepository;
19     }*/
20     
21     public void add() {
22         System.out.println("UserService add...");
23         userRepository.save();
24     }
25 }

UserController.java

 1 package com.yl.annotation.controller;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Controller;
 5 
 6 import com.yl.annotation.service.UserService;
 7 
 8 @Controller
 9 public class UserController {
10     @Autowired
11     private UserService userService;
12     
13     public void execute() {
14         System.out.println("UserController execute...");
15         userService.add();
16     }
17 }

beans-annotation.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 6         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
 7 
 8     <!-- 指定Spring IOC容器掃描的包 -->
 9     <!-- 可以通過resource-pattern指定掃描的資源 -->
10     <!-- <context:component-scan 
11         base-package="com.yl.annotation"
12         resource-pattern="repository/*.class"></context:component-scan> -->
13     
14     <!-- context:exclude-filter 子節點指定排除哪些指定表達式的組件 -->    
15     <!-- context:include-filter 子節點指定包含哪些指定表達式的組件, 該子節點需要use-default-filters配合使用 -->    
16     <context:component-scan 
17         base-package="com.yl.annotation" >
18         <!-- use-default-filters="false"> -->
19         <!-- <context:exclude-filter type="annotation" 
20             expression="org.springframework.stereotype.Repository"/> -->
21         
22         <!-- <context:include-filter type="annotation" 
23             expression="org.springframework.stereotype.Repository"/> -->
24             
25         <!-- <context:exclude-filter type="assignable" 
26             expression="com.yl.annotation.repository.UserRepository"/> -->
27         
28         <!-- <context:include-filter type="annotation" 
29             expression="com.yl.annotation.repository.UserRepository"/> -->
30     </context:component-scan>
31 </beans>

使用@Resource或@Inject自動裝配bean
  Spring還支持@Resource和@Inject注解,這兩個注解和@Autowired注解的功用類似
  @Resource注解要求提供一個bean名稱的屬性,若該屬性為空,則自動采用標注處的變量或方法名作為bean的名稱
  @Inject和@Autowired注解一樣也是按類型注入的bean,但是沒有required屬性
  建議使用@Autowired注解

Spring中如何配置Hibernate事務 http://www.linuxidc.com/Linux/2013-12/93681.htm

Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm

基於 Spring 設計並實現 RESTful Web Services http://www.linuxidc.com/Linux/2013-10/91974.htm

Spring-3.2.4 + Quartz-2.2.0集成實例 http://www.linuxidc.com/Linux/2013-10/91524.htm

使用 Spring 進行單元測試 http://www.linuxidc.com/Linux/2013-09/89913.htm

運用Spring注解實現Netty服務器端UDP應用程序 http://www.linuxidc.com/Linux/2013-09/89780.htm

Spring 3.x 企業應用開發實戰 PDF完整高清掃描版+源代碼 http://www.linuxidc.com/Linux/2013-10/91357.htm

Spring 的詳細介紹:請點這裡
Spring 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved