<context:component-scan>

<context:component-scan>:扫描指定包,如果发现有指定注解,那么该类将由Spring进行管理。

举例子:

 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 }
一个简单的User类
 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 }
一个简单的Person类
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>
Spring配置文件:componentScan.xml

由componentScan.xml可知,我们忘记了写<context:component-scan>标签,也就是没有开启注解扫描。此时,执行一个测试方法会出现什么结果呢?

 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 }
Main函数测试

测试结果显示:

 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>标签加上

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>
修改后的componentScan.xml文件

base-package="com.zhangpn.*" 意思扫描com.zhangpn包以及子包,再次测试:

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>

以上标签表示扫描所有的包。

 

posted @ 2018-06-11 10:54  呦,可以呦  阅读(6418)  评论(0编辑  收藏  举报