首页 » 技术分享 » Spring DI(依赖注入)注解篇

Spring DI(依赖注入)注解篇

 

1 课程内容介绍

我之前写的的一篇博客Spring核心功能DI(依赖注入)xml篇主要介绍了如何通过配置xml的方式来实现依赖注入,今天我们来介绍如何通过注解方式完成我们的依赖注入操作。

2 注入基本类型

  1. 创建用户类为其添加name和age的成员属性并为其提供get set方法(set方法可以没有)
  2. 在User上声明@Component标签将其声明为Spirng的bean
  3. 通过@Value标签为name和age注入具体的值

代码如下:

@Component()
public class UserAnnotation {
	private static Logger log = LoggerFactory.getLogger(UserAnnotation.class);
	@Value(value = "zhuoqianmingyue2")
	private String name;
	@Value(value = "19")
	private Integer age;
	....省略 get and set  方法
}

进行测试:

package cn.zhuoqianmingyue.ioc.di.annotation;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@ContextConfiguration(locations= {"classpath:ioc-di-context.xml"})
public class UserPropertyDITest {
	private static Logger log = LoggerFactory.getLogger(UserPropertyDITest.class);
	@Autowired
	private UserAnnotation userAnnotation;
	@Test
	public void diBaseProperty() {
		log.info(userAnnotation.getName()+"#"+userAnnotation.getAge());
	}
}

在这里插入图片描述

需要注意的是Spirng配置文件ioc-di-context.xml中要声明注解扫描的路径具体配置如下:
<context:component-scan base-package=“cn.zhuoqianmingyue”></context:component-scan> cn.zhuoqianmingyue 你的声明注解的包路径 一般建议用最外层路径

3 注入引用类型

  1. 首先为UserAnnotation 类创建类成员属性CountryAnnotation 并为其添加@Component()将其声明为Spirng的Bean
    具体代码如下:
@Component()
public class CountryAnnotation {
	private String name = "加拿大";

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
  1. 将CountryAnnotation类 声明为UserAnnotation 类的成员属性然后添加get set方法(set方法可以没有),在通过@Autowired标签将其注入到UserAnnotation 类中。
@Component()
public class UserAnnotation {
	@Autowired
	private CountryAnnotation countryAnnotation;
}

进行测试:

	@Test
	public void diClassProperty() {
		log.info(userAnnotation.getCountryAnnotation().getName());
	}

在这里插入图片描述

4 注入List

通过注解注入list set map 需要通过 @Configuration 和@Bean标签来完成。
首先创建声明@Configuration的类 然后创建获取List的方法并在方法上声明@Bean然后在方法内创建的list以及添加list的元素。
具体代码如下:

package cn.zhuoqianmingyue.ioc.di.annotation;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AddressListConfig {
	@Bean(name= {"addressList"})
	public List<String> getString() {
		List<String>  addressList = new ArrayList<String>() {{add("上海");add("广州");}};
		return addressList;
	}
}

在UserAnnotation 类中创建List的成员属性,并为其提供get set方法(set方法可以没有),然后再List成员属性上声明@Autowired
示例代码如下:

@Component()
public class UserAnnotation {
	@Autowired
	private List<String> addressList;
	.....省略get set方法
}

进行测试:

	@Test
	public void diListProperty() {
		List<String> addressList = userAnnotation.getAddressList();
		addressList.forEach((addr)->{
			log.info(addr);
		});
	}

在这里插入图片描述

需要注意的是当我们配置类中有多个@Bean声明的方法时 @Bean标签中的name要和UserAnnotation 类中成员属性名称一定要一致
如果我们将在配置类中添加2个声明@Bean的方法 名称分别为@Bean(name= {“addressList1”}) @Bean(name= {“addressList2”}) UserAnnotation类中成员属性名称为 addressList会报如下错误:
中的addressList改成addressList1报如下错误:Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘java.util.List<java.lang.String>’ available: expected single matching bean but found 2: addressList2,addressList1

5 注入Set

注入Set 和注入List操作方式是一样这里就不过多的阐述了的
具体代码如下:
将自定义Set集合数据交于Spring管理.

package cn.zhuoqianmingyue.ioc.di.annotation;

import java.util.HashSet;
import java.util.Set;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AddressClassSetConfig {
	@Bean("addressClassSet")
	public Set<AddressAnnotation> getAddressClassSet(){
		Set<AddressAnnotation> set = new HashSet<AddressAnnotation>();
		AddressAnnotation addr = new AddressAnnotation();
		addr.setName("重庆");
		AddressAnnotation addr2 = new AddressAnnotation();
		addr2.setName("西藏");
		set.add(addr);
		set.add(addr2);
		return set;
	}
}

在UserAnnotation 声明Set成员属性然后提供get set方法(set方法可以没有), 并为其声明@Autowired注解 将其注入UserAnnotation 中。

@Component()
public class UserAnnotation {
	private static Logger log = LoggerFactory.getLogger(UserAnnotation.class);
	@Autowired
	private Set<AddressAnnotation> addressClassSet;
}

进行测试:

	@Test
	public void diSetHasClassProperty() {
		Set<AddressAnnotation> address2Class = userAnnotation.getAddressClassSet();
		address2Class.forEach((addr)->{
			log.info(addr.getName());
		});
	}

在这里插入图片描述

6 注入Map

注入Map 和注入List和Set操作方式是一样这里就不过多的阐述了的
具体代码如下:
将自定义Map数据集合交于Spring。

package cn.zhuoqianmingyue.ioc.di.annotation;

import java.util.HashMap;
import java.util.Map;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AddressClassMapConfig {
	@Bean("addressClassMap")
	public Map<String,AddressAnnotation> getAddressClassMap(){
		Map<String,AddressAnnotation> map = new HashMap<String,AddressAnnotation>();
		AddressAnnotation addr1 = new AddressAnnotation();
		addr1.setName("北京");
		AddressAnnotation addr2 = new AddressAnnotation();
		addr2.setName("上海");
		map.put("BEIJING", addr1);
		map.put("SHANGHAI", addr2);
		return map;
	}
}

在UserAnnotation 声明Map 成员属性然后提供get set方法(set方法可以没有),并为其声明@Autowired注解 将其注入UserAnnotation 中

@Component()
public class UserAnnotation {
	@Autowired
	private Map<String,AddressAnnotation> addressClassMap;

}

进行测试:

	@Test
	public void diMapHasClassProperty() {
		Map<String, AddressAnnotation> addressClassMap = userAnnotation.getAddressClassMap();
		addressClassMap.forEach((k, v)->{
			System.out.print(" key:"+k+" value:"+v.getName());
		});
	}

在这里插入图片描述
查看源码
下载源码

转载自原文链接, 如需删除请联系管理员。

原文链接:Spring DI(依赖注入)注解篇,转载请注明来源!

0