全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Spring依赖注入的三种方式小结

Spring的主要特性包括IOC和DI,其中DI是IOC的基础。在以前的Spring使用过程中大部分都是使用XML配置文件显式配置spring组件,导致大量的XML配置文件以及冗余的XML配置代码。阅读《Spring in Action》后总结Spring的DI功能的三种主要装配方式以及混合装配方式

根据注解自动装配

Spring中有非常丰富的注解,通过这些注解可以方便地配置Spring容器,使得Spring容器可以自动识别相关Bean并做自动注入装配。

使用注解

  • @Component注解:标注一个类,标识此类为一个Java Bean。
  • @Configuration注解:标注一个类,标识此类为一个Java配置类
  • @ComponentScan注解:标注一个类,用以配置扫描的包名称

示例代码

这里使用一个最简单的例子来展示自动装配的配置,代码结构如图所示。

ActionConfig类用于做全局配置,我们知道,一名骑士一般都会有一匹马,所以这里Horse和Knight类作为Java Bean被Spring容器创建,并将Horse类的一个bean注入到Knight中。所以在Horse和Knight中必须使用@Component注解进行修饰。

Knight代码:

package entities;

import org.springframework.stereotype.Component;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Component
public class Knight {
  private Horse horse;

  Knight(Horse horse){
    this.horse = horse;
  }

  public void ride(){
    horse.bark();
  }
}

Horse代码:

package entities;

import org.springframework.stereotype.Component;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Component
public class Horse {
  void bark(){
    System.out.println("Horse!!!!");
  }
}

ActionConfig代码:

package config;

import entities.Knight;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
@ComponentScan(basePackageClasses = {Knight.class})
public class ActionConfig {
}

这里的ComponentScan注解内的属性用以注明Knight类所在的包为扫描的基础包。凡是这个基础包及其子包内的标注了@Component的类都将被视为Java Bean,这些Bean被Spring容器创建和管理。

Java配置类装配

从自动装配的代码中,可以看出自动装配是非常简单方便的。Java配置类进行装配的方式是采用对配置类中的方法进行注解标注,实现bean的创建和管理。

还是采用以上的例子,现在我们将上面的自动装配改成Java配置类进行装配。

首先,删掉Knight和Horse中的@Component注解,删掉ActionConfig中的@ComponentScn注解,因为这些注解都是自动装配才需要的。

package entities;


/**
 * Created by Administrator on 2017/8/3 0003.
 */
public class Knight {
  private Horse horse;

  public Knight(Horse horse){
    this.horse = horse;
  }

  public void ride(){
    horse.bark();
  }
}


package entities;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
public class Horse {
  void bark(){
    System.out.println("Horse!!!!");
  }
}

ActionConfig类:

package config;

import entities.Horse;
import entities.Knight;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
public class ActionConfig {
  @Bean
  public Knight getKnight(){
    return new Knight(getHorse());
  }
  @Bean
  public Horse getHorse(){
    return new Horse();
  }
}

通过@Bean注解对相关的方法进行修饰,Spring就可以知道调用这些方法来构建相应的bean,并注入到依赖的对象中。

XML配置文件装配

使用XML配置文件来装配组件是最为繁琐的,需要对各个bean做一一配置,特别是需要配置构造器或者setter的参数。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

</beans>

以上是一个空的XML配置文件,看一下就知道,XML真实复杂啊...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  <bean id="knight" class="entities.Knight">
    <constructor-arg ref="horse"></constructor-arg>
  </bean>
  
  <bean id="horse" class="entities.Horse"></bean>
</beans>

通过配置两个bean元素,并且通过constructor-arg元素来配置构造函数注入的bean,达到依赖注入的目的。

导入和混合配置

有时候单纯的XML配置或者Java配置不满足我们的需求怎么办呢?Spring支持混合配置的方式来管理bean,通过Java和XML配置的混合,达到你想要的效果。

Java配置中引用Java配置

在配置类中使用@Import注解进行引入另一个Java配置类。

package config;

import entities.Horse;
import entities.Knight;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
@Import(BeautyConfig.class)
public class ActionConfig {
  @Bean
  public Knight getKnight(){
    return new Knight(getHorse());
  }
  @Bean(name = "horse")
  public Horse getHorse(){
    return new Horse();
  }
}

BeautyConfig代码:

package config;

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

/**
 * Created by Administrator on 2017/8/3 0003.
 */
