配置文件
前面的例子我們都是使用XML的bean定義來配置組件。在一個稍大的項目中,通常會有上百個組件,如果這些組件採用XML的bean定義來配置,顯然會增加配置文件的體積,查找及維護起來也不太方便。
Spring2.5為我們引入了組件自動掃描機制,它可以在類路徑底下尋找標註了@Component、@Service、@Controller、@Repository註解的類,並把這些類納入進Spring容器中管理。
它的作用和在XML文件中使用bean節點配置組件是一樣的。要使用自動掃描機制,我們需要打開以下配置信息:
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:component-scan base-package="cn.itcast" /></beans>
其中<context:component-scan base-package="cn.itcast" />這個配置隱式註冊了多個對註解進行解析處理的處理器,包括<context:annotation-config/>該配置註冊的處理器,也就是說寫了<context:component-scan base-package="cn.itcast" />配置,就不用寫<context:annotation-config/>配置了,此外base-package為需要掃描的包(含子包)。
註解
@Service用於標註業務層組件、 @Controller用於標註控制層組件(如Struts2中的action)、@Repository用於標註數據訪問組件,即DAO組件。而@Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。
本文是建立在@Autowire註解與自動裝配的案例基礎上的。
我們首先將Spring的配置文件改為:
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:component-scan base-package="cn.itcast" /></beans>
一個實例
然後使用@Service註解標註PersonServiceBean類,如下:
@Servicepublic class PersonServiceBean implements PersonService { private PersonDao personDao; public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Override public void save() { personDao.add(); }}使用@Repository註解標註PersonDaoBean類,如下:
@Repositorypublic class PersonDaoBean implements PersonDao { @Override public void add() { System.out.println("執行PersonDaoBean中的add()方法"); }}最後,我們修改SpringTest類的代碼為:
public class SpringTest { @Test public void instanceSpring() { AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); PersonService personService = (PersonService) ctx.getBean("personServiceBean"); PersonDao personDao = (PersonDao) ctx.getBean("personDaoBean"); System.out.println(personService); System.out.println(personDao); ctx.close(); }}測試instanceSpring()方法,可看到Eclipse控制台打印:
如果我們想使用按指定名稱獲取,可將PersonServiceBean類的代碼修改為:
@Service("personService")public class PersonServiceBean implements PersonService { private PersonDao personDao; public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Override public void save() { personDao.add(); }}這樣,SpringTest類的代碼應改為:
public class SpringTest { @Test public void instanceSpring() { AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); PersonService personService = (PersonService) ctx.getBean("personService"); System.out.println(personService); ctx.close(); }}測試instanceSpring()方法,可看到Eclipse控制台打印:
我們前面學過Spring管理的bean的作用域,我們就能知道以上Spring管理的兩個bean的作用域默認是singleton。當然了,我們也可以更改Spring管理的bean的作用域,如將PersonServiceBean類的代碼改為:
@Service("personService") @Scope("prototype")public class PersonServiceBean implements PersonService { private PersonDao personDao; public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Override public void save() { personDao.add(); }}意味著Spring管理的PersonServiceBean這個bean的作用域變成prototype了,這時我們將SpringTest類的代碼修改為:
public class SpringTest { @Test public void instanceSpring() { AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); PersonService personService1 = (PersonService) ctx.getBean("personService"); PersonService personService2 = (PersonService) ctx.getBean("personService"); System.out.println(personService1 == personService2); ctx.close(); }}測試instanceSpring()方法,可看到Eclipse控制台打印:
prototype作用域本來就意味著每次從Spring容器獲取bean都是新的對象嘛。
若是通過在classpath路徑下自動掃描方這種式把組件納入Spring容器中管理,如何指定bean的初始化方法和銷毀方法呢?這時我們就需要用到兩個註解:@PostConstruct和@PreDestroy。為了試驗,我們將PersonServiceBean類的代碼修改為:
@Service("personService")public class PersonServiceBean implements PersonService { private PersonDao personDao; @PostConstruct public void init() { System.out.println("初始化資源"); } @PreDestroy public void destroy() { System.out.println("銷毀、關閉資源"); } public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Override public void save() { personDao.add(); }}接下來還要將SpringTest類的代碼修改為:
public class SpringTest { @Test public void instanceSpring() { AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); PersonService personService = (PersonService) ctx.getBean("personService"); ctx.close(); }}這樣,測試instanceSpring()方法,Eclipse控制台會打印:
如要查看源碼,可點擊讓Spring自動掃描和管理Bean進行下載。
總結
以上所述是小編給大家介紹的spring自動掃描包,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!