Spring bean 装配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yzy199391/article/details/87805922

装配 bean

1. 自动化装配

@Component

告知Spring为被注解的类创建bean
> 为bean命名:
> + Spring为Bean默认命名为类名首字母小写
> + @Component(“XXX”)
> + @Named(“XXX”)

@ComponentScan

组件扫描默认不可用,需用此注解显式配置

设置组件扫描基础包:

  • 默认以配置类(带@Configuration)所在的包为基础包
  • @ComponentScan({"XXX", "XXX2"})/@ComponentScan(basePackages = {"XXX", "XXX2"})指定基础包,使用String作为value值,类型不安全
  • @ComponentScan(basePackageClasses = {XXX.class, XXX2.class}) 使用类来作为value值,这些类所在的包将作为基础包;

注:
也可以在包中创建仅用于扫描的空标记接口,使用其作为value值;

@Autowire

自动装配,将已创建的bean自动注入到当前类中,可用于:

  • 构造器
    @Autowired
    public CDPlayer(CopactDisc cd){
        this.cd = cd;
    }
> + 属性的Setter方法
    @Autowired
    public void setCompactDisc(CopactDisc cd){
        this.cd = cd;
    }
> + 类的任何方法上
    @Autowired
    public void insertDisc(CompactDisc cd){
        this.cd = cd;
    }

自动装配结果:

  • 有且只有一个bean匹配依赖需求,将其装配进来
  • 没有匹配的bean,创建应用上下文时,Spring抛出异常;若要避免,将@Autowired的required属性设置为false,此时,要装配的bean为null,需要代码进行null检查
  • 多个匹配的bean,Spring抛出异常

@Named 和 @Inject

@Inject注解来源于java依赖注入规范,大部分情况下可与@Autowired互换

2. 通过代码装配Bean

若想将第三方库中的组件装配到应用中,无法添加自动扫描和装配的注解,此时,需要采用显式装配的方式。

XML

javaConfig

更强大、类型安全、对重构友好

  • 不应该包含任何业务逻辑
  • 不应该侵入到任何业务逻辑代码中(不和其他类发生关联)
  • 通常放到单独的包中

创建一个配置类

import org.springframework.context.annotation.Configuration

@Configuration//表明这个类是配置类
public class TestConfig {
}

@Bean

声明一个简单bean

此注解告诉Spring:

  • 被其标记的方法返回的对象,要注册为Spring上下文中的bean;
    方法体中包含最终产生bean实例的逻辑.
@Bean
public BeanObject createBean(){
    return new BeanObject();
}
  • Bean的id默认和被注解的方法名一样,支持重命名,使用Bean注解的name属性

Bean注入

  • 方式1: 引用创建Bean的方法
    eg:
    若要在BeanObject2中注入BeanObject1,如下
@Bean
public BeanObject2 inject(){
    return new BeanObject2(createBean());
}

@Bean
public BeanObject2 inject2(){
    return new BeanObject2(createBean());
}

Spring会拦截所有对createBean()方法的调用,并确保直接返回该方法所创建的bean;
Spring默认是单例的,上述代码中,两个BeanObject2的bean中注入的是同一个BeanObject1的bean

  • 方式2: 请求一个实现类bean的接口类型作为参数
/**假设BeanObject是接口BeanObject1Interface的实现类
**/
@Bean
public BeanObject2 inject(BeanObject1Interface object1){
   return new BeanObject2(object1); 
}

这是引用其他bean的最佳选择,不要求将BeanObject1Interface声明到同一个配置类中,甚至没要求其必须在javaConfig中声明,可以通过组件扫描或xml进行配置。不管接口是采用什么方式创建出来的,Spring都会将其传入到配置方法中,用来创建BeanObject2 bean。

另外,除了构造器,我们还可以使用任何java功能来产生bean实例,比如setter方法等。

3. XML装配

Spring Tool Suite: https://spring.io/tools
此工具有Eclipse、Visual Studio Code、Atom支持,可帮助我们编写xml配置文件

  • 对强依赖使用构造器注入;对选择性的依赖使用属性注入。

猜你喜欢

转载自blog.csdn.net/yzy199391/article/details/87805922