欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring IOC学习笔记(二)—— Bean装配方式

程序员文章站 2022-05-14 23:46:57
...

在Spring的使用当中,Spring的容器负责创建程序当中的对象,并通过依赖注入协调好对象之间的关系。创建对象协调对象之间的依赖关系的行为我们称之为装配。Spring为此提供三种主要的装配方式。

public class People {
    private Fruits fruits;
    public void setFruits(Fruits fruits) {
        this.fruits = fruits;
    }
    public void eat(){
       fruits.eat();
    }
}

public class Apple implements Fruits {
    @Override
    public void eat() {
        System.out.println("吃苹果");
    }
}

在Spring实现对象之间装配的前提需要我们声明各对象之间的依赖关系,在People类中声明一个Fruits的依赖关系,构建set方法代表注入关系使用构造器注入

一、基于XML显示装配方式


 <bean id="apple" class="hu.Apple"></bean>
 <bean id="people" class="hu.People">
   <property name="fruits" ref="apple"/>
  </bean>
<!--
<bean class="hu.People"> 没有指定id,默认Bean名hu.People#0
-->

通过显示在XML配置People类和Fruits类关系,Spring容器加载创建Bean将会自动将对象注入到所依赖的对象当中。在Bean的配置当中,如果没有配置bean的id,bean将会根据全限定类名进行命名。#0是一个计数的形式,用以区分其他类型的Bean,如果声明了一个其他类型的People,它会自动递增为#1.

二、基于JAVA的显示装配方式

@Configuration
public class JavaConfig {
    @Bean("apple")
    public Fruits getApple(){
        return new Apple();
    }

    @Bean("people")
    public People getPeople(Fruits fruits){
        People people = new People();
        people.setFruits(fruits);
        return people;
    }

    /*
      @Bean(value = {"people","p"} ,name = {"people","p"})
      @Bean(value = {"people","p"})
    */
}
@Configuration注解表示该java类为一个配置类,在Spring应用上下文创建Bean。

在该配置类中,需要配置一个返回指定对象的实例,在该方法加入@Bean注解,表示该方法返回的对象是一个注册到Spring容器当中的Bean对象。在@Bean注解可以指定Bean名,如果不指定,创建的Bean名默认为方法名

Spring IOC学习笔记(二)—— Bean装配方式

在Bean注解中,存在value和name属性,都可以声明Bean名,但如果同时使用必须保持一致,并且以为属性为数组,表示可以声明为多个Bean名

三、自动装配

在以上两种方法属于手动装配,需

要我们主动声明配置对象之间的依赖关系,但是如果说一个对象依赖的对象过多,就会导致书写大量的配置关系。我们在实际开发中大多数情况下都采用自动装配方式。自动化配置中Spring会自动发现应用上下文中所创建的bean,并配置其依赖关系。

1、使用XML使用自动装配

Spring IOC学习笔记(二)—— Bean装配方式

自动装配默认和NO表示为不开启状态。

byType :表示在自动装配中,Spring会在配置文件中自动搜索一个该类型的Bean,如果找到直接注入。

public class People {
    private Fruits fruits;
}
public class Apple implements Fruits {
}

     default-autowire="byType">

    <bean id="apple" class="hu.Apple"></bean>
    <bean class="hu.People">
        <!-- 不再使用显示配置  -->
    </bean>

byName:表示在自动装配中,Spring查找与需要自动装配的属性同名的bean,如果找到直接注入。如果一个bean定义被设置为按名称自动装配并且包含一个x属性,也就是说它需要一个setX方法,那么Spring将查找一个名为的bean定义,x并使用它来设置该属性。在文件中多个相同类型时,往往需要使用命名来区分不同的实现类。

   http://www.springframework.org/schema/context/spring-context.xsd"
        default-autowire="byName">
    <bean id="apple" class="hu.Apple"></bean>
    <bean id="orange" class="hu.Orange"></bean>
    <bean class="hu.People">
        <!-- 不再使用显示配置  -->
    </bean>

public class People {
    private Fruits apple;
    public void setApple(Fruits fruits) {
        this.apple = fruits;
    }
    public void eat(){
       apple.eat();
    }
}

由于在配置文件中设置多个Fruit类型的bean,使用BuName的方式,在People类中定义一个set方法,byName匹配的方式是将方法名去掉set然后首字母小写的。

constructor

public class People {
    private Fruits apple;
    public People(Fruits orange) {
        this.apple = orange;
    }
}

   
    default-autowire="constructor">

    <bean id="apple" class="hu.Apple"></bean>
    <bean id="orange" class="hu.Orange"></bean>
    <bean class="hu.People">
        <!-- 不再使用显示配置  -->
    </bean>
</beans>

通过构造器的方式类似于byType但适用于构造函数参数。如果容器中不存在构造函数参数类型的一个bean,便会报错。

2、使用注解完成自动装配

简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。我们也可以借助Spring的@Autowired注解或@Resource进行自动装配。

@Service
public class Apple implements Fruits {
    @Override
    public void eat() {
        System.out.println("吃苹果");
    }
}

@Service
public class Orange implements Fruits {
    @Override
    public void eat() {
        System.out.println("吃橘子");
    }
}

@Service
public class People {
    @Resource
    private Fruits orange;

   /**
    private Fruits orange;
    @Resource
    public void setOrange(Fruits apple) {
        this.orange = apple;
    }
   **/
    
}

@Configuration
@ComponentScan
public class JavaConfig{
}
 

@Autowired注解或@Resource可以标注在属性或者是set方法上,如果标注在属性上,在使用byname方法去搜索Bean使用属性名匹配,如果标注在方法上,配的方式是将方法名去掉set然后首字母小写的。

 

 

 

 

相关标签: 开发框架