通过类扫描注入到容器中,这种方式,在实际开发中还是很常用的,可以看下自己的配置文件,就会发现,自己公司的项目,搞不好就是这么注入的。
起码,我发现我公司的项目就是这么干的。
下面来演示一下简单的例子:
此例子和上一篇的差别很微弱,相比较而言,就是在xml配置文件里面的配置又变得少了。
关于要注入到容器的bean,不用自己一个个的去写,省去了很多的重复的步骤。简化了操作。
当然我说这么多,你不看看我前面的几篇文章,不亲自实现一下,是不太明朗的。当然你要是了解这个的话,我就显得关公门前耍大刀啦。
附上,上一篇的链接,如下:

配置文件相对简单了一点的spiring注解使用的简单例子

然后再上这次的测试代码:

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.FileSystemXmlApplicationContext; 
import org.springframework.stereotype.Component; 
 
import javax.annotation.Resource; 
 
/** 
 * @Component 等价于 <bean id="student" class="..Student"> 
 */ 
@Component("sb") 
class Student { 
    void say() { 
        System.out.println("student"); 
    } 
} 
 
/** 
 * @Component 等价于 <bean id="person" class="..Person"> 
 * @Component("p") 等价于 <bean id="p" class="..Person"> 
 */ 
@Component("p") 
class Person { 
    //Student类的@Component("sb")注解带有value值sb,所以bean的ID就相当于是sb 
    //所以下面的@Resource(name = "sb")或者@Resource都是可以正确执行的。 
    @Resource(name = "sb") 
    private Student student; 
 
    void say() { 
        this.student.say(); 
    } 
} 
 
/** 
 * Created by lxk on 2016/9/30 
 */ 
class AtInterfaceTest { 
    public static void main(String[] args) { 
        //ApplicationContext ctx = new ClassPathXmlApplicationContext("file:E:/fusion/intellij_work/TrunkNew/sss.xml"); 
        //ApplicationContext ctx = new FileSystemXmlApplicationContext("src/sss.xml");//这个时候sss.xml是在项目的根目录下的src文件夹下 
        ApplicationContext ctx = new FileSystemXmlApplicationContext("sss.xml");//这个时候sss.xml是在项目的根目录下 
        Person p = (Person) ctx.getBean("p");//Person类的@Component("p")带有value值,所以bean的ID就相当于改啦 
        p.say(); 
    } 
}


然后是对应的配置文件,如下:

<?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-2.5.xsd"> 
 
    <context:component-scan base-package="com.xxx.x.model.s"/> 
</beans>


也能达到,测试的效果。

具体有如下总结:

   		原理: 
   		   *  类扫描的注解解析器包含了---依赖注入---的注解解析器 
   		   *  原理: 
   		       当启动spring容器的时候, 
   		       ApplicationContext context = new FileSystemXmlApplicationContext("sss.xml"); 
   		       spring容器会加载配置文件,并且解析配置文件,就会解析到 
   		          1*   类扫描的注解解析器,会在base-package包及子包中扫描所有的类(包括内部类,因为的测试是把所有的class放在一个class里面搞的测试) 
		   		      *  检查类上是否有@Compontent注解 
		   		         *  如果有 
		   		             *  @Compontent是否有value属性 
		   		                 *  没有value属性 
		   		                          则会把这个注解所在的类的类名的第一个字母变成小写,其余的不变当做bean的id 
		   		                 *  如果有value属性 
		   		                          则value属性的值就是bean的id 
		   		          *  如果没有 
						            do nothing 
									 
   		          2*   类扫描注解解析完以后,所有的在base-package包及子包下的带有@Compontent注解的类就被纳入spring管理了 
				   
   		          3*   在纳入spring管理的类中扫描各个属性,看属性是否有@Resource,再根据这个注解的规则进行操作。具体参考上一篇文章,在最上方有链接 
				   
                  4*   扫描的次数: 
                         *  根据base-package包及子包进行扫描 
                         *  扫描纳入spring管理的所有的bean的属性 
                         *  属性的name的值和bean中的id进行匹配

再有,关于--类扫描注解总结如下:







发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

以@Resource为例,透析注解的本质,spring中是如何使用注解的知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。