Spring实现IOC的思路是提供一些配置信息用来描述类之间的依赖关系,然后由容器去解析这些配置信息,继而维护好对象之间的依赖关系,前提是对象之间的依赖关系必须在类中定义好,比如A.class中有一个B.class的属性,那么我们可以理解为A依赖了B。既然我们在类中已经定义了他们之间的依赖关系那么为什么还需要在配置文件中去描述和定义呢?

Spring官方文档地址:https://docs.spring.io/spring/docs/5.2.1.BUILD-SNAPSHOT/spring-framework-reference/core.html#beans-factory-class

Spring实现IOC的思路大致可以拆分成3点:

  (1)应用程序中提供类,提供依赖关系(属性或者构造方法)

  (2)把需要交给容器管理的对象通过配置信息告诉容器(xml、annotation,javaconfig)

  (3)把各个类之间的依赖关系通过配置信息告诉容器

Spring的注入编码风格有三种,并且三种可以混合使用:

  (1)schemal-based     (实现方式:XML)

  (2)annotation-based (实现方式:annotation注解)

  (3)java-based           (实现方式:configuration注解)

  

Spring的注入方法有2种:

  构造方法、setter方法,在3.0版本时还有接口注入,因为不太人性化,后续的版本不推荐使用了。

1. schemal-based(XML)注入的两种方法:

1.1 构造方法注入

  定义有参数的构造方法:

public class ThingThree {
public ThingThree(ThingOne thingOne, ThingTwo thingTwo){
// ...
}
}

  XML定义注入:

<beans>
<bean id="thingOne" class="com.xxx.ThingOne"/>
<bean id="thingTwo" class="com.xxx.ThingTwo"/>
<bean id="thingThree" class="com.xxx.ThingThree">
<constructor-arg ref="thingOne"/>
<constructor-arg ref="thingTwo"/>
</bean>
</beans>

1.2 setter方法注入

  定义Setter方法:

public class BeanOne {
private BeanTwo beanTwo;
public void setBeanTwo(BeanTwo beanTwo){
this.beanTwo = beanTwo;
}
}

  XML定义注入:

<beans>
<bean id="beanOne" class="com.xxx.BeanOne"/>
<bean id="thingTwo" class="com.xxx.ThingTwo">
<property name="beanOne" ref="beanOne"/>
<bean>
</beans>

  另外XML还可以注入基本属性,比如:

<beans>
<bean id="thingTwo" class="com.xxx.ThingTwo">
<property name="str" value="Hello World"/>
<bean>
</beans>

  如果注入的属性在容器中已经存在,就可以用rel引用;如果不在容器中就用value引用值。bean还支持Map、List、Set的注入,但一般的不会用了。如果XML文件出现了p标签,代表了property,如果出现c标签,代表了constructor。

2. annotation-based (annotation注解)

  bean使用的注解包括:@Component、@Repository、@Service、@Controller、@RestController,@Component是其他几个的父类

  需要注入的类使用注解:@Autowired

  使用annotation还不能独立使用,还需要开启注解,并在XML指定注解的扫描路径,因为Spring为了节省性能,默认是不开启注解的。

XML配置扫描路径:

<!-- 开启扫描功能,这个配置是Spring3.0版本才需要用 -->
<context:annotation-config></context:annotation-config>
<!-- 设置扫描路径、开启扫描,Spring4.0版本之后只用这一个就够了 -->
<context:component-scan base-package="com.xxx"/>

3. java-based(configuration注解)

在声明bean对象上使用注解:@Configuration

需要在bean类声明读取配置文件可以使用:@ImportResource("classpath:spring.xml")

bean上面设置组件扫描路径:@ComponentScan(basePackages = {"com.dxh.finance"})

下面这个其实是java-config、xml、annotation这3种方式混合使用的例子:

@Configuration
@ImportResource("classpath:spring.xml")
@ComponentScan(basePackages = {"com.dxh.finance"})
public class SpringConfig {   @Bean
  public UserBean getBean(){
    return new UserBean();  
  }
}

Spring学习总结(1)-注入方式的更多相关文章

  1. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  2. spring四种依赖注入方式(转)

    spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...

  3. Spring 学习笔记 ----依赖注入

    依赖注入 有三种方式,本文只学习下属性注入. 属性注入       属性注入即通过 setXxx方法()注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入方式是 ...

  4. spring四种依赖注入方式

    一.Set注入 这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringD ...

  5. spring六种种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  6. Spring IOC 三种注入方式

    1.    接口注入 2.    setter注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...

  7. Spring学习笔记--依赖注入

    依赖注入和控制反转:http://baitai.iteye.com/blog/792980出自李刚<轻量级 Java EE 企业应用实战> Java应用是一种典型的依赖型应用,它就是由一些 ...

  8. Spring IOC(DI)之注入方式

    一次被问到IOC的注入方式,当时脑袋一阵混乱,不知道噻.于是google了一下,发现众说纷纭,有说三种的,有说四种的.都滚犊子吧,还是看看官方文档吧. DI exists in two major v ...

  9. Spring IOC三种注入方式(接口注入、setter注入、构造器注入)(摘抄)

    IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转, Spring 框架的核心基于控制反转原理. 什么是控制反转?控制反转是一种将组件依赖关系的创建和管理置于程序外部的技 ...

随机推荐

  1. PE文件格式详解(二)

    0x00 前言 上一篇讲到了PE文件头的中IMAGE_FILE_HEADER结构的第二个结构,今天从IMAGE_FILE_HEADER中第三个结构sizeOfOptionalHeader讲起.这个字段 ...

  2. C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用

    gcov安装 Linux ver: gcov是gcc的自带功能 属于GNU 不用特别安装 Windows ver: 在windows下安装可以使用gcov的gcc 之前试过mingw和Cygwin64 ...

  3. 关于flask(前后端分离)的后端开发的小白笔记整理(含postman,jwt,json,SQLAlchemy等)

    首先是提醒自己的一些唠嗑: 学会劳逸结合,文档看累了可以看视频,动手操作很关键,遇到问题先动脑子冷静地想,不要跟着步骤都不带脑子,想不出来了再查一查!有时候打出来的代码很虚,但是实践不花钱,实践出真知 ...

  4. AutoJS 实现QQ小游戏胡莱三国爬塔

    AutoJS 开发文档参考 环境 安卓QQ 胡莱三国小游戏 AutoJS APP 使用方法 安装AutoJs,打开无障碍模式,进入到胡莱三国小游戏,在Autojs中执行脚本 代码 "auto ...

  5. C++main函数与命令行参数,退出程序

    本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs-2019 (除动态链接库d ...

  6. python面试题七: mysql数据库

    ---------------------------------------------------------------------------------------------------- ...

  7. node最简单的本地服务搭建

    **1.首先需要安装node** [node下载链接](http://nodejs.cn/download/)**2.需要安装http的镜像文件** npm install http-server - ...

  8. 评测Loki日志工具

    评测Loki日志工具 目录 评测Loki日志工具 部署Loki 配置grafana 总结: 优势: 劣势: 本文仅对Loki进行简单评测,不涉及原理和细节. 部署Loki Loki是grafana团队 ...

  9. vue : 本地调试跨域问题的解决办法:proxyTable

    本来我是不想写的,但为了加深印象还是写一写吧. ./config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'st ...

  10. DP学习记录Ⅰ

    DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...