前言 |
今天我们来总结一下bean的装配问题,一个软件需要不同功能的类之间建立合作,才能是组装成一个强大的系统,spring在其中就是一个调度者的角色,总结一句话就是:我知道你需要什么,我提供给你需要的,而你只需要大脑空空就可以了,专注于你要完成的业务逻辑就好了,别的事情交给我来做。
有没有被spring感动到,比如一台电脑,他包含了许多组件,cup知道他需要一个硬盘吗?不知道吧,这需要工人给他组装到一起,拿到手上的就是所有配件齐全的一台机器,而spring就是这个组装工人
装配 |
创建应用对象之间协作关系的行为通常称为装配(wiring),这也是DI(依赖注入)的本质
三种配置方式:
- 在XML中进行显示配置
- 在JAVA中进行显示配置
- 隐式的bean发现机制和自动装配
自动化装配bean
- 组件扫描:Spring会自动发现应用上下文中所创建的bean
- 自动装配:Spring自动满足bean之间的依赖
实例:(取自《spring实战》) |
这个小例子以cd机为原型,cd机如果没有加入唱片,那么他也没有用处,所以这里的依赖关系就是cd机要依赖唱片才能播放
一、创建唱片
public interface CompactDisc {
void play();
}
值得思考的编码哲学:将唱片定义为一个接口,他定义了cd机对一盘唱片所能进行的操作,他将cd机的任意实现与CD本身的耦合降低到了最小的程度
二、唱片的实现
@Component
public class SgtPeppers implements CompactDisc {
//beatles1967年发行的专辑
private String title="Sgt.Perpper's Lonely Hearts Club Band";
private String artist="The Beatles";
public void play() {
System.out.println("Playing "+title+" by "+artist);
}
}
p.s. @Component、@Repository、@Service 和@Controller的区别
- @Service用于标注业务层组件
- @Controller用于标注控制层组件(如struts中的action)
- @Repository用于标注数据访问组件,即DAO组件
- @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
他们都是元注解,用于标注其他注解,在这里的作用:标注在某个类上,此类就会自动的被Spring容器注册为BeanDefinition(扫描包的时候,如果有以上四个注解,则将此类管理到spring容器中)
三、配置spring
组件扫描默认是不启动的,需要显示配置一下Spring,有两种方式进行配置,一种是使用Java代码定义Spring的装配规则,第二种是使用xml配置文件
方法一:
@Configuration
@ComponentScan
public class CDPlayerConfig {
}
带有@Configuration注解,说明这个类是一个配置类,而@ComponentScan默认会扫描会配置类相同的包
测试方法:
//在测试开始的时候自动创建Spring的应用上下文
@RunWith(SpringJUnit4ClassRunner.class)
//会告诉他需要在CDPlayerConfig中加载配置。因为CDPlayerConfig包含了@ComponentScan,最终的应用上下文中应该包含CompactDisc bean
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc cd;
@Test
public void cdShouldNotBeNull(){
assertNotNull(cd);
}
}
方法二:
在xml文件中配置包扫描器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 配置包扫描器 -->
<context:component-scan base-package="soundsystem"/>
</beans>
测试方法:
第二种测试方法:(配置文件)
public class CDPlayerTest {
@Autowired
private CompactDisc cd;
@Test
public void cdShouldNotBeNull(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
context.start();
cd=(CompactDisc) context.getBean("lonelyHeartsClub");
assertNotNull(cd);
}
}
总结 |
今天简单的了解了一些spring的装配的最基本的应用,这只是最简单的一个实例,业务复杂的时候就会出现各种各样的其他场景,spring的强大才会慢慢体现出来