<context:component-scan>
<context:component-scan>:扫描指定包,如果发现有指定注解,那么该类将由Spring进行管理。
举例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.zhangpn.componentScan; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.stereotype.Component; 5 6 @Component("user") 7 public class User { 8 9 @Value(value = "1") 10 private String id; 11 12 @Value(value = "zhangpn") 13 private String name; 14 15 public String getId() { 16 return id; 17 } 18 19 public void setId(String id) { 20 this.id = id; 21 } 22 23 public String getName() { 24 return name; 25 } 26 27 public void setName(String name) { 28 this.name = name; 29 } 30 31 @Override 32 public String toString() { 33 return "User [id=" + id + ", name=" + name + "]"; 34 } 35 36 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.zhangpn.componentScanS; 2 3 import javax.annotation.Resource; 4 5 import org.springframework.stereotype.Component; 6 7 import com.zhangpn.componentScan.User; 8 9 @Component("person") 10 public class Person { 11 12 @Resource(name = "user") 13 private User user; 14 15 public User getUser() { 16 return user; 17 } 18 19 public void setUser(User user) { 20 this.user = user; 21 } 22 23 @Override 24 public String toString() { 25 return "Person [user=" + user + "]"; 26 } 27 28 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 6 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 7 8 </beans>
由componentScan.xml可知,我们忘记了写<context:component-scan>标签,也就是没有开启注解扫描。此时,执行一个测试方法会出现什么结果呢?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.zhangpn.componentScanTest; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 import com.zhangpn.componentScanS.Person; 7 8 public class Main { 9 10 public static void main(String[] args) { 11 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("componentScan.xml"); 12 Person person = (Person) applicationContext.getBean("person"); 13 System.out.println(person); 14 } 15 16 }
测试结果显示:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 六月 11, 2018 9:36:46 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 2 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@179d3b25: startup date [Mon Jun 11 09:36:46 CST 2018]; root of context hierarchy 3 六月 11, 2018 9:36:46 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 4 信息: Loading XML bean definitions from class path resource [componentScan.xml] 5 Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'person' available 6 at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:680) 7 at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1183) 8 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284) 9 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 10 at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) 11 at com.zhangpn.componentScanTest.Main.main(Main.java:12)
抛出了org.springframework.beans.factory.NoSuchBeanDefinitionException异常,意思就是No bean named 'person' available不能获得一个名字叫'person'的bean,可以得出,componentScan.xml加载后,并没有扫描到我们想得到的类。
接下来,我们把<context:component-scan>标签加上
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 6 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 7 <context:component-scan base-package="com.zhangpn.*"></context:component-scan> 8 </beans>
base-package="com.zhangpn.*" 意思扫描com.zhangpn包以及子包,再次测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 六月 11, 2018 9:45:03 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 2 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@179d3b25: startup date [Mon Jun 11 09:45:03 CST 2018]; root of context hierarchy 3 六月 11, 2018 9:45:03 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 4 信息: Loading XML bean definitions from class path resource [componentScan.xml] 5 Person [user=User [id=1, name=zhangpn]]
由结果可以得到:这样就是我们想要的结果。
由标签<context:component-scan base-package="com.zhangpn.*"></context:component-scan>可以看出:com.zhangpn.* 其中“ * ”代表匹配com.zhangpn下任意子包。
也可以这样表示:
<context:component-scan base-package="com.zhangpn.componentScan,com.zhangpn.componentScanS"></context:component-scan>
把每一个包都表示出来。
<context:component-scan base-package="com.zhangpn.componentScan"></context:component-scan> <context:component-scan base-package="com.zhangpn.componentScanS"></context:component-scan>
说明: “ * ” 匹配:例如 "com.zhangpn.*"表示,以“com.zhangpn.”开头的包都会被Spring扫描到
<context:component-scan base-package="*"></context:component-scan>
以上标签表示扫描所有的包。
凝一眸碧水,拈一缕清风,于一怀静谧中倾听凡尘的落音。
不再奢求什么,做简单的自己,过简单的生活,心在,梦在,你在,便是光阴赐予我的最美。