装配Bean
Spring提供了三种主要的Bean装配机制
- 在xml中进行显示配置(便利的命名空间)
- 在Java中进行显示配置(相对于xml是类型安全的)
- 隐式的bean发现机制和自动装配
自动化装配bean
Spring从两个角度来实现自动化装配
- 组件扫描 : Spring会自动发现应用上下文中所创建的bean
- 自动装配 : Spring自动满足bean之间的依赖
创建可被发现的bean
package soundsystem;
public interface CompactDisc{
void play();
}
---------------------
@Compent //表明该类作为组件类并告知Spring为这类创建bean
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);
}
}
--------------------------------
组件扫描默认是不启用的 需要@ComponentScan注解 或在xml中配置
package soundsystem;
@Configuration
@ComponentScan(basePackages={"...."})//basePackages指定要扫描的包,不指定的话默认为本类所在包
public class CDPlayerConfig{
}
然后通过AnnotationConfigApplicationCotext加载CDPlayerConfig.class 即可
xml启动
...
<beans ....>
<context:component-scan base-package="" />
....
</beans>
为组件扫描的bean命名
@Component注解可给bean设置类似xml中的ID
如
@Component("lonelyHeartsClub")
public classSgtPeppers{
}
不指定ID会默认为类名的第一个字母变为小写作为ID
还有一种bean的命名方式 @Named("")
通过为bean添加注解实现自动装配
自动装配是让Spring自动满足bean依赖的一种方法 可以借助@Autowired注解
@Component
public class CDPlayer{
private CompactDisc cd;
@Autowired
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
}
@Autowired注解不仅能用在构造器上,还能用在属性的setter方法上 甚至用在类的任何方法上,因为setter方法并没有什么特别的
@Autowired(required=false)required属性为false时 当自动装配没有匹配的bean时 这个bean处于未装配状态(容易出现NUllPointerException)
也可以用@Inject
通过Java代码装配bean
优点是类型安全,重构友好
JavaConfig类的关键在于@Configuration 注解,以及@Bean注解
在JavaConfig中声明bean要编写一个方法创建所需类型的实例,并添加@Bean注解
@Configuration
public class CDPlayerConfig{
@Bean //可通过name属性指定不同名字
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers());//引用创建bean的方法注入
}
}
Spring会拦截所有对添加了@Bean注解的方法的调用,并确保直接返回该方法所创建的bean
比如
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers());//引用创建bean的方法注入
}
@Bean
public CDPlayer anotherCDPlayer(){
return new CDPlayer(sgtPeppers());//引用创建bean的方法注入
}
anotherCDPlayer 和之前的cdPlayer bean 完全一样
通过xml装配bean
简单声明
<bean id="compactDisc" class="soundsystem.SgtPeppers" />
不明确指定ID时 会默认根据全限定类名命名
如”soundsystem.SgtPeppers#0” #0表示计数,用来区分相同类型的其他bean
当Spring发现这个元素时,他将会调用SgtPeppers的默认构造器来创建bean
借助构造器初始化bean
- 元素
- 使用c命名空间
c命名空间声明
<beans ...
xmlns:c="http://www.springframework.org.schema/c"
...>
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<constructor-arg ref="compactDisc" />
</bean>
等价于
<bean id="cdPlayer" class="soundsystem.CDPlayer"
c:cd-ref="compactDisc";
>
</bean>
cd 表示构造器参数名 -ref表示要注入bean引用,也可以用参数的顺序来表示 如 c:_0-ref 只有一个参数时还可以c:_-ref
将一个ID为compactDisc的bean引用传递到CDPlayer的构造器中
将字面量注入到构造器
当构造器为
public BlankDisc(String title,String artist){
this.title = title;
this.artist = artist;
}
<bean id=".." class="..">
<constructor-arg value="Sgt.Pepper's.."/>
<constructor-arg value="The Beatles" />
c命名空间
<bean id=".." class=".."
c:_0=".."
c:_1=".." />
装配集合
装配集合是可以但C命名空间做不到的
如
当构造器为
public BlankDisc(String title,String artist,List<String> tracks){
this.title = title;
this.artist = artist;
this.tracks = tracks;
}
bean id=".." class="..">
<constructor-arg value="Sgt.Pepper's.."/>
<constructor-arg value="The Beatles" />
<constructor-arg>
<list>
<value>Sgt.Pepper...</value>
<value>....</value>
...
</list>
</constructor-arg>
如果list中是其他bean的引用的话
bean id=".." class="..">
<constructor-arg value="Sgt.Pepper's.."/>
<constructor-arg value="The Beatles" />
<constructor-arg>
<list>
<ref bean="beanid" />
...
</list>
</constructor-arg>
也可以按同样的方式使用<set>
属性注入
public class CDPlayer{
private CompactDisc cd;
@Autowired
public void setCDPlayer(CompactDisc cd){
this.cd = cd;
}
}
<bean id = "cdPlayer" class="...">
<property name="compactDisc" ref="compactDisc" />
</bean>
<property>元素为属性的set方法提供的功能与<constructor-arg>为构造器提供的功能一样
<property>可用p命名空间代替
<bean id = "cdPlayer" class="..."
p:cd-ref="">
</bean>
cd 是属性的名字
属性也可以注入字面量 以及list
<bean id = "cdPlayer" class="..."
p:title="Sgt.Pepper...."
p:artist="....">
</bean>
<bean id = "cdPlayer" class="...">
<property name="title" value="Sgt.Pepper...." />
<property name="artist" value="..."/>
<property name="tracks">
<list>
<value>....</value>
...
</list>
</property>
</bean>
</bean>
util命名空间
功能之一 提供元素,他会创建一个列表的bean,供引用
<util:list id="trackList">
<value>Sgt.....</value>
.....
</util:lsit>
<bean id="..." class="..."
p:title = "..."
p:artist = "..."
p:tracks-ref="trackList" />
导入和混合配置
在JavaConfig中引用xml配置
使用@ImportResource(“classpath:cdconfig.xml”)在JavaConfig中导入其他Java配置
@Import(CDConfig.class)在Jxml中导入JavaCOnfig
<bean class = "***.CDConfig" />
用<import resoune="***.xml"/> 导入其他xml配置