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

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

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

---------------------

本文来自 李学凯 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_27093465/article/details/52710925?utm_source=copy

  •  
    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>

也能达到,测试的效果。

具体有如下总结:

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

--------------------- 本文来自 李学凯 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_27093465/article/details/52710925?utm_source=copy

spring类扫描注入-----类扫描的注解解析器的更多相关文章

  1. 深刻剖析spring三种注入方式以及使用注解的原理

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  2. Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器

    aop-Aspect Oriented Programming,面向切面编程.根据百度百科的解释,其通过预编译方式和运行期动态代理实现程序功能的一种技术.主要目的是为了程序间的解耦,常用于日志记录.事 ...

  3. SpringMVC源码情操陶冶-AnnotationDrivenBeanDefinitionParser注解解析器

    mvc:annotation-driven节点的解析器,是springmvc的核心解析器 官方注释 Open Declaration org.springframework.web.servlet.c ...

  4. spring beans源码解读之--bean definiton解析器

    spring提供了有两种方式的bean definition解析器:PropertiesBeanDefinitionReader和XmLBeanDefinitionReader即属性文件格式的bean ...

  5. 【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】

    一.使用注解的DI实现 1.@Resource 使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值.一般使用@Resource(name="student& ...

  6. 这一次搞懂Spring自定义标签以及注解解析原理

    前言 在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如何解析的.同时我们常用的注解如:@Se ...

  7. spring的三种注解管理器

    1.依赖注入的注解解析器 在配置文件中; * xsd xmlns:context="http://www.springframework.org/schema/context" h ...

  8. Spring笔记(5) - 声明式事务@EnableTransactionManagement注解源码分析

    一.背景 前面详解了实现Spring事务的两种方式的不同实现:编程式事务和声明式事务,对于配置都使用到了xml配置,今天介绍Spring事务的注解开发,例如下面例子: 配置类:注册数据源.JDBC模板 ...

  9. Spring 缓存注解解析过程

    Spring 缓存注解解析过程 通过 SpringCacheAnnotationParser 的 parseCacheAnnotations 方法解析指定方法或类上的缓存注解, @Cacheable ...

随机推荐

  1. abp ueditor 多图以及文件无法上传

    abp .net core使用ueditor遇到的问题:多图和上传文件无法上传,提示“http://请求错误”. 400 bad request解决办法: 因为abp默认启用了ValidateAnti ...

  2. 实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎

    实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎 Programmatic Framework™ 传漾程序化购买框架

  3. ssh登录时不校验被登录机器的方法

    在linux的用户目录下的.ssh文件下,touch config:注意config的权限控制,-rw-r--r--. 配置内容: cat config: Host * StrictHostKeyCh ...

  4. jquery的ajax的success和fail用法

    $.ajax({ type:"POST", url: url, contentType: 'application/json;charset=utf-8', data: JSON. ...

  5. LINUX下GDB反汇编和调试

    Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数.而Windows下却是相反. 1. 基本操作指令 简单的操作数类型说明.一般有三种. (1)马上数操作数 ...

  6. source insight的查找功能

    source insight是一款非常好的c语言的程序编辑器.方便对project管理,方便程序的阅读和编辑. 查找功能使用十分频繁.选项较多,与其他软件的查找功能也类似,以下对英文版的查找功能,做简 ...

  7. 自己定义一个Dialog样式的Activity窗体,切换到Dialog的方法

    首先定义一个style 在style里面加入 <style name="MyDialog" parent="@android:Theme.Dialog"& ...

  8. git操作-如何把你的本地仓库放到GitHub已有仓库

    本地: 首先在你的本地git init 初始化一个仓库,然后git add . 将所有的文件都打包到仓库中,git -commit -m "first_commit" 此时是没有什 ...

  9. 前端自动化工具 gulp

    最近一个项目才接触这些自动化工具 webpack gulp grunt 等等.. webpack 可以引入模块 和 压缩 gulp 和 grunt 可以压缩 这里只说下gulp  因为项目里只用到gu ...

  10. java gc小结

    java的内存结构: 1. 堆: java所有通过new新建的对象都是在堆上进行分配的; 根据不同的垃圾回收算法, 堆的结构也不相同, 如果采用的是分代垃圾回收, 那么堆就分为年轻代和年老代两部分. ...