1.Spring提供了三种装配bean的方式:

2.自动装配bean:

3.通过Java代码装配bean

4.通过XML装配bean


前言:创建对象的协作关系称为装配,也就是DI(依赖注入)的本质。而在Spring容器中对bean的创建时就需要对它所依赖的对象进行注入装配。


1.Spring提供了三种装配bean的方式

  1. 在XML中进行显示配置;
  2. 在Java中进行显示配置;
  3. 隐式的bean发现机制和自动装配;

注:三种装配方式可以结合使用,但是推荐首选第3种自动装配,之后选用Java进行装配,最后选用XML进行装配。


2.自动装配bean

自动装配优势:

  • 便利,自动化装配,隐式配置代码量少。

自动装配限制:

  • 基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。
  • 装配依赖中若是出现匹配到多个bean(出现歧义性),装配将会失败。

Spring实现自动装配两个步骤:

  • 组件扫描(component scanning):Spring会扫描@Component注解的类,并会在应用上下文中为这个类创建一个bean。
  • 自动装配(autowiring):Spring自动满足bean之间的依赖。

  使用到的注解:

  • @Component:表明这个类作为组件类,并告知Spring要为这个类创建bean。默认bean的id为第一个字母为小写类名,可以用value指定bean的id。
  • @Configuration:代表这个类是配置类。
  • @ComponentScan:启动组件扫描,默认会扫描所在包以及包下所有子包中带有@Component注解的类,并会在Spring容器中为其创建一个bean。可以用basePackages属性指定包。
  • @RunWith(SpringJUnit4ClassRunner.class):以便在测试开始时,自动创建Spring应用上下文。
  • @ContextConfiguration:告诉在哪加载配置。
  • @Autowired:将一个类的依赖bean装配进来。

  代码实现:

  播放器接口:

public interface CDPlayer {// 播放器
void play();
}

  唱片接口:

public interface CDDisk {// 唱片
void sing();
}

  实现播放器接口的类:

import org.springframework.stereotype.Component;

@Component
public class MediaPlayer implements CDPlayer {
private CDDisk cd;
   @Autowired
public MediaPlayer(CDDisk cd){
this.cd = cd;
}
@Override
public void play() {
cd.sing();
}
}

  实现唱片接口的类:

import org.springframework.stereotype.Component;

@Component
public class HuaHua implements CDDisk {
private String title = "烟火里的尘埃";
private String singer = "华晨宇"; @Override
public void sing() {
System.out.println(title + "_" + singer);
}
}

  Java配置类:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; @Configuration
@ComponentScan
public class CDPlayerConfig {
}

  测试类:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; // SpringJUnit4ClassRunner测试用,测试开始的时候自动创建Spring的应用上下文。
@RunWith(SpringJUnit4ClassRunner.class)
// 测试用,去指定类加载配置
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDTest {
@Autowired
private CDPlayer cdPlayer; @Test
public void test() {
cdPlayer.play();
}
}

  测试结果:


3.通过Java代码装配bean

  优点:

  • 可以实现基本数据类型的值、字符串字面量、类字面量等注入。

  使用到的注解:

  • @Bean:默认情况下配置后bean的id和注解的方法名一样,可以通过name属性自定义id。
  • @ImportResourse:将指定的XML配置加载进来
  • @Import:将指定的Java配置加载进来。
  • 注:不会用到@Component与@Autowired注解。

  代码实现:

  播放器接口与唱片接口:

public interface CDPlayer {// 播放器
void play();
}
public interface CDDisk {// 唱片
void sing();
}

  实现播放器的类:

public class MediaPlayer implements CDPlayer {
private CDDisk cd;

   @Autowired
public MediaPlayer(CDDisk cd){
this.cd = cd;
}
@Override
public void play() {
cd.sing();
}
}

  实现唱片的类:

import java.util.List;

