一、自动化装配
1、创建bean
①、定义一个接口
public interface CompactDisc {
void play();
}
②、实现类
@Component
public class SgtPappers implements CompactDisc {
private String title = "Sgt.Papper's";
private String artist = "The beatles";
@Override
public void play() {
System.out.println("Playiing" + title + "by" + artist);
}
}
SgtPappers上@Component注解表示该类为组建类,告诉spring要为这个类创建bean。
③、配置扫描
@Configuration //表明配置类
@ComponentScan //扫描所在包及其子包的带有@Component注解的类
public class CDPlayrConfig {
}
当然也可以通过xml开启扫描:
<context:component-scan base-package=“包路经”/>
结构:
注意@ComponentScan 默认扫描所在包及其子包,所以把CDPlayrConfig放在了
BeanConfig目录下。
④、测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayrConfig.class) //加载配置
public class CDPlayTest {
@Autowired
private CompactDisc compactDisc;
@Test
public void cdShouldNotBeNull() {
compactDisc.play();
}
}
2、为组件扫描的bean命名
spring会为每一个bean一个ID,默认是将类名的第一字母小写。如果需要设置ID,只需要 @Component(“ID名”)
3、设置扫描扫描组建包
我们上述例子中将配置类放在了目录最外层,因为 @ComponentScan 默认扫描所在包及其子包,但是我们需要扫描其他包怎么办呢。
①、直接添加包名 @ComponentScan(“com.BeanConfig”)
② 、basePackages属性,可以为复数 。
@ComponentScan(basePackages = “com.BeanConfig”) 或
@ComponentScan(basePackages = {“Classes”,“interfaceS”})
③、basePackageClasses 属性同样可为复数。@ComponentScan(basePackageClasses = {SgtPappers.class})。
会默认将这些类所在包作为扫描基础包。
针对第三种方式,我们可以建立一个空标记接口,用来告知扫描包,这样可以对以后的代码重构友好。
4、自动装配
在满足依赖的过程中,在spring应用上下文中寻找某个bean需求的其他bean。可以使用 @Autowired注解
①、在构造器上添加@Autowired。
②、在setter方法添加
③、可以在类的任何方法上。
@Component
public class CDplayer implements MediaPlayer {
private CompactDisc compactDisc;
//当创建CDplayer bean的时候,通过构造器进行实例化,
// 并传入一个可设置为CompactDisc类型的bean
/* @Autowired
public CDplayer(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}*/
@Override
public void play() {
compactDisc.play();
}
//初始化bean时,spring会尽可能满足bean的依赖。通过带有@Autowired的注解声明依赖,
//即SetCompactDisc()
@Autowired
public void SetCompactDisc(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
}
二、Java代码装配bean
1、@bean
@Configuration //声明配置类
public class CDplayerJavaConfig implements MediaPlayer {
private CompactDisc compactDisc;
@Override
public void play() {
compactDisc.play();
}
@Bean(name="cDplayer") //默认为方法名,可以通过name属性给bean命名
public CDplayerJavaConfig cDplayerJavaConfig() {
return new CDplayerJavaConfig(sgtPappers());
}
@Bean
public CompactDisc sgtPappers() {
return new SgtPappers();
}
public CDplayerJavaConfig(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
//必须要有默认构造参数
public CDplayerJavaConfig() {
}
}
@bean注解告诉Spring这个方法会返回一个对象,该对象要注册为Spring上下文中的bean
2、测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDplayerJavaConfig.class)
public class JavaConfigTest {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(CDplayerJavaConfig.class);
@Test
public void cdShouldNotBeNull() {
CDplayerJavaConfig cDplayerJavaConfig = (CDplayerJavaConfig) context.getBean("cDplayer");
cDplayerJavaConfig.play();
}
}
三、 JavaConfig组合XML配置
1、将两个JavaConfig组合起来
将sgtPappers()方法从CDplayerJavaConfig中移除。
@Configuration //声明配置类
@Import(CDconfig.class)
public class CDplayerJavaConfig implements MediaPlayer {
private CompactDisc compactDisc;
@Override
public void play() {
compactDisc.play();
}
/* @Bean(name="cDplayer") //默认为方法名,可以通过name属性给bean命名
public CDplayerJavaConfig cDplayerJavaConfig() {
return new CDplayerJavaConfig(sgtPappers());
}*/
/*@Bean
public CompactDisc sgtPappers() {
return new SgtPappers();
}*/
@Bean(name="cDplayer") //默认为方法名,可以通过name属性给bean命名
public CDplayerJavaConfig cDplayerJavaConfig(CompactDisc compactDisc) {
return new CDplayerJavaConfig(compactDisc);
}
public CDplayerJavaConfig(CompactDisc compactDisc) {
this.compactDisc = compactDisc;
}
//必须要有默认构造参数
public CDplayerJavaConfig() {
}
}
新建一个CDconfig
@Configuration
public class CDconfig {
@Bean
public CompactDisc sgtPappers() {
return new SgtPappers();
}
}
如上例所示,通过@Import(CDconfig.class)将CDconfig配置导入到CDplayerJavaConfig中。
还可以创建一个更高级别的config,使用Import({config1.class,config2.class})将多个配置类组合在一起。
2、在JavaConfig 中引用XML配置
假设compactDisc通过XML来配置在cd-config.xml中,我们可以使用 @ImportResouse注解
@Configuration
@Import(CDplayerJavaConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig {
}
3、在xml中引用JavaConfig
<?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">
<bean id="cdpalyer" class="com.BeanConfig.Classes.CDplayer" c:compactDisc-ref="compactDisc">
</bean>
<!--javaConfig-->
<bean class="com.BeanConfig.Classes.CDconfig"/>
</beans>
同样,我们也可以创建顶级的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--javaConfig-->
<bean class="com.BeanConfig.Classes.CDconfig"/>
<!--引用xml文件-->
<import resource="cdpalyer-config.xml" />
</beans>