Bean的自动化装配

前言


今天我们来总结一下bean的装配问题,一个软件需要不同功能的类之间建立合作,才能是组装成一个强大的系统,spring在其中就是一个调度者的角色,总结一句话就是:我知道你需要什么,我提供给你需要的,而你只需要大脑空空就可以了,专注于你要完成的业务逻辑就好了,别的事情交给我来做。

有没有被spring感动到,比如一台电脑,他包含了许多组件,cup知道他需要一个硬盘吗?不知道吧,这需要工人给他组装到一起,拿到手上的就是所有配件齐全的一台机器,而spring就是这个组装工人

装配


创建应用对象之间协作关系的行为通常称为装配(wiring),这也是DI(依赖注入)的本质

三种配置方式:

  1. 在XML中进行显示配置
  2. 在JAVA中进行显示配置
  3. 隐式的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的强大才会慢慢体现出来

猜你喜欢

转载自blog.csdn.net/cd18333612683/article/details/79021642
今日推荐