Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。

spring中bean装配有两种方式

  • 隐式的bean发现机制和自动装配
  • 在java代码或者XML中进行显示配置

当然这些方式也可以配合使用。

我们测试代码如下

CompactDisc和MediaPlayer是两个接口 其中MediaPlayer的构造方法参数类型为CompactDisc。我们主要测试CompactDisc和MediaPlayer的实现有没有注入进来,同时MediaPlayer接口对于CompactDisc的依赖有没有满足
package com.zcs;import com.zcs.service.CompactDisc;
import com.zcs.service.MediaPlayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertNotNull;@RunWith(SpringJUnit4ClassRunner.class)
//XML配置
//@ContextConfiguration(locations ="spring-config.xml")
//Java代码配置
@ContextConfiguration(classes =CDPlayerConfig.class)
public class CDPlayerTest {@Autowiredprivate CompactDisc cd;@Autowiredprivate MediaPlayer player;@Testpublic void cdShouldNotBeNull(){assertNotNull(cd);}@Testpublic void play(){assertEquals("Playing 哎呦不错哦 by 周杰伦",player.play());}}

1、自动化装配

Spring从两个角度来实现自动化装配:

组件扫描(ComponentScan):自动发现应用上下文中所创建的bean

自动装配(Autowired):自动满足bean之间的依赖

CompactDisc接口类和实现类:

public interface CompactDisc {String play();
}
@Component
public class SgtPeppers implements CompactDisc {private String title="哎呦不错哦";private String artist="周杰伦";@Overridepublic String play() {return "Playing "+title+" by "+artist;}
}

MediaPalyer接口类和实现类

public interface MediaPlayer {String play();
}
@Component
public class CDPlayer implements MediaPlayer {private CompactDisc cd ;@Autowiredpublic CDPlayer(CompactDisc cd){this.cd=cd;}@Overridepublic String play(){return cd.play();}
}

配置类CDPlayerConfig:

@Configuration
@ComponentScan
public class CDPlayerConfig {}

@ComponentScan作用是扫描带有@Component注解的类,并为其创建bean。默认是扫描同一包下的类,当然也可以加入参数,指定包名。

如@ComponentScan(basePackages={"com.zcs"})或者@ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class})(即这些类所在的包)

@Autowired满足自动依赖装配,可以作用在任何方法上面。

XML形式的自动装配则修改测试类@ContextConfiguration,改成加载spring-config.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><bean id="compactDisc" class="com.zcs.impl.SgtPeppers"></bean><bean id="cdPlayer" class="com.zcs.impl.CDPlayer"><constructor-arg ref="compactDisc"></constructor-arg></bean><context:component-scan base-package="com.zcs">
</beans>

 2、显示bean装配

当想要将第三方库中的组件装配到你的应用中,在这种情况下是没有办法在它的类上面添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案。

只能选择java代码或者xml显示配置

首先可以把两个实现类上的@Component,还有配置类中的@ComponentScan,CDPlayer类中方法上的@Autowired注解去掉。

这个时候测试应该都通不过。

Java代码方式:修改CDPlayerConfig配置类为:

@Configuration
public class CDPlayerConfig {@Beanpublic CompactDisc sgtPeppers(){return new SgtPeppers();}@Beanpublic MediaPlayer getCDPlayer(){return new CDPlayer(sgtPeppers());}
   //@Bean//public MediaPlayer getCDPlayer(CompactDisc compactDisc){//    return new CDPlayer(compactDisc);//}
}

再运行测试应该会通过了,解释下 @Bean注解告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终生成bean实列的逻辑。

第二个方法故意写的奇怪一点,看起来CompactDisc是通过调用sgtPeppers()方法得到的,但并非如此,Spring会拦截对sgtPeppers方法的调用,转而从上下文中直接获取该方法所创建的bean,而不是每次都对其进行实际的调用。

比如:再添加一个方法(测试会通不过)

   @Beanpublic MediaPlayer anotherCDPlayer() {return new CDPlayer(sgtPeppers());}

这两个方法依赖注入的CompactDisc将会是同一个bean。

当然通过情况下用注释的方法更容易理解一点。

XML方式:

首先CDPlayerTest为XML方式,同时修改spring-config.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><bean id="compactDisc" class="com.zcs.impl.SgtPeppers"></bean><bean id="cdPlayer" class="com.zcs.impl.CDPlayer"><constructor-arg ref="compactDisc"></constructor-arg>
    </bean><context:component-scan base-package="com.zcs"/>
</beans>

组件扫描方式的配置不去掉也是没影响的。

补充:

复杂一点的构造方法