public class HuaHua implements CDDisk {
private String title;
private String singer;
private List<String> tracks; // 注入字面量
public HuaHua(String title, String singer, List<String> tracks) {
this.title = title;
this.singer = singer;
this.tracks = tracks;
} @Override
public void sing() {
System.out.println(title + "_" + singer);
for (String track : tracks) {
System.out.println(track);
}
}
}

  总配置类(将指定的配置类组合到一起):

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; @Configuration
// 将指定配置类组合到一起
@Import({CDPlayerConfig.class, CDDiskConfig.class})
public class SoundSystemConfig {
}

  播放器的配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class CDPlayerConfig {
private CDDisk cd; @Bean
public CDPlayer cdPlayerConfig(CDDisk cd) {
return new MediaPlayer(cd);
}
}

  唱片配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList; @Configuration
public class CDDiskConfig {
@Bean
public CDDisk cdDisk() {
return new HuaHua("专辑", "华晨宇", new ArrayList<String>() {{
add("烟火里的尘埃");
add("国王与乞丐");
add("齐天");
add("我的滑板鞋2016");
}});
}
}

测试类:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; // SpringJUnit4ClassRunner测试用,测试开始的时候自动创建Spring的应用上下文。
@RunWith(SpringJUnit4ClassRunner.class)
// 测试用,去指定类加载配置
@ContextConfiguration(classes = SoundSystemConfig.class)
public class CDTest {
@Autowired
private CDPlayer cd; @Test
public void test() {
cd.play();
}
}

  测试结果:


4.通过XML装配bean

  优点:什么都能做。

  缺点:配置繁琐。

  使用到的标签:

  • <bean>:将类装配为bean,也可以导入java配置。属性id是为bean指定id,class是导入的类。
  • <constructor-arg>:构造器中声明DI,属性value是注入值,ref是注入对象引用。
  • spring的c-命名空间:起着和<constructor-arg>相似的作用。
  • <property>:设置属性,name是方法中参数名字,ref是注入的对象。
  • Spring的p-命名空间:起着和<property>相似的作用。
  • <import>:导入其他的XML配置。属性resource是导入XML配置的名称。

  代码实现(将Java配置改为了XML配置):

  播放器接口与唱片接口:

public interface CDPlayer {// 播放器
void play();
}
public interface CDDisk {// 唱片
void sing();
}

  实现播放器的类:

public class MediaPlayer implements CDPlayer {
private CDDisk cd; public MediaPlayer(CDDisk cd){
this.cd = cd;
}
@Override
public void play() {
cd.sing();
}
}

  实现唱片的类:

import java.util.List;

public class HuaHua implements CDDisk {
private String title;
private String singer;
private List<String> tracks; // 注入字面量
public HuaHua(String title, String singer, List<String> tracks) {
this.title = title;
this.singer = singer;
this.tracks = tracks;
} @Override
public void sing() {
System.out.println(title + "_" + singer);
for (String track : tracks) {
System.out.println(track);
}
}
}

  测试类:

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class CDTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("soundsystem.xml");
CDPlayer cd = context.getBean(CDPlayer.class);
cd.play();
}
}

  总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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--引入cdplayer-config.xml的配置-->
<import resource="cdplayer-config.xml"/>
</beans>

  播放器的XML配置(将唱片的XML配置引入):

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--引入classpath:cd-config.xml的配置-->
<import resource="classpath:cd-config.xml"/>
<!--Spring的c命名空间写法,cd为构造器中参数-->
<bean id="mediaPlayer" class="com.qsh.soundsystem.MediaPlayer" c:cd-ref="huahua"/>
</beans>

  唱片的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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--使用<constructor-arg>元素-->
<bean id="huahua" class="com.qsh.soundsystem.HuaHua">
<constructor-arg value="专辑"/>
<constructor-arg value="华晨宇"/>
<constructor-arg>
<list>
<value>烟火里的尘埃</value>
<value>国王与乞丐</value>
<value>齐天</value>
<value>我的滑板鞋2016</value>
</list>
</constructor-arg>
</bean>
</beans>

  

