spring Bean装配的几种方式简单介绍
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装配的几种方式简单介绍相关推荐
- Spring实现AOP的4种方式
Spring实现AOP的4种方式 先了解AOP的相关术语: 1.通知(Advice): 通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作. 2.连接点(Joinpoint ...
- 获取Spring的ApplicationContext的几种方式
转载自 获取Spring的ApplicationContext的几种方式 Application Context定义 简单来说就是Spring中的高级容器,可以获取容器中的各种bean组件,注册监听事 ...
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...
- Spring Bean装配(上)
Bean:在spring的IOC里面,把配置到IOC容器里面的实体或者是对象都称为Bean Bean配置项 Bean的作用域 Bean的生命周期 Bean的自动装配 Resources&Res ...
- Spring事务配置的五种方式 说明
Spring事务配置的五种方式 [转 http://blog.csdn.net/hjm4702192/article/details/17277669] Spring配置文件中关于事务配置总是由三个 ...
- 配置spring事务管理的几种方式(声明式事务)
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...
- spring配置属性的两种方式
spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...
- Spring属性注入的三种方式(超详细)
属性注入的三种方式 使用set方法进行注入 使用有参构造函数进行注入 使用p名称空间注入 首先了解下面两个名词的含义: IOC:控制反转(Inversion of Control,缩写为IoC),是面 ...
- Spring循环依赖的三种方式以及解决办法
Spring循环依赖的三种方式以及解决办法 [转]https://www.cnblogs.com/liuqing576598117/p/11227007.html 示例 https://github. ...
最新文章
- SSH学习笔记(一)
- Velocity的layout功能
- SpringBoot RabbitMQ 延迟队列代码实现
- [YTU]_2718 (求最高同学位置)
- Qt之自定义界面(窗体缩放)
- leetcode1471. 数组中的 k 个最强值(排序)
- SQL LIKE 操作符
- Java Maven项目打包成可执行jar文件
- 图解HTTPS协议加密解密全过程
- 【故障分析】基于主成分分析实现三容水箱故障诊断附matlab代码
- 交叉熵、KL散度、Jeffery分歧、JS散度
- The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals
- 软考-软件设计师 UML建模
- 按键精灵——电脑永不熄屏
- Android车载蓝牙相关开发2:蓝牙总入口BluetoothAdapter
- VC无负担实现XP风格界面(转)
- SpringCloudStream整合Kafka,解决两个通道对应同一个topic报错问题。
- Java中System.exit()方法的功能简介说明
- 【uniapp】支付宝小程序蓝牙绑定步骤兼容ios蓝牙连接,并报 10017 写入特征值失败解决方案
- html自动分行工具,自动HTML简化工具?