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. 源自于NEO的KeyValue 数据库面世啦

    虽然想把标题取得大一点,但终究不是什么太大不了的工作,还是安分守己的开始介绍吧.   项目组成   这个项目叫做LightDB 由三个部分构成 Lightdb.lib 是对rocksdb做了一层封装, ...

  2. matplotlia应用

    一.简单使用 使用函数 plt.polt(x,y,label,color,width) 根据x,y 数组 绘制直,曲线 import numpy as np #引用numpy库,从新命名它为np(以后 ...

  3. go http

    先看一个简单的 tcp 连接: // server ln, err := net.Listen("tcp", ":8000") if err != nil {} ...

  4. vijos搭建踩坑

    nodejs我用的8.x版本,可以工作. 和制作组交谈之后他们说最好榨汁机和主机不要在同一系统下. vj4/vj4/handler/base.py的第343行 从 super(Connection, ...

  5. Win 10 Revit 2019 安装过程,亲自踩的一遍坑,有你想要的细节

    首先就是安装吖,不管是管理员权限还是普通权限,都是以下这个问题,跟权限没关系 failed to load .....revitcontentpackui.dll (126) 尝试了网上能查到的各种方 ...

  6. dedecms 后台可以上传mp4,但无法选择

    原文链接 找到 /include/dialog/select_media.php 找到rmvb,在其后面加 “|mp4” 即可. 1

  7. dedecms给图片加水印覆盖整张图片

    位置: /include/image.class.php $wmwidth = $imagewidth - $logowidth; $wmheight = $imageheight - $logohe ...

  8. win10上使用Xshell通过ssh连接Linux

    Windows 10上现在能安装Linux子系统了,正好最近.Net Core也逐渐发展起来了,我也就在自己电脑上搞了一下 在Windows 10上安装Ubuntu的过程就不用说了,都是流程性的东西 ...

  9. 在C++中,setw(int n)

    setw(int n)用来控制输出间隔例如:cout<<'s'<<setw(8)<<'a'<<endl;则在屏幕显示s        a //s与a之间 ...

  10. 面试作业之浅析京东促销活动核心模型 - DDD

    前言 京东作为中国最大的自营式B2C电商平台,提供一站式综合性购物,服务亿万家庭,涵盖3C.家电.消费品.服饰.家居家装.生鲜和新通路(B2B),满足了消费者的多元化需求.每天都会发布相关的促销活动, ...