在spring中,对象无需自己查找或创建与之关联的其他对象,相反,容器负责把需要相互协作的对象引用赋予各个对象,创建应用对象之间协作关系的行为称为装配。Spring有三种装配机制,且这些装配机制是可以互相搭配的,一些bean使用XML装配,另一些使用javaconfig装配也是可以的。:
比如一个CD播放机(CDPlayer类),需要注入CD来进行播放,CD为CompactDisc接口,有一个类实现该接口,该类为SgtPeppers 。
@Component
public class SgtPeppers implements CompactDisc
{
Xxx…
}
表示该类会作为组件类(组件扫描默认不启动,即加上该注解后要用@CamponentScan
来显式的来扫描)。Spring会为所有的bean都设置id,默认为类名第一个字母小写,或者也可以手动设置id,@Component(“xxx”)
xxx表示手动设置的id名
启用组件扫描,@ComponentScan
默认会扫描与配置类相同的包。查找带有@Component
注解的类,并在Spring中自动为其(@Component注解的类)创建一个bean,若想扫描不同包,可以@ComponentScan(basePackages=“xxx”)
,xxx表示包名。如果是多个包,那么就用@ComponentScan(basePackages={“packge1”,”packge2”})
数组表示,或者使用@ComponentScan(basePackageClasses={CDPlayers.class,DVDPlayers.class,...})
使用xxx.class指定包中含有的类或接口。
@Configuration
标注在类上,相当于把该类作为spring的xml配置文件中的
,作用为配置spring容器(应用上下文)
在CDPlayerTest测试类前加上一句@ContextConfiguration(classes=CDPlayerConfig.class)
注解@ContextConfiguration
会告诉它需要在CDPlayerConfig
中加载配置。 因为CDPlayerConfig
类中包含了@ComponentScan
, 因此最终的应用上下文中应该包含CompactDisc bean
。
通过@Autowired注解来实现自动装配bean:
@Autowired
Public void insertDisc(CompactDisc cd)
{
This.cd=cd;
}
通过该注解,使得spring自动装配所需的CompactDisc bean。
结合实例详解自动配置:
@Configuration 注解标记为配置类
@ComponentScan 并扫描所有组件
@Component 标记为组件类
@Autowired 组件类方法中需要加载其他类:
@Autowired
public CDPlayer(CompactDisc cd) {
this.cd = cd;
}
@RunWith(SpringJUnit4ClassRunner.class)使用JUnit4进行测试
@ContextConfiguration(classes=CDPlayerConfig.class) 加载所需要的配置类
@Autowired 加载需要的其他bean
@Test 使用JUnit4进行测试
如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ConstructorArgReferenceTest {
@Autowired
private MediaPlayer player;
@Test
public void play() {
player.play();
}
}
就是在方法前加上@bean注解,类似于xml文件的
@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。
例:
@Configuration
public class AppConfig()
{
@Bean
public MyService myService()
{
return new MyServiceImpl();
}
}
使用如上的注解相当于在配置文件中使用如下的配置:
<beans>
<bean id="myService" class="com.hello.MyServiceImpl" />
beans>
结合实例详解JavaConfig配置:
@Configuration 注解标记为配置类
@Bean 告诉Spring该方法要返回一个对象,该对象要注册为上下文中的bean
在Java代码配置中,不需要注解组件类,因为若在其它类中需要用到这个类,使用@bean即可为该类注册bean
@RunWith(SpringJUnit4ClassRunner.class): 使用JUnit4进行测试
@ContextConfiguration(classes=CDPlayerConfig.class) : 加载配置类
@Autowired: 加载需要的其他bean
@Test : 使用JUnit4进行测试
如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private MediaPlayer player;
@Test
public void play() {
player.play();
}
}
@Component("user")
public class user
{
......
}
等效于XML配置
id="user"class="main.user"/>
就是说@Component配置了一个bean组件,相当于在XML中的这行代码
id="compactDisc" class="soundsystem.SgtPeppers" />
publicBlankDisc(String title, String artist)
{
this.title = title;
this.artist = artist;
}
<bean id="compactDisc" class="soundsystem.BlankDisc">
<constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
<constructor-arg value="The Beatles"/>
bean>
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<constructor-arg ref="compactDisc" />
bean>
<bean id="compactDisc" class="soundsystem.collections.BlankDisc">
<constructor-arg value="Sgt.Pepper's Lonely Hearts Club Band" />
<constructor-arg value="TheBeatles" />
<constructor-arg>
<list>
<value>Sgt. Pepper's LonelyHearts Club Bandvalue>
<value>With a Little Help from MyFriendsvalue>
<value>Lucy in the Sky withDiamondsvalue>
list>
constructor-arg>
bean>
"cdPlayer" class="soundsystem.CDPlayer"
c:cd-ref="compactDisc" />
id="cdPlayer" class="soundsystem.CDPlayer"
c:_0-ref="compactDisc1"
c:_1-ref="compactDisc2" />
id="cdPlayer"class="soundsystem.CDPlayer"
c:_ -ref="compactDisc" />
字面量是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值。在spring中指构造器参数是基本数据类型。
"compactDisc" class="soundsystem.BlankDisc"
c:_title = "Sgt. Pepper's LonelyHearts Club Band"
c:_artist ="The Beatles" />
"compactDisc" class="soundsystem.BlankDisc"
c:_0="Sgt. Pepper's Lonely HeartsClub Band"
c:_1="The Beatles" />
id="cdPlayer"class="soundsystem.CDPlayer"
c:_="Sgt. Pepper's Lonely HeartsClub Band" />
属性通过property注入bean:
这里的给对象注入值不是通过构造器注入,而是通过setter方法直接给对象的属性注入值。首字母可以不区分大小写:即name=”name/size”与name=”Name/Size”是等同的
"cdPlayer" class="soundsystem.properties.CDPlayer">
<property name="compactDisc" ref="compactDisc" />
"cake" class="main.Cake"
<property name="name" value="Blueberry Cheesecake"/>
<property name="size" value="7"/>
"cdPlayer" class="soundsystem.properties.CDPlayer"
p:compactDisc-ref="compactDisc"/>
<bean id="compactDisc" class="soundsystem.properties.BlankDisc"
p:title="Sgt. Pepper's Lonely HeartsClub Band"
p:artist="The Beatles">
<property name="tracks">
<list>
<value>Sgt. Pepper's LonelyHearts Club Bandvalue>
<value>With a Little Help from MyFriendsvalue>
<value>Lucy in the Sky withDiamondsvalue>
list>
property>
bean>