spring之如何创建bean(1、自动装配)

来源:互联网 发布:2017好用的网络硬盘 编辑:程序博客网 时间:2024/06/07 19:29

学习spring的基础之一就是要去理解bean的含义以及使用方式。之前学习的时候感觉bean的使用方式真的。。。好迷啊,但是前不久看书+看视频后,终于搞懂了。特地写一篇文章来记录下

首先说说什么是bean吧。书上说是bean是各种组件,spring通过XML或者Java将这些组件合并在一起,并主动将这些组件注入其他组件中,这样形成了相互依赖和相互合作的现象。以下是我的理解:其实bean就是返回一个实例化对象。比如我们平常写Java,会有“A a=new A();”这样便创立了一个实例化的a对象。但是在bean中不会这么写,它会写成“A a;”即没有实例化,然后通过设置使之达到“A a=new A();”的效果。

设置bean有三种方式:自动装配、基于JavaConfig的装配、基于XML的装配。今天先写下自动装配。通过书上的几个例子,加上我个人的理解来写下吧。

首先,顾名思义可知自动装配是spring自动配置的,无需我们显式配置。它主要通过@Component @ComponentScan @Autowired等注解来实现。如以下代码

1、先写个接口

package soundsystem;public interface CompactDisc {    void play();}

2、写个类实现这个接口并实现其中的play()方法,可以看到这个类上面用了@Component注解。这个注解表示:将这个POJO(普通Java类)设置为一个组件类。spring会通过自动装配返回一个bean(我的理解是会返回一个 new SgtPeppers();)

package soundsystem;import org.springframework.stereotype.Component;@Componentpublic class SgtPeppers implements CompactDisc{    public void play(){        System.out.println("this is play_method");    }}

3、设置一个类作为“Config类”,使用@Configuration即表示将其声明为一个“Config类”;使用@ComponentScan代表这个“Config类”能扫描组件并将它们整合到这个类中。同时也可以看到这个类中没有任何代码,就是个空类。这便是最简单的Config类

package soundsystem;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScanpublic class CDPlayerConfig {}

3.5、也许以下的XML比较常见,这个XML代码实现了和上面这个Config类同样的功能

<?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:p="http://www.springframework.org/schema/p"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">    <context:component-scan base-package="soundsystem" /></beans>

4、上面便完成了最简单的自动配置,我们可以通过JUnit来测试,SgtPeppers这个bean有没有被整合到Config中去。这段代码中使用了@Autowired注解,即会自动注入对象,如此段代码中只写了 “CompactDisc cd”。此时并未实例化,当加上@Autowired时候,序号3中的Config类便会将它扫描到的SgtPeppers bean自动注入cd对象中。从而实现了”CompactDisc cd=new SgtPeppers();”这行代码。最后加个@Test来使用JUnit来进行检测,效果如下图:

package soundsystem;import static org.junit.Assert.assertNotNull;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=CDPlayerConfig.class)public class CDPlayerTest {    @Autowired    private CompactDisc cd;    @Test    public void test(){        assertNotNull(cd);    }}可以看到,右侧下方的一条绿色的线,代表成功,即这个未实例化的cd对象已经被注入(即已经实例化了)

这里写图片描述
5、接下来让我们把“@Autowired”注解拿掉试试,可以看到没有自动注入的话,这个cd就没有实例化,测试失败这里写图片描述

原创粉丝点击