spring 配置掃描多個(gè)包,有時(shí)候我們希望不同功能類型的包放在不同的包下,這就需要
1
2
3
|
<!-- 自動(dòng)掃描該包,使 SpringMVC 為包下用了@controller注解的類是控制器 --> < context:component-scan base-package = "com.weixiao.ssmcleardb.controller" /> < context:component-scan base-package = "com.weixiao.listener" /> |
有時(shí)候我們可能遇到奇怪的問(wèn)題,
新建了一個(gè)包,在這個(gè)包下面新建了一個(gè)類,也添加了注解,但啟動(dòng)的時(shí)候就是掃描不到,而其它的類又正常!
這就是你新建的包沒(méi)有配置為自動(dòng)掃描的原因。
比如我在 com.weixiao.listener 包下新建的一個(gè)類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package com.weixiao.listener; import javax.servlet.ServletContext; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; import org.springframework.web.context.ServletContextAware; @Component ( "StartupListener" ) public class StartupListener implements ApplicationContextAware, ServletContextAware, InitializingBean, ApplicationListener<ContextRefreshedEvent> { protected Logger logger = LogManager.getLogger(getClass()); @Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { logger.info( "\r\n\r\n\r\n\r\n1 => StartupListener.setApplicationContext" ); } @Override public void setServletContext(ServletContext context) { logger.info( "\r\n\r\n\r\n\r\n2 => StartupListener.setServletContext" ); } @Override public void afterPropertiesSet() throws Exception { logger.info( "\r\n\r\n\r\n\r\n3 => StartupListener.afterPropertiesSet" ); } @Override public void onApplicationEvent(ContextRefreshedEvent event) { logger.info( "\r\n\r\n\r\n\r\n4.1 => MyApplicationListener.onApplicationEvent" ); logger.info( "\r\n\r\n\r\n\r\n4.1 => " + event.getApplicationContext().getParent()); logger.info( "\r\n\r\n\r\n\r\n4.1 => " + event.getApplicationContext().getDisplayName()); if (event.getApplicationContext().getParent() == null ) { logger.info( "\r\n\r\n\r\n\r\n4.2 => MyApplicationListener.onApplicationEvent" ); } else { logger.info( "\r\n\r\n\r\n\r\n4.4 => " + event.getApplicationContext().getParent().getDisplayName()); } if (event.getApplicationContext().getDisplayName().equals( "Root WebApplicationContext" )){ logger.info( "\r\n\r\n\r\n\r\n4.3 => MyApplicationListener.onApplicationEvent" ); } } } |
關(guān)于 component-scan,我們來(lái)看 spring framework 開(kāi)發(fā)手冊(cè)中的一段話:
1
|
Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。@Component是所有受Spring管理組件的通用形式;而@Repository、@Service和 @Controller則是@Component的細(xì)化,用來(lái)表示更具體的用例(例如,分別對(duì)應(yīng)了持久化層、服務(wù)層和表現(xiàn)層)。也就是說(shuō),你能用@Component來(lái)注解你的組件類,但如果用@Repository、@Service 或@Controller來(lái)注解它們,你的類也許能更好地被工具處理,或與切面進(jìn)行關(guān)聯(lián)。例如,這些典型化注解可以成為理想的切入點(diǎn)目標(biāo)。當(dāng)然,在Spring Framework以后的版本中, @Repository、@Service和 @Controller也許還能攜帶更多語(yǔ)義。如此一來(lái),如果你正在考慮服務(wù)層中是該用@Component還是@Service,那@Service顯然是更好的選擇。同樣的,就像前面說(shuō)的那樣, @Repository已經(jīng)能在持久化層中進(jìn)行異常轉(zhuǎn)換時(shí)被作為標(biāo)記使用了。” |
總結(jié)
以上就是本文關(guān)于spring配置掃描多個(gè)包問(wèn)題解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。
原文鏈接:http://blog.csdn.net/testcs_dn/article/details/78115603