Spring 中装配 bean 的三种主要方式:java
建议尽量使用自动化配置,以免显式配置所带来的维护成本。
Spring 从两个角度来实现自动化装配:spring
为了展现自动化配置,咱们先定义一个CD的接口:ide
package com.soundsystem; public interface CompactDisc { void play(); }
建立一个CD接口的实现类————SgtPeppers:ui
package com.soundsystem; import org.springframework.stereotype.Component; //@Componet("lonelyHeartsClub") 为bean明明,不然默认为sgtPeppers,也就是将类名的第一个字母变为小写。 @Component public class SgtPeppers implements CompactDisc { private String title = "Sgt. Pepper's Lonely Hearts Club Band"; private String artist = "The Beatles"; public void play() { System.out.println("Playing " + title + " by " + artist); } }
@Component这个简单的注解代表该类会做为组件类,并告知 Spring 要为这个类建立 bean。没有必要显式配置 SgtPeppersbean,由于这个类使用了 @Component 注解,因此 Spring 会为你把事情处理稳当。 this
不过,组件扫描默认是不启用的。咱们还须要显式配置一下 Spring,从而命令它去寻找带有 @Component 注解的类,并为其建立 bean。idea
@ComponentScan 注解开启组件扫描,Spring 将会扫描这个包以及这个包下的全部子包,查找带有 @Component 注解的类,并为其建立 bean:spa
package com.soundsystem; import org.springframework.context.annotation.\*; @Configuration//代表这个类是一个配置类 @ComponentScan// public class CDPlayerConfig { }
若是没有为bean显示命名,不然默认为sgtPeppers,也就是将类名的第一个字母变为小写。code
@Componet("lonelyHeartsClub") public class SgtPeppers implements CompactDisc { }
开启组件扫描,Spring 将会默认扫描这个包以及这个包下的全部子包。
能够用basePackages属性指定包名:xml
@Configuration @ComponentScan(basePackages={"soundsystem", "video"}) public class CDPlayerConfig { }
除了将包设置为简单的 String 类型以外,@ComponentScan 还提供了另一种方法,那就是将其指定为包中所包含的类或接口:接口
@Configuration @ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.clas}) public class CDPlayerConfig { }
简单来讲,自动装配就是让 Spring 自动知足 bean 依赖的一种方法,在知足依赖的过程当中,会在 Spring 应用上下文中寻找匹配某个 bean 需求的其余 bean。为了声明要进行自动装配,咱们能够借助 Spring 的 @Autowired 注解。
比方说,将唱片注入播放器:
package com.soundsystem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;~~~~ @Component public class CDPlayer implements MediaPlayer { private CompactDisc cd; @Autowired(required = false) public CDPlayer(CompactDisc cd){ this.cd = cd; } public void play() { } }
它的构造器上添加了 @Autowired 注解,这代表当 Spring 建立 CDPlayerbean 的时候,会经过这个构造器来进行实例化而且会传入一个可设置给 CompactDisc 类型的 bean,将一个 CompactDisc 注入到 CDPlayer 之中。
若是没有匹配的 bean,那么在应用上下文建立的时候,Spring 会抛出 一个异常。为了不异常的出现,你能够将 @Autowired 的 required 属性设置为 false。
若是有多个 bean 都能知足依赖关系的话,Spring 将会抛出一个异常,代表没有明确指定要选择哪一个 bean 进行自动装配。
有些时候你想要将第三方库中的组件装配到你的应用中,在这种状况下,是没有办法在它的类上添加 @Component 和 @Autowired 注解的,所以就不能使用自动化装配的方案了。
@Configuration//代表这个类是一个配置类 public class CDPlayerConfig { }
@Configuration//代表这个类是一个配置类 public class CDPlayerConfig { //@Bean(name="lonelyHeartsClubBand")这样能够给bean显示命名 @Bean public CompactDisc sgtPeppers(){ return new SgtPeppers(); } }
@Bean这代表这个方法会建立一个 bean 实例并将其注册到 Spring 应用上下文中。
@Configuration//代表这个类是一个配置类 public class CDPlayerConfig { //@Bean(name="lonelyHeartsClubBand")这样能够给bean显示命名 @Bean public CompactDisc sgtPeppers(){ return new SgtPeppers(); } //将CompactDisc 注入到 CDPlayer 之中 @Bean public CDPlayer cdPlayer(){ return new CDPlayer(sgtPeppers()); } }
这只是用来帮助你维护已有的 XML 配置,在完成新的 Spring 工做时,但愿你会使用自动化配置和 JavaConfig。
使用idea新建XML Spring Congfig配置文件便可。
<bean id="compactDisc" class="com.soundsystem.SgtPeppers" />
建立这个 bean 的类经过 class 属性来指定的,而且要使用全限定的类名。
借助id属性,为bean命名。
<bean id="cdPlayer" class="com.soundsystem.CDPlayer"> <constructor-arg ref="compactDisc" /> </bean>
<bean id="compactDisc" class="com.soundsystem.BlankDisc"> <constructor-arg index="0" value="Sgt. Pepper's Lonely Hearts Club Band"/> <constructor-arg index="1" value="The Beatles"/> </bean>
<bean id="compactDisc" class="com.soundsystem.BlankDisc"> <constructor-arg index="0" value="Sgt. Pepper's Lonely Hearts Club Band"/> <constructor-arg index="1" value="The Beatles"/> <!-- 实现值列表的装配 --> <constructor-arg> <list> <value>Sgt. Pepper's Lonely Hearts Club Band</value> <value>With a Little Help from My Friends</value> <value>Lucy in the Sky with Diamonds</value> <value>Getting Better</value> <value>Fixing a Hole</value> <!-- ...other tracks omitted for brevity... --> </list> </constructor-arg> <!-- 实现 bean 引用列表的装配 --> <constructor-arg> <list> <ref bean="compactDisc" /> </list> </constructor-arg> </bean>
@Configuration public class CDConfig { @Bean public CompactDisc sgtPeppers(){ return new SgtPeppers(); } }
使用@Import注解导入DConfig.class配置:
@Configuration @Import(CDConfig.class) public class CDPlayerConfig { @Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); } }
使用@ImportResource("classpath:"):
@Configuration @Import(CDConfig.class) @ImportResource("classpath:") public class CDPlayerConfig { @Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); } }
<?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:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--导入javaConfig配置--> <bean class="com.soundsystem.CDPlayerConfig" /> <!--导入其余xml配置--> <import resource="cdplayer-config.xml" /> </beans>