@Autowired、@Resource、@Inject三者都是自动装配的意思:
@Autowired:最强大,而且是spring独有的,离开了spring就没有用了
@Resource:j2ee,这是Java的标准,resource的扩展性就很强,如果切换成另外一个容器框架,@Resource还是可以用的
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@Component的作用:
表示这个 Class 是一个自动扫描组件,当组件不好归类的时候,我们可以使用这个注解进行标注,相当于配置文件中的创建了一个bean
<bean id="" class=""/>
@Autowired的作用:
它可以对类成员变量、方法和构造函数就行标注,完成自动装配。通过@Autowired的使用来消除set , get 方法
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
讲一个带有错误的案例:
看代码:
package com.atshiyou.test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import com.atshiyou.service.BookService;
import com.atshiyou.servlet.BookServlet;
@Component
class IocTest {
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
@Autowired
private BookServlet bookServlet;
@Test
public void test2() {
System.out.println(bookServlet);
}
将测试的Java文件,添加上注解@Compoent,然后创建了bookServlet。测试输出bookServlet,发现控制台不停的输出,陷入了无限循环,问是怎么回事?????
答:当你运行test2()这个方法,单元测试Junit会创建一个IOCTest对象,创建IOCTest对象的时候,会new ioc 容器,ioc容器一但new了,启动就会扫描所有的组件,扫描所有组件就会为每一个组件创建对象,创建到IOCTest的时候又发现要new 一个ioc容器。ioc容器一启动又来扫描所有组件,循环反复
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
根据上面错误的实例,引入spring的单元测试。
故事背景:在测试getBean的时候,要写:
BookServlet bean = (BookServlet) ioc.getBean(“bookServlet”);
很麻烦。所以引入了spring的单元测试。
- 使用Spring的单元测试
- 1、导包:Spring的单元测试包 spring-test-4.3.9.RELEASE.jar
- 2、@ContextConfiguration(locations = “”)使用它来指定Spring的配置文件的位置
- 3、@RunWith指定哪种驱动进行单元测试,默认就是Junit
@RunWith(SpringJUnit4ClassRunner.class) -
使用Spring的单元测试模块来执行标了@Test注解的测试方法
-
以前Test注解是由Junit来执行的
-
好处:我们不用ioc.getBean()来获取组件了,直接@Autowired组件