@Autowired 注入同类型的实例
从结果中我们可以看出BusCar被spring创建。我们的自动扫描成功了。
自动装配自动装配就是让spring自动将bean依赖的其他bean注入进去。我们可以使用@Autowired,在上文中的单元测试中我们刚刚使用了。为了演示自动装配我们再新建一个People接口用来抽象人类。
/** * author yalunwang * 人类抽象接口 */ public interface People { void drive(); }drive代表驾驶。 我们再创建一个Man来实现此接口。
/** * author yalunwang * 男人 */ @Component public class Man implements People { private String userName ="小明"; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Autowired private Car car; @Override public void drive() { //System.out.println("driver:"); System.out.println("男司机:" + this.userName); car.notice(); } }drive:要想使车可以跑起来我们需要一个司机,司机驾驶车辆,并提醒乘客到达哪一站了。 所以我们的Man bean现在依赖于Car bean,这时我们再car字段添加注解@Autowired就会自动将Carbean注入进来。
这里注入的方式有很多种可以放到构造器,set方法,字段、其他方法。
@Autowired private Car car; private Car car1; //构造器注入 @Autowired public Man(Car car) { this.car1=car; } private Car car2; public Car getCar2() { return car2; } //set方法注入 @Autowired public void setCar2(Car car2) { this.car2 = car2; }下面我来验证一下
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = PeopleCarConfig.class) public class TestPeople { @Autowired private People people; @Test public void test() { people.drive(); } }输出:
男司机:小明 浦东25路南京西路到了这里可以看出我们的自动装配是通过了。自动扫描配置Bean先告一段落。
Java代码中配置javaconfig类需要添加@@Configuration 注解,要在显示的配置bean我们需要使用@Bean注解
@Configuration public class PeopleCarConfig { @Bean public Car busCar() { return new BusCar(); } }@Bean注解会告诉spring这个方法将返回一个一个对象,并且要注册到spring上下文中。方法体力包含了最终产生bean实例的逻辑。Bean的ID默认是方法的名字,可以通过 @Bean(name="busCar")指定自定义的名字。
装配我们知道人需要开车,Man依赖Car,那么我们如何将car注入到man中呢。
@Bean(name="man") public People man() { return new Man( busCar()); }这样通过使用一个Car类型的实例对象BusCar的构造器构建Man实例,这里需要注意的是busCar()并非实际的方法调用,因为这个方法上加了@Bean注解,spring会拦截对他的调用并直接返回该方法所创建的bean。 我们可以做个实验:
@Configuration public class PeopleCarConfig { private int i=1; @Bean public Car busCar() { i=i+1; System.out.println(i); return new BusCar(); } @Bean(name="man") public People man() { return new Man( busCar()); } @Bean(name="woman") public People woman() { return new Woman( busCar()); } }输出:
2 buscar构造函数 男司机:小明 浦东25路南京西路到了 女司机:小红 浦东25路南京西路到了从这里就可以看出来 busCar()并不会真正的调用,而是直接返回spring创建的bean. 我们也可以通过另外一种方法来注入:
我们再创建一个Woman
public class Woman implements People { private Car car; public Woman(Car car){ this.car=car; } private String userName ="小红"; @Override public void drive() { System.out.println("女司机:" + this.userName); car.notice(); } } public People woman(Car car) { return new Woman( car); }这里woman()方法加了一个Car参数,这里会自动装配一个Car类型的实现类实例。需要注意的是这里Car类型的bean可以通过xml 自动配置 javaconfig配置来进行配置。所以这种方式是最佳的注入方式。 以上我们使用的构造器的方式,其实我们也可以通过set方式等其他任意java方式去创建。
xml配置在javaconfig中配置bean需要加@Configuration,xml配置对应的需要创建一个spring的xml规范文件。取名spring-test.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" xsi:schemaLocation="http://www.springframework.org/schema/beans "> </beans>我们来配置一个bean
<bean class="com.yalunwang.xmlconfig.BusCar" />这个<bean> 配置相当于javaconfig中的@Bean,这时bean的id默认为完全限定名com.yalunwang.xmlconfig.BusCar#0 我们可以指定id: busCar
<bean id="busCar" class="com.yalunwang.xmlconfig.BusCar" />这时spring创建busCar 的时候回自动调用busCar的默认构造函数。
下面我们来看在xml如何里装配
装配bean