问题描述

如果一个Bean需要注入很多属性,每个属性都要显示注入,就会显得很麻烦。

解决方案

让Ioc容器自动为Bean指定引用。

方法之一---在XML配置文件实现自动装配

Car.java

package com.zzj.bean;

public class Car {
	public void start(){
		System.out.println("starting car...");
	}
}

User.java

package com.zzj.bean;

public class User {
	private Car car;
	
	public void setCar(Car car) {
		this.car = car;
	}

	public void startCar(){
		car.start();
	}
}
配置文件

<?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 
           http://www.springframework.org/schema/beans/spring-beans.xsd">
           
       <bean id="car" class="com.zzj.bean.Car"></bean>
       <bean id="user" class="com.zzj.bean.User" autowire="byName"></bean>
</beans>
测试
public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user = (User) context.getBean("user");
		user.startCar();
	}

注:要让spring容器自动装配Bean,需要提供一个参考,这个参考就是bean的autowire属性。

自动装配有3中方式:

1.根据名称自动装配(byName)。因为spring 容器中Bean的名称是唯一的,所以不会产生歧义,推荐使用这种方式。

2.根据类型自动装配(byType)。在Spring容器中可能会找到多个跟需要注入的bean的类型相同的Bean,所以会产生歧义,Spring容器不知道注入哪个Bean,这时会抛出异常。

3.根据构造器自动装配(constructor)。这种方式比较复杂,不做分析。

方法之二---使用注解实现自动装配

修改User.java文件和XML配置文件就行了。

User.java

package com.zzj.bean;

import org.springframework.beans.factory.annotation.Autowired;

public class User {
	@Autowired
	private Car car;

	public void startCar(){
		car.start();
	}
}
注:此时setter方法可以省掉。


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/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context.xsd">
           
       <bean id="car" class="com.zzj.bean.Car"></bean>
       <bean id="user" class="com.zzj.bean.User"></bean>
       <context:annotation-config/>
</beans>
要使用Spring Ioc的注解注入功能,需要引入新的命名空间。
注:@Autowired是spring自带的注解,也可以使用Java原生的注解:@Resource。推荐使用@Resource,更具移植性。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