component-scan自动扫描注册装配

本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7717331.html

解决问题

通过component-scan自动扫描将业务逻辑bean注册到spring容器中,去除XML配置文件bean手动注册过程,降低XML配置文件繁琐性;

内容说明

1、注册扫描bean并使用@Autowired注解自动装配时,需在XML配置文件中引入 <context:component-scan base-package="com.spring.example.scan"/>;

2、通过component-scan自动扫描定义基类包下所有bean,需要在类名前加入注解@Component,并且可以自定义bean的id<@Component("instru")>,

如果没有定义bean的id就默认类名(全部小写),将扫描的bean装入spring容器;

3、 在spring容器启动后(获取到spring容器的实例),通过Autowired注解以及bean的id(Qualifier)来装配和注入相应的实例对象;

4、 调用实例方法;

应用实例(包名:com.spring.example.scan)

spring配置文件component-scan.xml如下

<?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.xsd"> <!--自动扫描检测bean以及定义bean,并将bean放入spring容器-->
<context:component-scan base-package="com.spring.example.scan"/> </beans>

Instrument接口代码

public interface Instrument {
void play();
}

Guitar实现接口Instrument代码

@Component
public class Guitar implements Instrument {
@Override
public void play() {
System.out.println("Guitar....");
}
}

Performer接口代码

public interface Performer {

    void perform();
}

Instrumentalist实现接口Performer代码

@Component("instru") //指定bean id
public class Instrumentalist implements Performer { public Instrumentalist(){} @Value("Yesterday Once more !")
private String song; // @Autowired 可以装配属性、方法、构造函数,只要类型相同(这里是Instrument类型)
// 限定歧义性的依赖,使用@Autowired注解自动装配,满足装配的多个bean,
// 可以通过@Qualifier指定来缩小范围
@Autowired
@Qualifier("guitar") //通过id指定bean
private Instrument instrument; public void setSong(String song) {
this.song = song;
} public void setInstrument(Instrument instrument){
this.instrument = instrument ;
} @Override
public void perform() {
System.out.println("Playing "+ song + " : ");
instrument.play();
} }

测试代码

public class Driver extends Application {

    public static void main(String[] args) {
launch(args);
} @Override
public void start(Stage primaryStage) {
try { ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/component-scan.xml"); Performer performer = (Performer) ctx.getBean("instru");
performer.perform(); }catch (Exception e){
e.printStackTrace();
}
}
}

运行结果

总结

component-scan自动扫描优缺点:

优点: a> component-scan自动扫描注册装配可以有效解决annotation-config的不足,不需要在spring配置文件中需提前指明bean,使配置文件非常简洁;

b>  去除在XML定义bean的过程,在应用程序中直接装配和注入,减少更改类名实导致的错误;

缺点: 不能自动获取第三方接口实例bean;

应用场景

适用于自身业务逻辑开发;

本文描述可能有不对或不全之处,欢迎大家吐槽!

不要让懒惰占据你的大脑,不要让妥协拖垮你的人生。青春就是一张票,能不能赶上时代的快车,你的步伐掌握在你的脚下。

spring框架应用系列二:component-scan自动扫描注册装配的更多相关文章

  1. spring框架应用系列三:切面编程(带参数)

    本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7786715.html 解决问题 1.分离业务监控与业务处理.简单点 ...

  2. [ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)

    一.Spring的Bean管理(注解方式) 1.1 什么是注解 要使用注解方式实现Spring的Bean管理,首先要明白什么是注解.通俗地讲,注解就是代码里的特殊标记,使用注解可以完成相应功能. 注解 ...

  3. Spring Boot进阶系列二

    上一篇文章,主要分析了怎么建立一个Restful web service,系列二主要创建一个H5静态页面使用ajax请求数据,功能主要有添加一本书,请求所有书并且按照Id降序排列,以及查看,删除一本书 ...

  4. Spring源码系列(二)--bean组件的源码分析

    简介 spring-bean 组件是 Spring IoC 的核心,我们可以使用它的 beanFactory 来获取所需的对象,对象的实例化.属性装配和初始化等都可以交给 spring 来管理. 本文 ...

  5. spring框架学习(二)依赖注入

    spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.接口注入不作要求,下面介绍前两种方式. 1,set注入 采用属性的set方法进行初始化,就成为set注入. 1)给普 ...

  6. spring cloud 入门系列二:使用Eureka 进行服务治理

    服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Cloud Netflix 微服务套件的一部分 ...

  7. 保姆教程系列二、Nacos实现注册中心

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 上篇我们介绍到  保姆教程系列一.Linux搭建Nacos 注册中心原理 一.环境准备 Java版本:1.8+   (Linux ce ...

  8. (转) Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数(转)

    在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 在 Spring JDBC 框架中, 绑定 ...

  9. spring框架应用系列四:切面编程(环绕通知与前后置通知区别)

    切面编程(环绕通知与前后置通知区别) 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7867034.html 解决问 ...

随机推荐

  1. vs中 VMDebugger未能加载导致异常

    ,纠结了许久的一个问题,终于找到了解决 vs中 VMDebugger未能加载导致异常 错误号:80004005 搜了好多,没有一个给出完美的答案.   解决办法:工具->导入和导出设置,重置一下 ...

  2. Java 基础 JRE和JDK的区别

    JRE(Java Runtime Environment,Java运行时环境)是Java程序运行所需的软件环境,包含Java虚拟机和Java基础类库. JDK(Java Development Kit ...

  3. Vue(三十三)国际化解决方案

    摘自:https://blog.csdn.net/qq_41485414/article/details/81093999 (1)第一种方式:中英文两套页面 优点:技术含量最低 缺点:占内存,响应慢, ...

  4. Vue(三十)公共组件

    以 分页 组件为例:(根据自己具体业务编写) 1.pagination.vue <template> <!-- 分页 --> <div class="table ...

  5. RabbitMQ 官方demo1

    public class RabbitMqSend { public static void Test() { var factory = new ConnectionFactory() { Host ...

  6. hive-issue-inserting-records-to-partitioned-table

    hive-issue-inserting-records-to-partitioned-table Hi Sam, Recently we upgraded our cluster from HDP2 ...

  7. Python连接MySQL数据库之pymysql模块使用

    安装PyMySQL pip install pymysql PyMySQL介绍 PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库,2中则使用mysqldb. Django中也 ...

  8. libguestfs手册(3): virt命令

    guestmount root# guestmount -a ubuntutest1.img -m /dev/sda1 ubuntutestp1 root# cd ubuntutestp1/root: ...

  9. Swift 对象内存模型探究(一)

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/zIkB9KnAt1YPWGOOwyqY3Q 作者:王 ...

  10. 大数据BI框架知识点备注

    将这段时间的一些基于大数据方案的BI知识点暂时做些规整,可能还存在较多问题,后续逐步完善修改. 数据模型: 1.星型模型和雪花模型,同样是将业务表拆分成事实表和纬度表:例如一个员工数据表,可以拆分为员 ...