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. Servlet Listener
  2. 【Linux开发】彻底释放Linux线程的资源
  3. 在线网摘收藏?让Google来吧!
  4. mysql定时sql脚本_定时执行的SQL脚本
  5. Eclipse配置jstl标准标签库详解
  6. 【Flink】使用Flink实现索引数据到Elasticsearch
  7. python的opencv库_Python使用OpenCV
  8. php手机端分页加载,移动端分页加载
  9. 微信浏览器中页面刷新
  10. Android游戏开发入门基础
  11. mac系统 环境变量配置
  12. 软件测试技术+HR面试
  13. 针孔相机模型,鱼眼相机模型,单目标定
  14. 从session里面取得值为null
  15. 88年计算机病毒,读短文回答问题电脑遭病毒侵袭的事件早在1988年就发生过。那时,美国的一个大学把一种叫做“蠕虫”的电脑病毒输入电脑,由于电脑往往是许多部门许多台联在一起而形成网-组卷网...
  16. 北京个人所得税计算方法
  17. Catalan 数之Python演示
  18. php 字符串m5加密解密_PHP加密解密字符串汇总
  19. 很好很强大的六个SEO关键词分析工具
  20. Timestamp Encoding FEDformer_ Frequency Enhanced Decomposed Transformer for Long-term Series Forecas

热门文章

  1. java+txt+词语+次数_Java练习2--读取txt文件统计考勤次数并写入一个txt文件中
  2. java list 元素去重_小猿圈Java开发之list按照元素某个字段去重详解
  3. OpenShift 4 Hands-on Lab (8) 基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline
  4. Visual Studio的扩展
  5. mysql视频第一课_MYSQL 第一课
  6. protobuf3 自定义option_Protobuf3语法详解
  7. MVC中controller有什么作用
  8. alt+x+b没反应_Alt键的这几种用法,你一定要知道
  9. 数据库和python的结合_redis数据库及与python交互用法简单示例
  10. java字符串相关知识