修改SgtPeppers的构造方法

public class SgtPeppers implements CompactDisc {private String title="哎呦不错哦";private String artist="周杰伦";private List<String> tracks=new ArrayList<>();public SgtPeppers(String title, String artist, List<String> tracks) {this.title = title;this.artist = artist;this.tracks = tracks;}@Overridepublic String play() {return "Playing "+title+" by "+artist;}
}

同时修改spring-config.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><bean id="compactDisc" class="com.zcs.impl.SgtPeppers"><constructor-arg index="0" value="雪狼湖"/><constructor-arg index="1" value="张学友"/><constructor-arg index="2"><list><value>不老的传说</value><value>爱是永恒</value></list></constructor-arg></bean><bean id="cdPlayer" class="com.zcs.impl.CDPlayer"><constructor-arg ref="compactDisc"></constructor-arg></bean><context:component-scan base-package="com.zcs"/>
</beans>

还有属性注入<property>,c和p命名空间使用就不细说了。对于xml的配置一般在java代码中也会有对应的配置。但显示配置用java代码会类型安全一点

参考:spring实战第4版

转载于:https://www.cnblogs.com/zuochengsi-9/p/9047111.html

spring Bean装配的几种方式简单介绍相关推荐

  1. Spring实现AOP的4种方式

    Spring实现AOP的4种方式 先了解AOP的相关术语: 1.通知(Advice): 通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作. 2.连接点(Joinpoint ...

  2. 获取Spring的ApplicationContext的几种方式

    转载自 获取Spring的ApplicationContext的几种方式 Application Context定义 简单来说就是Spring中的高级容器,可以获取容器中的各种bean组件,注册监听事 ...

  3. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...

  4. Spring Bean装配(上)

    Bean:在spring的IOC里面,把配置到IOC容器里面的实体或者是对象都称为Bean Bean配置项 Bean的作用域 Bean的生命周期 Bean的自动装配 Resources&Res ...

  5. Spring事务配置的五种方式 说明

    Spring事务配置的五种方式  [转 http://blog.csdn.net/hjm4702192/article/details/17277669] Spring配置文件中关于事务配置总是由三个 ...

  6. 配置spring事务管理的几种方式(声明式事务)

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  7. spring配置属性的两种方式

    spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...

  8. Spring属性注入的三种方式(超详细)

    属性注入的三种方式 使用set方法进行注入 使用有参构造函数进行注入 使用p名称空间注入 首先了解下面两个名词的含义: IOC:控制反转(Inversion of Control,缩写为IoC),是面 ...

  9. Spring循环依赖的三种方式以及解决办法

    Spring循环依赖的三种方式以及解决办法 [转]https://www.cnblogs.com/liuqing576598117/p/11227007.html 示例 https://github. ...

最新文章

  1. SSH学习笔记(一)
  2. Velocity的layout功能
  3. SpringBoot RabbitMQ 延迟队列代码实现
  4. [YTU]_2718 (求最高同学位置)
  5. Qt之自定义界面(窗体缩放)
  6. leetcode1471. 数组中的 k 个最强值(排序)
  7. SQL LIKE 操作符
  8. Java Maven项目打包成可执行jar文件
  9. 图解HTTPS协议加密解密全过程
  10. 【故障分析】基于主成分分析实现三容水箱故障诊断附matlab代码
  11. 交叉熵、KL散度、Jeffery分歧、JS散度
  12. The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals
  13. 软考-软件设计师 UML建模
  14. 按键精灵——电脑永不熄屏
  15. Android车载蓝牙相关开发2:蓝牙总入口BluetoothAdapter
  16. VC无负担实现XP风格界面(转)
  17. SpringCloudStream整合Kafka,解决两个通道对应同一个topic报错问题。
  18. Java中System.exit()方法的功能简介说明
  19. 【uniapp】支付宝小程序蓝牙绑定步骤兼容ios蓝牙连接,并报 10017 写入特征值失败解决方案
  20. html自动分行工具,自动HTML简化工具?

热门文章

  1. 面向对象高级(内部类)
  2. 三剑客grep sed awk
  3. stripslashes — 反引用一个引用字符串
  4. 小白易学--ps钢笔工具抠图教程-大长腿抠图
  5. Docker学习记录(三):配置 Docker 加速器:使用阿里云镜像仓库
  6. 联发科Helio X30信息曝光 十核大杀器再升级!
  7. docker+Locust+Prometheus+Grafana实现性能监控平台
  8. 博客数据库编写 [木字楠博客]
  9. vue重构html css,使用vue重构资讯页面的实例代码解析
  10. 基于QT实现B树可视化程序设计