Spring的元件自動掃描機制
Spring將所有的bean都納入到IOC中建立、管理和維護。對於大型的專案而言,專案中會有成百上千個bean,如果我們都在配置檔案中配置,那麼我們就會增加配置檔案的體積,顯得過於臃腫,過於龐大,查詢維護起來也不太方便。
在Spring2.5中引入了元件自動掃描機制,通過在classpath自動掃描的方式把元件納入到Spring容器中。這大大減少了程式設計師在配置XML檔案上的時間,使得配置檔案顯得乾淨,整潔,便於維護。
這種機制的工作步驟是:
1.配置需要掃描的類;
2.在需要被納入Spring容器的類上加上相應的註解;
3.Spring在類路徑下尋找標註了註解的類,並把這些類納入Spring容器中管理。
它的作用是和在XML檔案中使用<bean>節點配置元件是一樣的。
自動掃描元件的使用
第一步:配置applicationContext.xml檔案;如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<!-- 開啟Spring元件自動掃面,並配置要掃描的基本包 -->
<context:component-scan base-package="com.springtest"></context:component-scan>
</beans>
注:<context:component-scan>節點用於通知Spring容器掃描元件,base-package屬性用於指定將要被掃描的元件所在的包名稱。
第二步:為需要被掃描的類新增相應的註解;註解的型別有以下幾種:
· @Service 用於標註業務層元件;
· @Repository 用於標註資料訪問層元件;
· @Controller 用於標註控制層元件(如:Struts中的action)
· @Component 表示泛型元件,當元件不好歸類的時候,我們可以使用這個元件進行註解。
第三步:當為類新增完成註解後,我們需要測試相應的元件是否被納入Spring容器,所以我們需要測試元件是否被掃描;如下:
@Test
public void testAddUser()
{
UserBiz userBiz = (UserBiz)context.getBean("userBizImpl");
System.out.println(userBiz);
}
如果輸出不為空,則說明測試類已經被掃描並且納入了Spring容器。
細節問題總結:
1.當我們進行測試時,用ApplicationContext物件的getBean()方法尋找元件。在之前的配置檔案中我們會用<bean>標籤的id屬性去定義,在使用註解後怎樣獲得組建的id呢?
在這種情況下,Spring會將被標註註解的類名拿到,然後再將該類名的第一個字母變為小寫,放到getBean()方法中。如:UserBizImpl類的元件Id就會是userBizImpl,獲取時為context.getBean("userBizImpl");
那麼,我們在使用註解時可以自定義元件的Id嗎?
當然可以。我們需要在為相應的類添加註解時,在註解之後新增自定義的類名,例如:
@Service("userBiz")
public class UserBizImpl implements UserBiz {
……
}
當我們在獲取該元件時,為context.getBean("userBiz);
2.在配置檔案中我們可以對元件(bean)的作用域範圍進行設定,它的預設值是單例模式,那麼在添加註解的情況下,我們怎樣設定元件的作用域範圍呢?
我們可以直接在為類添加註解的同時,運用另一個註解@Scope("prototype")來設定,如下
@Service("userBiz")@Scope("prototype")
public class UserBizImpl implements UserBiz {
……
}
3.在使用註解時,為元件設定初始化和銷燬方法:
在添加註解的相應的類中,如果想初始化或銷燬某個方法,我們可以直接在方法上添加註解,如下:
@PostConstruct
public void addItem() {
System.out.println("初始化方法");
}
@PreDestroy
public void testItem() {
System.out.println("釋放資源");
}
4.在使用Spring自動掃描元件後,怎樣進行依賴注入?
運用註解@Resource和@Autowired,併為依賴物件設定名稱,例如:
@Resource(name="userDao")
private UserDAO userDao = null;
首先它會根據名稱去找Spring自動掃描的並加入到Spring容器的元件(bean),如果有相同的名稱,則進行依賴注入,如果沒有相同的名稱。則會根據型別區尋找元件。