詳解spring自動(dòng)掃描包
配置文件
前面的例子我們都是使用XML的bean定義來配置組件。在一個(gè)稍大的項(xiàng)目中,通常會(huì)有上百個(gè)組件,如果這些組件采用XML的bean定義來配置,顯然會(huì)增加配置文件的體積,查找及維護(hù)起來也不太方便。
Spring2.5為我們引入了組件自動(dòng)掃描機(jī)制,它可以在類路徑底下尋找標(biāo)注了@Component、@Service、@Controller、@Repository注解的類,并把這些類納入進(jìn)Spring容器中管理。
它的作用和在XML文件中使用bean節(jié)點(diǎn)配置組件是一樣的。要使用自動(dòng)掃描機(jī)制,我們需要打開以下配置信息:
<?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" />
這個(gè)配置隱式注冊(cè)了多個(gè)對(duì)注解進(jìn)行解析處理的處理器,包括<context:annotation-config/>該配置注冊(cè)的處理器,也就是說寫了<context:component-scan base-package="cn.itcast" />
配置,就不用寫<context:annotation-config/>
配置了,此外base-package為需要掃描的包(含子包)。
注解
@Service用于標(biāo)注業(yè)務(wù)層組件、 @Controller用于標(biāo)注控制層組件(如Struts2中的action)、@Repository用于標(biāo)注數(shù)據(jù)訪問組件,即DAO組件。而@Component泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。
本文是建立在@Autowire注解與自動(dòng)裝配的案例基礎(chǔ)上的。
我們首先將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>
一個(gè)實(shí)例
然后使用@Service注解標(biāo)注PersonServiceBean類,如下:
@Service public class PersonServiceBean implements PersonService { private PersonDao personDao; public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Override public void save() { personDao.add(); } }
使用@Repository注解標(biāo)注PersonDaoBean類,如下:
@Repository public class PersonDaoBean implements PersonDao { @Override public void add() { System.out.println("執(zhí)行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(); } }
測(cè)試instanceSpring()方法,可看到Eclipse控制臺(tái)打?。?/p>
如果我們想使用按指定名稱獲取,可將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類的代碼應(yīng)改為:
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(); } }
測(cè)試instanceSpring()方法,可看到Eclipse控制臺(tái)打?。?/p>
我們前面學(xué)過Spring管理的bean的作用域,我們就能知道以上Spring管理的兩個(gè)bean的作用域默認(rèn)是singleton。當(dāng)然了,我們也可以更改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這個(gè)bean的作用域變成prototype了,這時(shí)我們將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(); } }
測(cè)試instanceSpring()方法,可看到Eclipse控制臺(tái)打?。?/p>
prototype作用域本來就意味著每次從Spring容器獲取bean都是新的對(duì)象嘛。
若是通過在classpath路徑下自動(dòng)掃描方這種式把組件納入Spring容器中管理,如何指定bean的初始化方法和銷毀方法呢?這時(shí)我們就需要用到兩個(gè)注解:@PostConstruct和@PreDestroy。為了試驗(yàn),我們將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("銷毀、關(guān)閉資源"); } 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(); } }
這樣,測(cè)試instanceSpring()方法,Eclipse控制臺(tái)會(huì)打?。?/p>
如要查看源碼,可點(diǎn)擊讓Spring自動(dòng)掃描和管理Bean進(jìn)行下載。
總結(jié)
以上所述是小編給大家介紹的spring自動(dòng)掃描包,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
java構(gòu)建Stream流的多種方式總結(jié)
Java?8引入了Stream流作為一項(xiàng)新的特性,它是用來處理集合數(shù)據(jù)的一種函數(shù)式編程方式,本文為大家整理了多種java構(gòu)建Stream流的方式,希望對(duì)大家有所幫助2023-11-11Spring Boot 多個(gè)定時(shí)器沖突問題的解決方法
這篇文章主要介紹了Spring Boot 多個(gè)定時(shí)器沖突問題的解決方法,實(shí)際開發(fā)中定時(shí)器需要解決多個(gè)定時(shí)器同時(shí)并發(fā)的問題,也要解決定時(shí)器之間的沖突問題,本文通過問題場(chǎng)景重現(xiàn)給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-05-05SpringBoot+Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
這篇文章主要為大家詳細(xì)介紹了springBoot+Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Java 中的Printstream介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
PrintStream 是打印輸出流,它繼承于FilterOutputStream。接下來通過本文給大家介紹Java 中的Printstream,需要的朋友參考下吧2017-05-05關(guān)于idea剛打開時(shí)瘋狂報(bào)錯(cuò)的問題
這篇文章主要介紹了關(guān)于idea剛打開時(shí)瘋狂報(bào)錯(cuò)的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04使用System.exit()來優(yōu)雅地終止SpringBoot項(xiàng)目的代碼示例
System.exit() 方法是 Java 中用于退出程序的方法,它接受一個(gè)整數(shù)參數(shù),通常被用來指示程序的退出狀態(tài),本文給大家介紹了如何使用System.exit()來優(yōu)雅地終止SpringBoot項(xiàng)目,需要的朋友可以參考下2024-08-08