装配Bean
Spring配置的可选方案
1.在xml中进行显示配置
2.在Java中进行显示配置
3.隐式的bean发现机制和自动装配
选择哪种装配bean的方案应该看个人和应用场景,建议显示配置越少越好,若是实在需要,可以使用JavaConfig将会比XML中的配置较好
自动化装配bean
此前需要先导入spring中所需要的jar包,可自行去官网下载
spring中是两个方面中进行自动化配置
-
组件扫描(component scanning): Spring会自动发现应用上下文中所创建的bean
-
自动装配(autowring): Spring自动满足bean之间的以来
创建可被发现的bean
CompactDisc接口
//接口 public interface CompactDisc { void play(); }
SgtPeppers实现类byCompactDisc
//实现类 @Component public class SgtPeppers implements CompactDisc{ private String title = "Sgt. Peppers Lonely Hearts Club Band"; private String artist = "The Beatles"; @Override public void play() { System.out.println("Playing" + title + " by "+artist); } }
CDPlayerConfig主配置类
@Configuration //标注了这是一个配置类,等同于xml配置 @ComponentScan //这是一个扫描包的类,若是没有指定包,会扫描此类所在的包 public class CDPlayerConfig { }
测试类CDPlayerTest
@RunWith(SpringJUnit4ClassRunner.class)//此标签用于spring自动创建上下文 @ContextConfiguration(classes=CDPlayerConfig.class)//告诉spring要加载此配置类 public class CDPlayerTest { @Autowired private CompactDisc cd; @Test public void cdShouldNotBeNull() { assertNotNull(cd); //用来测试此类是否为空 } }
由此,一个简单bean创建即实现了.
为组建扫描的bean命名
@Named和Spring的@Component功能相同。@Named可以有值,如果没有值生成的Bean名称默认和类名相同。 不建议使用,有兴趣可以自行搜查下.
设置组件的扫描包
设置指定的包名
@Configuration //标注了这是一个配置类,等同于xml配置 //这是一个扫描包的类,若是没有指定包,会扫描此类所在的包,可加载多个包,basePackages为复数形式 @ComponentScan (basePackages={"soundsystem","packageName"}) public class CDPlayerConfig { }
设置扫描指定的类所在的包
@Configuration //标注了这是一个配置类,等同于xml配置 //这是一个扫描包的标签,若是没有指定包,会扫描此类所在的包,可加载多个包,basePackages为复数形式 //当属性为basePackageClasses,此时扫描的是指定类所在的包 @ComponentScan (basePackageClasses= {SgtPeppers.class,CDPlayerTest.class}) public class CDPlayerConfig { }
通过为bean添加注解实现自动装配功能
@Autowired 可以放入 构造方法以及setter方法中,将bean注入
CDPlayer类
@Component public class CDPlayer implements MediaPlayer{ private CompactDisc cd; //构造方法注入 @Autowired public CDPlayer(CompactDisc cd) { this.cd = cd; } @Override public void play() { cd.play(); } //setter方法注入 @Autowired public void setCompactDisc(CompactDisc cd) { this.cd = cd; } }
//MediaPlayer接口 public interface MediaPlayer { void play(); }
验证自动装配
此代码可自行编写~~~
2.3通过Java代码专配bean
尽管我们能通过包的扫描形成自动装配,但有些情况我们不得不显示的声明bean,例如mybatis中的dataSource
2.3.1创建配置类
如前面CDPlayerConfig类
2.3.2声明简单的bean
public class CDPlayerConfig { //或者使用@Bean("name")在此中写入名字 @Bean//默认使用方法名的名字 public CompactDisc sgtPeppers() { return new SgtPeppers(); } }
2.3.3借助JavaConfig实现注入
在CDPlayerConfig类中加入这两个方法
@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); } @Bean public CDPlayer anotherCdPlayer() { return new CDPlayer(sgtPeppers()); }
我们可以看到,对sgtPeppers就像其他Java方法调用一样,但是在Spring中,sgtPeppers是单例,若是在sgtPeppers()中没有显示声明此bean该为多例,spring会拦截其他的sgtPeppers对象,保证返回的是同一个对象.
spring中更加推崇使用接口如
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { return new CDPlayer(compactDisc); } @Bean public CDPlayer anotherCdPlayer(CompactDisc compactDisc) { return new CDPlayer(compactDisc); }
通常通过此方式是引用其他的bean是最佳的选择,他不会要求将CompactDisc声明在同意配置类,以及XML自动扫描和装配bean之中,只要功能完整健全即可.
2.4通过xml装配bean
在以前我们都是使用xml文件进行配置,但现在逐渐被Java配置类取代了
2.4.1创建XML配置规范
在xml中,你需要有个<beans>元素为根,并且导入约束
2.4.2声明一个简单的<bean>
<bean id="" class=""></bean>
放入xml中,id为唯一名字,class是全限定类名(加包的前缀
2.4.3借助构造器注入初始化的bean
<bean id="" class="" > <!-- ref可以引入其他的bean, value为设置的值,两者一般不共存 --> <constructor-arg ref="" value=""></constructor-arg> <!-- 此传入的是一个null值--> <constructor-arg ref="" value=""><null/></constructor-arg> </bean>
c标签可自行在网上搜
在xml构造器注入中,也可以注入集合参数
<constructor-arg> <!-- 可以将list换成set,区别是spring导入的是java.util.list还是java.util.set --> <list> <!-- value可以变换为ref --> <value></value> <value></value> </list> </constructor-arg>
2.4.4设置属性
<bean id="id名" class="全限定类名" > <!-- value可以换成ref,使用方法如上 --> <property name="属性名字" value="属性值"></property> </bean>
2.5导入和混合配置
不同情况下用不同的配置方式,会事半功倍,spring配置也是如此,有时用JavaConfig可能相对于xml反而没那么好
2.5.1在JavaConfig中引入XML配置
使用@ImportResource注解,引入的是根类路径下的spring文件夹中的springbean.xml
@ImportResource("classpath:spring/springbean.xml") public class CDPlayerConfig { }
2.5.2在XML配置中引用JavaConfig
在自己的application.xml中使用<import>以及<bean>元素引用
<!-- 此元素只能引用其他spring的xml配置文件 --> <import resource=""/> <!-- 将JavaConfig类的全限定名写入其中,将会引用--> <bean class=""/>