Spring依赖注入之Java注解

基于Java的注解,是在类级别上定义beans,在方法级别上定义bean。和自动注解一样,可以减少xml的配置。

1. xml配置

在xml配置文件中添加自动扫描的配置:

<context:component-scan base-package="org.yousharp"/>

该配置不仅扫描构造型注解(@Controller, @Service, @Repository, @Component),也会扫描@Configuration注解。

2. 定义dao类和service类

dao类是service类的一个属性,是需要注入的对象。

public class VideoService {
    SaveVideoInfoDao saveVideoInfoDao;
    public VideoService() {
    }

    public VideoService(SaveVideoInfoDao saveVideoInfoDao) {
        this.saveVideoInfoDao = saveVideoInfoDao;
    }
    public void saveVideoInfo(String info) {
        saveVideoInfoDao.printMesg(info);
    }
}

public class SaveVideoInfoDao {
    public void printMesg(String message) {
    	System.out.println("saving video info....");
    }
}

dao类和service类就是两个很普通的java类,没有任何注解依附。

3. 定义一个配置类

单独定义一个配置类(在自动扫描包下),在类上使用@Configuration注解,在方法上使用@Bean注解:

	@Configuration
	public class AppConfig {

		@Bean
		public SaveVideoInfoDao saveVideoInfoDao() {
			return new SaveVideoInfoDao();
		}

		@Bean
		public VideoService videoService() {
			VideoService videoService = new VideoService(saveVideoInfoDao());
			return videoService;
		}
	}

@Configuration注解等价于xml配置中的beans,该注解告诉Spring该类中包含一个或多个bean的定义;@Bean注解等价于xml配置中的bean,将方法返回的对象定义为bean,方法名为bean的id;上面第一个bean的定义等价于xml配置:

<bean id="saveInfoDao" class="org.yousharp.AppConfig"/>

第二个bean的定义通过构造函数实现依赖注入,其含义等价于xml配置:

<bean id="videoService" class="org.yousharp.AppConfig">
	<constructor-arg name="videoService" ref="saveVideoInfoDao">
</bean>

这里是通过构造函数实现注入,当然也可以通过setter方法实现注入。在VideoInfoService中去掉带参数的构造函数,同时对属性saveVideoInfoDao添加setter方法,修改AppConfig类中的第二个bean为:

	@Bean
	public VideoService videoService() {
		VideoService videoService = new VideoService();
		videoService.setSaveVideoInfoDao(saveVideoInfoDao());
		return videoService;
	}

4. Controller中引用

Controller里和使用xml配置bean和自动注解一样,通过bean的id获取对bean的引用。这里VideoService的bean的id为videoService。

	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

	public void execute() {
		VideoService videoService = (VideoService) context.getBean("videoService");
		String videoInfo = "vrs video info";
		videoService.saveVideoInfo(videoInfo);
	}

参考资料