您的位置:首页 > 编程语言 > Java开发

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

2017-08-19 08:50 429 查看
学习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;
@Component
public 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
@ComponentScan
public 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就没有实例化,测试失败
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring