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然后首字母小写的。
上一篇: Spring bean循环依赖
推荐阅读
-
Spring学习笔记第二天,Spring基于xml或注解的IOC以及IOC的案例
-
荐 Spring 学习笔记①:IoC容器、Bean与注入
-
Spring基础使用(一)--------IOC、Bean的XML方式装配
-
spring-依赖注入(DI)&控制反转(Ioc)&Bean的三种装配方式
-
Spring IOC容器装配Bean_基于注解配置方式
-
Spring-Cloud学习笔记(二)RestTemplate和Feign的使用方式以及部分注解的使用
-
Spring IOC容器装配Bean_基于XML配置方式
-
Spring学习二:通过java配置装配Bean
-
Spring学习二:通过java配置装配Bean
-
(二)再识spring之IOC:基于XML实例化和注入Bean的方式介绍