spring实战——装配Bean
来源:互联网 发布:电脑打开淘宝口令 编辑:程序博客网 时间:2024/06/06 23:56
Bean配置方案并不仅一种,三种装配方式可以并没有使spring的Bean装配变得麻烦,使用者可以根据自己的喜好使用,也可以混合使用!
三种装配方式:
1、在XML中进行显示配置
2、在Java中进行显示配置
3、隐式的Bean发现机制和自动装配
这里建议使用自动装配!
需要的jar包:http://download.csdn.net/download/fancheng614/10118789
一、自动装配Bean:
打个比方:DVD唱机和CD之间的关系,如果只有DVD而没有CD,显然DVD并没有任何价值了,只有将CD注入到DVD唱机中,DVD才能实现它的价值!
先来定义一个CD:
package com.mfc.autobean;/** * 2017年11月14日20:40:41 * 自动装配的CD接口 * */public interface CompactDisc {public void play();}
CD的实现类:
package com.mfc.autobean;import org.springframework.stereotype.Component;/** * 2017年11月14日20:42:13 * 我的CD实现了CD的接口 * 这里可以使用@Name代替@Component * */@Component("compactDisc")public class MyCompactDisc implements CompactDisc {@Overridepublic void play() {System.out.println("CD播放器播放了我的CD");}}
唱机接口:
package com.mfc.autobean;/** * 2017年11月14日21:42:23 * 唱机的接口 * */public interface MediaPlayer {public void play();}
唱机实现:
@Autowired也可以用在set方法上或者构造器上
package com.mfc.autobean;import javax.inject.Inject;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;/** * 2017年11月14日21:43:26 * 对唱片接口进行实现 * */@Componentpublic class CDPlayer implements MediaPlayer {/** * 这里的@Autowired可以和@Inject互换 * */ private CompactDisc compactDisc; @Inject public CDPlayer(CompactDisc compactDisc){ this.compactDisc = compactDisc; }@Overridepublic void play() {cd.play();}}
启用组件扫描:
package com.mfc.autobean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;/** * 2017-11-14 20:44:21 * 启用组件扫描(默认组件扫描是关闭的),这里在java类中启用组件扫描, * 也可以再xml中启用组件扫描:<context component-scan="包名"/> * 配置多个包:@ComponentScan(basePackages = {"com.mfc.autobean","com.mfc.dao"}) * */@Configuration@ComponentScan("com.mfc.autobean")public class CDPlayerConfig {}
测试类:
package com.mfc.autobean;import static org.junit.Assert.assertNotNull;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;/** * 2017年11月14日20:48:22 * 测试类 * */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=CDPlayerConfig.class)public class CDPlayerTest {@Autowiredprivate CompactDisc compactDisc;@Autowiredprivate MediaPlayer player;@Testpublic void cdShouldNotBeNull(){assertNotNull(compactDisc);}@Testpublic void play(){player.play();}}
测试成功!
二、通过java代码装配bean
虽然自动装配那么方便,但有些场合还是必须使用显示配置的,比如要装配第三方库中的组件,就只能使用显示配置了,显示配置有java代码装配和xml装配两种方法,使用java代码装配bean相对于xml装配的好处:更强大、类型安全、并对重构友好!
将上面的代码中 CDPlayerConfig.java修改为:
使用@Bean装配组件,告诉Spring将@Bean下面的返回的对象注册为spring应用上下文中的Bean
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.mfc.autobean.CDPlayer;import com.mfc.autobean.CompactDisc;import com.mfc.autobean.MyCompactDisc;/** * 2017年11月15日19:35:42 * 使用java类进行配置 * */@Configurationpublic class CDPlayerConfig {/** * 这里可以在myCompactDisc()中发挥java的所有功能, * 只要最终生成一个CompactDisc实例就可以 * */@Bean(name = "myCompactDisc")public CompactDisc myCompactDisc(){return new MyCompactDisc();}@Beanpublic CDPlayer cdPlayer(){return new CDPlayer(myCompactDisc());}}
测试类还跟上面的测试类一样,经测试成功!
三、使用XML配置Bean:
1、最简单的spring XML 配置:
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"></beans>
2、声明最简单的Bean:
class属性的值必须使用全限定的类名
<bean id="compactDisc" class="com.mfc.autobean.CompactDisc"></bean>
3、构造器注入Bean引用:
有两种配置方案可选:
- <constructor-arg>元素配置
- 使用spring3.0所引入的 -c 命名空间
<!-- 一、构造器注入bean引用 --><!--声明一个bean--><bean id="compactDisc" class="com.mfc.autobean.CompactDisc"></bean><!--注入方法一:使用constructor-arg--><!--<bean id="cdPlayer" class="com.mfc.autobean.CDPlayer">--><!--注入bean--><!--<constructor-arg ref="compactDisc"></constructor-arg></bean>--><!--注入方法二:使用 -c命名空间--><!--使用c命名空间的命名约定:属性名以“c:”开头,也就是命名空间的前缀,接下来就是要装配的构造器参数名,在此之后是“-ref”这里的c:compactDisc-ref也可以换成c:_0-ref解释一下:c:_0-ref使用_0代替构造器参数名,不管参数名怎么变换,这里都可以不修改,0是构造器中参数索引(表示构造器中第一个参数,要是有两个参数可以接着使用c:_1-ref,以此类推),如果只有一个构造器参数,可以使用c:_-ref省略索引。--><bean id="cdPlayer" class="com.mfc.autobean.CDPlayer" c:compactDisc-ref="compactDisc"></bean>
使用 -c 命名空间时,别忘了加上:xmlns:c="http://www.springframework.org/schema/c"
4、将字面量注入到构造器中:
这里注意:使用 -c 命名空间不能注入集合
BlankDisc.java:
package com.mfc.xml;import java.util.List;import com.mfc.autobean.CompactDisc;public class BlankDisc implements CompactDisc {private String title;private String artist;private List<String> tracks;public BlankDisc(String title, String artist,List<String> tracks) {this.title = title;this.artist = artist;this.tracks = tracks;}@Overridepublic void play() {System.out.println("Playing "+title+" by "+artist);for (String string : tracks) {System.out.println("-Track:"+string);}}}
xml配置:
<!-- 二、将字面量注入到构造器中 --><!--方法一:使用constructor-arg--><bean id="compactDisc" class="com.mfc.xml.BlankDisc"><constructor-arg value="Title_test"></constructor-arg><constructor-arg value="Artist_test"></constructor-arg><constructor-arg><!-- 这里注入set集合是一样的,只需要将list换成set就行了,set如果注入了重复值会被忽略掉,而且是无序的 --><list><!--这里面也可以使用<ref bean=""/> ,bean对应的是各种注入的bean--><value>测试一</value><value>测试二</value><value>测试三</value></list></constructor-arg></bean><!-- 方法二:使用 -c命名空间 --><!--<bean id="compactDisc" class="com.mfc.xml.BlankDisc" c:_title="Title_test" c:_artist="Artist_test" ></bean>--> <!--或者--><!--<bean id="compactDisc" class="com.mfc.xml.BlankDisc" c:_0="Title_test" c:_1="Artist_test" ></bean> -->
测试类:
public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xmlconfig.xml");CompactDisc cd = (CompactDisc) applicationContext.getBean("compactDisc");cd.play();}
运行结果:
上面都是记述的构造器注入,接下来看看setter注入:
5、setter方法注入:
CDPlayer.java:
package com.mfc.xmlconfigset;import com.mfc.autobean.CompactDisc;import com.mfc.autobean.MediaPlayer;public class CDPlayer implements MediaPlayer {private CompactDisc compactDisc;public void setCompactDisc(CompactDisc compactDisc) {this.compactDisc = compactDisc;}@Overridepublic void play() {compactDisc.play();}}
xml:
<!-- 一、setter注入bean --><!-- 方法一 :<property>注入--><bean id="compactDisc" class="com.mfc.autobean.CompactDisc" /><bean id="cdPlayer" class="com.mfc.xmlconfigset.CDPlayer"><property name="compactDisc" ref="compactDisc"></property></bean><!-- 方法一二: -p 命名空间注入-p 命名空间和 -c 命名空间命名规范是一样的--><!-- <bean id="cdPlayer" class="com.mfc.xmlconfigset.CDPlayer"p:compactDisc-ref="compactDisc"></bean>-->
6、将字面量注入到属性中:
BlankDisc.java:
package com.mfc.xmlconfigset;import java.util.List;import com.mfc.autobean.CompactDisc;public class BlankDisc implements CompactDisc {private String title;private String artist;private List<String> tracks;public void setTitle(String title) {this.title = title;}public void setArtist(String artist) {this.artist = artist;}public void setTracks(List<String> tracks) {this.tracks = tracks;}@Overridepublic void play() {System.out.println("Playing "+title+" by "+artist);for (String string : tracks) {System.out.println("-Track:"+string);}}}
xml配置:
<util>命名空间中还有很多其他元素!可以自行百度查看!
<!-- 二、将字面量注入到属性中 --><!-- 方法一 :<property>注入--><!-- <bean id="compactDisc" class="com.mfc.xmlconfigset.BlankDisc"><property name="title" value="title_test"></property><property name="artist" value="artist_test"></property><property name="tracks"><list><value>测试一</value><value>测试二</value><value>测试三</value></list></property></bean>--><!-- 方法二: -p 命名空间注入 --><!-- <bean id="compactDisc" class="com.mfc.xmlconfigset.BlankDisc"p:title="title_test"p:artist="artist_test"><property name="tracks"><list><value>测试一</value><value>测试二</value><value>测试三</value></list></property></bean>--><!-- 方法三: -p 命名空间注入 --><bean id="compactDisc" class="com.mfc.xmlconfigset.BlankDisc"p:title="title_test"p:artist="artist_test"p:tracks-ref="trackList" /><util:list id="trackList"><value>测试一</value><value>测试二</value><value>测试三</value></util:list>
测试类:
package com.mfc.xmlconfigset;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.mfc.autobean.CompactDisc;public class Test {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xmlconfigset.xml");CompactDisc cd = (CompactDisc) applicationContext.getBean("compactDisc");cd.play();}}
测试结果:
四、混合装配Bean:
1、在java配置文件中添加java配置文件:
在对应的JavaConfig的类上面添加注解:
只合并一个配置java:
@Import(com.mfc.javaconfig.CDPlayerConfig.class)
合并多个配置java
@Import({com.mfc.javaconfig.CDPlayerConfig.class,CDConfig.class})
2、在java配置文件中添加xml配置文件:
在对应的JavaConfig的类上面添加注解:
@ImportResource("classpath:xmlconfig.xml")
3、在xml配置文件中添加xml配置文件
在xml文件中添加配置语句:
<import resource="xmlconfigset.xml"/>
4、在xml配置文件中添加JavaConfig配置
在xml文件中添加配置语句:
<bean class="com.mfc.autobean.CDPlayerConfig"></bean>
- Spring实战笔记——装配Bean
- spring实战——装配Bean
- Spring实战-装配bean
- 【Spring】Spring实战(二)——装配Bean
- Spring实战笔记——Bean的高级装配
- spring实战-自动装配bean
- spring实战-注解装配bean
- spring实战-JavaConfig装配bean
- spring实战-混合装配bean
- spring实战-条件装配bean
- spring实战-注解装配bean
- Spring实战(装配Bean)
- spring装配bean——自动装配bean
- Spring装配Bean——Java代码装配bean
- Spring装配Bean——通过配置XML装配bean
- Spring实战(第四版)——第二章 装配Bean
- Spring框架——bean自动装配
- Spring——装配Bean 02
- The Suspects --并查集水题
- win7/win10下安装Microsoft Loopback Adapter
- 生成对抗网络学习笔记5----DCGAN(unsupervised representation learning with deep convolutional generative adv)的实现
- 11月14日心得
- MySQL数据类型
- spring实战——装配Bean
- 数值的整数次方
- 最小生成树prim算法
- 例题8-1 煎饼(Stacks of Flapjacks, UVa120)
- JSON-XML转换工具
- 单位转换
- 查找之平衡二叉树
- 数人云|浅论Prometheus容器监控优缺点,2.0版本哪项改进受关注?
- java基础知识