2.1自动化装配bean

Posted Java全栈从0到1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.1自动化装配bean相关的知识,希望对你有一定的参考价值。

Spring配置bean可选方案

1、XML中进行显式配置

2、Java中进行显式配置

3、隐式的bean发现机制和自动装配

建议是尽可能使用自动配置,减少显式配置;当需要显式配置,推荐使用类型安全的JavaConfig;最后再使用XML配置

自动化装配bean

Spring通过2个角度完成自动化装配:

组件扫描(Component Scanning):Spring自动发现应用上下文中所创建的bean

自动装配(Autowiring):Spring自动满足bean之间的依赖

@ComponentScan

Spring组件扫描默认是关闭的,可以通过Java设置或者是XML设置来开启

会搜索配置类所在的包以及子包

Java配置形式:

package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CDPlayerConfig { 
}

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:context="http://www.springframework.org/schema/context"
  xmlns:c="http://www.springframework.org/schema/c"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  <context:component-scan base-package="soundsystem" />

</beans>

指定组件扫描的基础包

可以通过类名,或者包中的类或接口

@ComponentScan("soundsystem")
@ComponentScan(basePackages = "soundsystem")
@ComponentScan(basePackages = { "soundsystem", "video" })
@ComponentScan(basePackages = { CDPlayer.class, MediaPlayer.class })

推荐在包中创建标识接口,这样在重构系统的时候,不会对这个配置造成影响

@Component

标明这个类是一个组建类,告知Spring要为这个类创建bean

也可以用@Named注解(Java依赖规范/Java Dependency Injection 提供)代替,但一般不推荐

package soundsystem;
public interface CompactDisc {
  void play();
}
package soundsystem;
import org.springframework.stereotype.Component;
@Component
public class SgtPeppers implements CompactDisc {
  private String title = "Sgt. Pepper‘s Lonely Hearts Club Band";  
  private String artist = "The Beatles";
  public void play() {
    System.out.println("Playing " + title + " by " + artist);
  }
}

可以为bean命名id(默认自动生成id,是类名首字母小写)

@Component("myName")

@Autowired

 可以用在类中任何方法内(包括构造方法、setter)

这样,调用这个方法的时候,Spring就会去查找适合方法参数的bean并装配到方法中

如果找不到,或者有多个符合,则会报错

可以通过@Autowired(required=false)使找不到时不报错,那么传入的参数值为null,需要自己手动处理代码

可以使用@Inject(Java依赖规范/Java Dependency Injection 提供)代替,但一般不推荐

package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
public class CDPlayer implements MediaPlayer {
  private CompactDisc cd;
  @Autowired
  public CDPlayer(CompactDisc cd) {
    this.cd = cd;
  }
  public void play() {
    cd.play();
  }
}

以上是关于2.1自动化装配bean的主要内容,如果未能解决你的问题,请参考以下文章

从头认识Spring-2.1 自动装配-byType

Spring学习笔记——装配Bean

第2章 装配bean

《spring实战》学习笔记-第二章:装配bean

02 装配Bean

Spring装配bean--02通过Java代码装配bean