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);@Autowiredprivate UserAnnotation userAnnotation;@Testpublic 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 {@Autowiredprivate CountryAnnotation countryAnnotation;
}

进行测试:

 @Testpublic 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 {@Autowiredprivate List<String> addressList;.....省略get set方法
}

进行测试:

 @Testpublic 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);@Autowiredprivate Set<AddressAnnotation> addressClassSet;
}

进行测试:

 @Testpublic 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 {@Autowiredprivate Map<String,AddressAnnotation> addressClassMap;}

进行测试:

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


查看源码
下载源码

Spring DI(依赖注入)注解篇相关推荐

  1. Spring DI(依赖注入)Xml篇

    1 DI(依赖注入)简单介绍 如果您对Spring了解甚少,建议先移步我的另一篇博客Spring核心功能IOC之HelloWorld因为下面的内容是在该文章基础上进行阐述的 .我们可以通过一段简单代码 ...

  2. Spring DI依赖注入讲解

    DI:dependency injection 依赖注入 在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件. public class UserServiceImpl imp ...

  3. Spring DI(依赖注入)

    DI依赖注入 IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源 DI(Dependency Injection)依赖注入,应用程序运行依赖的 ...

  4. 手写Spring DI依赖注入,嘿,你的益达!

    手写DI 提前实例化单例Bean DI分析 DI的实现 构造参数依赖 一:定义分析 二:定义一个类BeanReference 三:BeanDefinition接口及其实现类 四:DefaultBean ...

  5. Spring DI[依赖注入]

    依赖注入(Dependency Injection,简称DI)意思是由容器或者框架将被调用类注入给调用对象,以此来降低调用对象和被调用类之间的依赖关系. 依赖注入主要有2种不同的实现形式: 1. 构造 ...

  6. Spring DI依赖注入方式

    1.构造器注入 2.Set方式注入[重点] 依赖注入:Set注入 依赖:bean对象的创建依赖于容器 注入:bean对象中的所有属性,由容器来注入. [环境搭建] Student package co ...

  7. Spring DI(依赖注入)构造器注入篇

    Spring 在不使用自动装配的方式进行注入需要我们必须为成员属性提供setter方法,这种方式相对比较繁琐,除了setter方法注入方式外,Spring还为我们提供了构造器配置的注入方式. 构造器默 ...

  8. 超级详细!!!Spring、SpringMVC、Mybatis知识点完整版更新!IOD、DI依赖注入、Mybatis配置、SQL、MVC拦截器、Web开发、SSM整合案例。

    Spring Spring框架知识点完整版 上篇,SSM三部曲之一 知识点涵盖:Spring简介IOC控制反转DI依赖注入LombokSPEL配置文件低频知识点注解开发Spring常用注解 链接:ht ...

  9. java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

    IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在.控制权由应用代码中转到了外部容器,控制权的转移是所谓反转.Io ...

最新文章

  1. OpenCV 多层感知器训练代码示例
  2. 傻瓜都能看懂的高并发量服务器架构
  3. 新年第一赛,提交BUG奖励多
  4. 自己写的简易多任务系统---基于pic18fxxx
  5. char装cstring_VC中char*转换为CString
  6. ffmpeg 编译成功,Mark一下
  7. struts2中的constant配置详解
  8. python用于数据分析的包主要有哪些_大数据中用于硬核数据分析最适合的语言和工具包...
  9. nginx reload报错 ---nginx: [alert] kill(1668, 1) failed (3: No such process)
  10. 推荐系统实践--第七章:推荐系统实例 第八章:评分预测问题
  11. php用什么打开_php文件怎么打开,用什么软件打开php文件
  12. HTTP报文(这篇讲得比较详细)
  13. 机器学习实战:决策树-隐形眼镜
  14. 主引导记录MBR的结构和作用
  15. java 1.8下载_jre1.8官方下载-JAVA运行环境(jre8 64位)1.8.0.25 官网最新版【离线版】下载_东坡手机下载...
  16. polymorphic-associations多态关联实例 ruby on rails
  17. 原型图是什么?如何画原型图
  18. Eclipse快捷键,IDEA中使用Eclipse快捷键
  19. 淘宝网页显示不正常,其它网站正常显示---解决办法
  20. SpringBoot全局异常处理

热门文章

  1. idea 热部署时 tomcat处 没有update classes and resource 选项
  2. Spring(一)概述
  3. linux fork脚本,在Shell脚本中调用另一个脚本的三种方式讲解
  4. OpenShift 4 之AMQ Streams(1) - 多个Consumer从Partition接收数据
  5. 如何为项目和产品提供资源——优化工作时间、激励团队和预算
  6. Emulator 29.2.12 稳定版发布,启用 Google Maps UI
  7. 使用哪种关机方式后再启动计算机时间最长,有没有哪一种软件可以使电脑在设置好时间后自动开关机...
  8. xml可以打包成jar吗_国内飞机上可以带化妆品吗 坐飞机怎么打包化妆品
  9. iframe 禁止打开新窗口_打开新窗口的安全和性能问题
  10. ubuntu vim保存退出命令_【学员分享】程序员效率神器,最常用VIM插件安装大全...