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

在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名默认为方法名

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

三、自动装配

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

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

1、使用XML使用自动装配

自动装配默认和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然后首字母小写的。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值