概述
spring 的核心依赖注入:创建应用对象之间协作关系的行为称为装配(wiring),他有以下几种方式:
自动装配(结合注解)
Java中显示的配置
在xml中显示的配置
这三个方案,选哪一个都是可以的,能用自动配置的就有自动配置,对于一些框架的配置我们不能修改别人的源码,必要的xml显示配置也是必要的,而且我们也可以三个方案同时使用,一些Bean自动装配,一些Bean Java配置,一些Bean xml配置。 对于显示配置,多少有些不方便还是自动装配最简便,所以我们先讲第一个自动化配置
创建项目我们首先新建一个meavn项目,我这里用的是idea,推荐大家使用,超爽的开发工具。 添加spring 和 test需要的依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>3.2.0.RELEASE</version> <type>jar</type> </dependency>源码均在github上可以获取,地址会在文末给出,欢迎加Start
自动化配置 创建beanpring实现自动装配的方式: 通过组建扫描发现应用上下文所创建的bean并通过自动装配创建bean的依赖关系。
组件扫描 component-scan
自动装配 Autowire
在当今社会中,交通工具有多种多样,比如公交车、火车、飞机等。人们可以乘坐不同的司机驾驶的不同交通工具来出行。为了演示spring的实例,我们先建立Car接口:
/** * author yalunwang * 车抽象接口 */ public interface Car { void notice(); }其中notice方法代表车到站提醒。这样任意的交通工具都可实现接口Car,代码降低耦合。 这里我们先定义一个BusCar(公交车):
/** * author yalunwang * 公交车 */ @Component public class BusCar implements Car { private String carName="浦东25路"; @Override public void notice() { System.out.println(this.carName+"南京西路到了"); } }@Component注解会告诉spring此类需要spring 创建该bean注册到 ioc容器中。因为组件扫描默认是不开启的,所以我们需要开启扫描,这样spring才会去寻找带有@Component的类并创建该bean。spring创建bean的时候都会给定一个ID,BusCar类的ID默认为busCar,会把类名的第一个变为小写。如果想指定ID为bus的可以这样写:@Component(value = "bus")或@Component("bus")。]
告知spring开启自动扫描有两种办法:
在xml里配置
在javaconfig里配置
首先来看xml:
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/context "> <context:component-scan base-package="com.yalunwang.autowiring"></context:component-scan> </beans><context:component-scan>元素就是开启自动扫描,其中的base-package是告诉spring扫描com.yalunwang.autowiring包以及其下的所有子包中带有@Component注解的类,并为之创建。
我们再来看在java配置类里如何配置:
@Configuration @ComponentScan(basePackages = "com.yalunwang.autowiring") public class PeopleCarConfig { }@ComponentScan与xml中的 <context:component-scan>起到相同的作用。其中如果不加basePackages ,即表示以此配置类所在的包。
我们可以在单元测试里测试一下:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = PeopleCarConfig.class) public class TestCar { @Autowired private BusCar busCar; @Test public void testCar() { System.out.println(busCar); } }结果输出: com.yalunwang.autowiring.BusCar@1c3d5104
@RunWith(SpringJUnit4ClassRunner.class) 会自动创建spring上下文
@ContextConfiguration 加载配置