1. 程式人生 > >5.spring:註解配置 Bean

5.spring:註解配置 Bean

在classpath中掃描元件

組鍵掃描:能夠從classpath下自動掃描,偵測和例項化具有特定註解的元件
特定的元件包括:
->@Componment:基於註解,標識一個受Spring管理的組鍵
->@Respository:標識持久層元件
->@Service:標識服務層
->@controller:標識表現層元件
對於掃描到的元件,Spring有預設的命名策略,使用非限定類名,第一個字母小寫,也可以通過註解中value屬性值標識組建的名稱

 

在classpath中掃描組鍵
當在組鍵類中使用了特定的註解後,還需要再Spring的配置中宣告<context:componment-scan>
->base-packge屬性是指定一個需要掃描的基類包,Spring容器將會掃描這個基類包裡及其他子類包中的所有類
->當需要掃描多個包時,可以使用逗號分隔
->如果僅希望掃描特定類而非集包下的所有類,可使用resource-pattren屬性過濾特定的類

 

通常情況下我們在建立spring專案的時候在xml配置檔案中都會配置這個標籤,配置完這個標籤後,spring就會去自動

掃描base-package對應的路徑或者該路徑的子包下面的java檔案,
如果掃描到檔案中帶有@Service,@Component,@Repository,@Controller等這些註解的類,則把這些類註冊為bean
注:在註解後加上例如@Component(value=”abc”)時,註冊的這個類的bean的id就是abc.

 

 

 

 

TestObject.java
@Component
public class TestObject { //@Componment:基於註解,標識一個受Spring管理的組鍵 }
UserController.java
@Controller
public class UserController {
    //建立關聯關係
    @Autowired
    private UserService userService;
    
    public void execute() {
        System.out.println("UserController execute...");
        userService.add();
    }
}

 UserRepository.java

public interface UserRepository {
    void save();
}

 UserRepositoryImpl.java

@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {
    @Override
    public void save() {
        System.out.println("UserRepository  save...");
    }
}
UserService.java
@Service
public class UserService {    
    @Autowired
    private UserRepository userRepository;
public void add() { // TODO Auto-generated method stub System.out.println("UserService add..."); userRepository.save(); } }

applicationContext.xml

<!-- 指定IOC容器掃描的包 -->
<!-- 下面的引入檔案,沒有進入IOC容器的立馬進入IOC容器,有S的標誌 -->
<!-- 掃描這個包以及它的子包 -->
<context:component-scan base-package="com.MrChengsb.Annotations" ></context:component-scan>

<!-- 
    只掃描子包中這個包裡的類
    resource-pattern="repository/*.class"
    
    不包含...
    指定排除那些表示式的組鍵
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
 -->

<!--  
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
-->
    
<!--
     和 context:component-scan 中的 use-default-filters="false" 進行搭配才可以只包括,就是隻有包含的這個
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
-->
<!--
   只包含
   use-default-filters="false" 共同使用 <context:include-filter type="assignable" expression="com.MrChengsb.Annotations.repository.UserRepository"/> -->
<!-- 不包含這個介面以及它的實現類 <context:exclude-filter type="assignable" expression="com.MrChengsb.Annotations.repository.UserRepository"/> -->

測試以及相關注釋:

public static void main(String[] args) {
        
        ApplicationContext ctx = new ClassPathXmlApplicationContext("Annotations.xml");
        
        //沒有設立關聯關係的
//        TestObject test = (TestObject) ctx.getBean("testObject");
//        System.out.println(test);
//        
//        UserController uc = (UserController) ctx.getBean("userController");
//        System.out.println(uc);
//        
//        UserRepositoryImpl urp = (UserRepositoryImpl) ctx.getBean("userRepository");
//        System.out.println(urp);
//        
//        UserService use = (UserService) ctx.getBean("userService");
//        System.out.println(use);
//        
        
        
        //設立關聯關係的
//        TestObject test = (TestObject) ctx.getBean("testObject");
//        System.out.println(test);
        
        UserController uc = (UserController) ctx.getBean("userController");
        System.out.println(uc);
        uc.execute();
        
//        UserRepositoryImpl urp = (UserRepositoryImpl) ctx.getBean("userRepository");
//        System.out.println(urp);
//        
//        UserService use = (UserService) ctx.getBean("userService");
//        System.out.println(use);
        
        
        
        //沒建立Bean之家的引用關係
//        [email protected]ption in thread "main" 
//        UserController execute...
//        java.lang.NullPointerException
//            at com.MrChengsb.Annotations.controller.UserController.execute(UserController.java:18)
//            at com.MrChengsb.Annotations.main.main(main.java:37) 
    }

 測試程式碼省略.......