Spring对Bean装配详解的更多相关文章

  1. Spring Bean装配详解(五)

    装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中. 大部分场景下,我们都会使用 Appl ...

  2. Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】

    自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器中注册了,要怎么去区分对哪一个Bean进行注入呢? 如下情况, ...

  3. Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

    通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了 ...

  4. 面试阿里,字节,美团必看的Spring的Bean管理详解

    IOC容器 工厂只负责创建对象,而Spring当然不仅仅是一个对象工厂,其核心是一个对象容器,其具备控制反转的能力,所以也称为IOC容器. 帮助我们存放对象,并且管理对象,包括:创建.销毁.装配,这样 ...

  5. Spring学习(五)bean装配详解之 【XML方式配置】

    一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原则 最优先:通过隐式 Bean 的发现机制 ...

  6. Spring的bean创建详解

           IoC容器,又名控制反转,全称为Inverse of Control,其是Spring最为核心的一个组件,其他的组件如AOP,Spring事务等都是直接或间接的依赖于IoC容器的.本文主 ...

  7. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  8. Spring 2.5配置文件详解(转)

    http://book.51cto.com/art/201004/193743.htm 6.2.3  Spring 2.5配置文件详解 Spring配置文件是用于指导Spring工厂进行Bean生产. ...

  9. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

随机推荐

  1. Python 中 __all__ 的作用(转)

    之前看代码每次遇到import *时就会特别蒙,看到这篇文章一下子就弄明白了,原文地址:https://www.cnblogs.com/alamZ/p/6943869.html 1.测试文件foo.p ...

  2. 手动添加jar包到本地maven仓库(已测)ok

    很多时候我们需要的jar包在maven仓库上没有 我们可以自己找到这个jar包,但是怎么通过在pom文件配置使用呢? 需要我们手动将本地的jar包添加到本地maven仓库. 前提是已经配置好maven ...

  3. web java -- 连接池 -- 概述

    1. 连接池的实现原理 1. 创建连接池 首先要创建一个静态的连接池.这里的“静态”是指池中的连接时在系统初始化时就分配好的,并且不能够随意关闭.Java 提供了很多容器类可用来构建连接池,例如Vec ...

  4. 【死磕jeesite源码】Jeesite配置定时任务

    一.主要是注意XML文件中设置3个地方和类文件中配置 第一步配置: 第二步配置:注解扫描 第三步配置:开启任务 类中注解配置:如下 @Service 或者Component @Lazy(false) ...

  5. linux后台执行命令:&和nohup

    当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件.对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时间段运行(例如凌晨).为 ...

  6. jenkins实战(二):构建自由风格的maven项目

    本系列打算全面介绍jenkins的常规使用,这是第二篇,之前的文章在: jenkins实战(一):war安装及插件安装 一.新建项目 1.新建项目 此处我们打算新建自由风格项目,见下图. 值得注意的是 ...

  7. Android手机用KSWEB搭建Web服务器成功安装WordPress

    之前部落分享的几个免费Web服务器软件都是用来安装在本地电脑上,搭建Apache.PhpMyAdmin.MySQL等网站运行环境,然后我们就可以在电脑上测试运行Wordpress.Discuz! 论坛 ...

  8. javascript定时器使用

    使用定时器实现JavaScript的延期执行或重复执行 window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval.其中前者可 ...

  9. maven子项目的springboot配置

    正常来说一个maven子项目的parent是父项目,而不是直接继承,这时候就需要改下配置 默认生成的代码入下: <?xml version="1.0" encoding=&q ...

  10. 10.21CRM项目(01)

    2018-10-21 13:35:19 crm第一天!放上初始源码! 后面等做完最后一天的手放上所有源码! 越努力越幸运!永远不要高估自己! 注意 多层for循环的时候,切记,不要名字重复!啦!!!! ...