@Configuration
public class BeautyConfig {
  @Bean
  Beauty getBeauty(){
    return new Beauty();
  }
}

在Main中,只需要通过ActionConfig就可以获取到所有的上下文对象。

package main;

import config.ActionConfig;
import entities.Beauty;
import entities.Knight;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
 * Created by Administrator on 2017/8/3 0003.
 */
public class Main {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ActionConfig.class);
    Knight knight = context.getBean(Knight.class);
    knight.ride();
    Beauty beauty = context.getBean(Beauty.class);
    beauty.sleep();
  }
}

这里简单使用Import引入了另一个配置的Java文件,就实现了将多个bean分别配置到多个Java配置类中。

Java配置中引入XML配置

在Java中引入xml配置的基本方法与引入Java代码配置类似,只需要将@Import改为@ImportResource,配上xml的文件地址即可。

@ImportResource("classpath:spring.xml")

以上,就是Java配置spring依赖注入的方法。

XML配置中引入XML配置

同理,在XML配置中引入XML也需要使用Import,但是在XML中是import标签,通过使用import标签导入另一个xml文件。

这里我新建了一个another.xml的文件,用以作为另一个配置文件示例。在原有的spring.xml中加入以下代码:

<import resource="another.xml"></import>

这样就简单导入了anoter.xml配置文件。

XML配置中引入Java配置

乍看之下,在XML中似乎没有标签可以导入Java配置类的,不过任何Java配置类都是一个bean,所以可以通过配置bean标签来导入Java配置类!

<bean class="config.BeautyConfig"></bean>

通过在XML中配置这个Java配置类的bean,就直接导入了在Java配置类中的所有bean,真是神奇!

以下是配置XML的全部代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  <import resource="another.xml"></import>
  <bean class="config.BeautyConfig"></bean>
  <bean id="knight" class="entities.Knight">
    <constructor-arg ref="horse"></constructor-arg>
  </bean>

  <bean id="horse" class="entities.Horse"></bean>
</beans>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Spring依赖注入  # spring三种注入方式  # Spring依赖注入的三种方式实例详解  # Spring依赖注入的两种方式(根据实例详解)  # spring四种依赖注入方式的详细介绍  # 详析Spring中依赖注入的三种方式  # Spring依赖注入(DI)两种方式的示例详解  # 配置文件  # 都是  # 类中  # 多个  # 此类  # 就可以  # 是一个  # 有一  # 一名  # 中有  # 只需  # 可以通过  # 自动识别  # 并将  # 三种  # 都将  # 只需要  # 可以看出  # 要将  # 看一下 


相关文章: 济南网站制作的价格,历城一职专官方网站?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何在万网自助建站平台快速创建网站?  如何快速使用云服务器搭建个人网站?  建站主机CVM配置优化、SEO策略与性能提升指南  如何高效配置IIS服务器搭建网站?  建站之星如何快速更换网站模板?  如何选择可靠的免备案建站服务器?  如何配置WinSCP新建站点的密钥验证步骤?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何在Ubuntu系统下快速搭建WordPress个人网站?  建站之星各版本价格是多少?  如何在Golang中使用replace替换模块_指定本地或远程路径  如何在宝塔面板创建新站点?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  红河网站制作公司,红河事业单位身份证如何上传?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  C++时间戳转换成日期时间的步骤和示例代码  如何在云指建站中生成FTP站点?  如何高效搭建专业期货交易平台网站?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站主机核心功能解析:服务器选择与网站搭建流程指南  北京的网站制作公司有哪些,哪个视频网站最好?  网站制作价目表怎么做,珍爱网婚介费用多少?  黑客如何通过漏洞一步步攻陷网站服务器?  江苏网站制作公司有哪些,江苏书法考级官方网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  宿州网站制作公司兴策,安徽省低保查询网站?  建站主机功能解析:服务器选择与快速搭建指南  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  金*站制作公司有哪些,金华教育集团官网?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  定制建站哪家更专业可靠?推荐榜单揭晓  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何做网站制作流程,*游戏网站怎么搭建?  制作网站的基本流程,设计网站的软件是什么?  Python lxml的etree和ElementTree有什么区别  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在香港服务器上快速搭建免备案网站?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  临沂网站制作企业,临沂第三中学官方网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在Windows 2008云服务器安全搭建网站?  如何快速辨别茅台真假?关键步骤解析  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  北京网页设计制作网站有哪些,继续教育自动播放怎么设置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。