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>


原创粉丝点击