文章目录
- 一、Bean 的作用域
- 二、Bean 的自动装配
- 三、通过注解实现 Bean 的自动装配
一、Bean 的作用域
-
Spring 官网 Bean 的作用域讲解
-
单例(Singleton)作用域:在这种作用域下,容器只会创建一个Bean实例对象,无论该Bean被注入到多少个其它Bean中,它在容器中的实例始终都只有一个。默认情况下,Spring的Bean是单例的。
-
原型(Prototype)作用域:在这种作用域下,每次请求获取该Bean时,容器都会创建一个新的实例对象。这意味着,对于同一个Bean,可以同时存在多个实例。
-
其余的request、session、application、这些只能在web开发中使用到!
-
通过< beans >标签的 scope 属性来控制选择哪种作用域
-
Bean.xml
<!-- 单例模式 --> <bean id="user" class="com.sys.dto.User" c:name="姚青" c:age="24" scope="singleton"/> <!-- 原型模式 --> <bean id="user2" class="com.sys.dto.User" c:name="姚青Max" c:age="10086" scope="prototype"/>
-
-
二、Bean 的自动装配
-
在Spring中有三种装配的方式:
- 在xml中显式的配置:手动配置
- 在java中显式配置:Java 代码配置
- 隐式的自动装配bean【重要】:Bean 的自动装配
在Spring框架中,Bean的自动装配是一种便捷的方式,用于将依赖关系自动注入到Bean中。通过自动装配,Spring可以根据一些规则自动将合适的Bean注入到其他Bean中,从而简化了开发过程。
-
Spring 提供的自动装配方式
- 在配置文件 Bean.xml 中使用< bean >标签的 autowire 属性来指定自动装配的方式。例如,使用autowire="byName"来进行byName方式的自动装配。
-
Spring 提供的自动装配选项:
-
byName :byName 方式是根据 Bean 的名称进行装配
- 代码示例
-
实体类:Cat 、Dog、People
public class Cat { public void cry(){ System.out.println("喵"); } }
public class Dog { public void cry(){ System.out.println("汪"); } }
public class People { private Cat cat; private Dog dog; private String name; public Cat getCat() { return cat;} public void setCat(Cat cat) {this.cat = cat;} public Dog getDog() {return dog;} public void setDog(Dog dog) { this.dog = dog;} public String getName() { return name;} public void setName(String name) {this.name = name;} @Override public String toString() { return "People{" + "cat=" + cat + ", dog=" + dog + ", name='" + name + '\'' + '}'; } }
-
Beans.sml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.sys.dto.Cat"/> <bean id="dog" class="com.sys.dto.Dog"/> <!-- 通过 autowire 属性指定 byName 自动装配方式--> <!-- byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的 bean id! 注:需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致。否则会注入失败! --> <bean id="people" class="com.sys.dto.People" autowire="byName"> <property name="name" value="姚青"/> </bean> </beans>
-
测试类
public class MyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); People people = (People) context.getBean("people"); people.getCat().cry(); people.getDog().cry(); } }
-
测试结果:注入成功结果,以及 Bean 指定的 id 和实体类属性名不一致失败的结果
-
- 代码示例
-
byType :byType 方式是根据 Bean 的类型进行装配
-
代码示例:实体类、测试类不变,修改Beans.sml
-
Beans.sml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.sys.dto.Cat"/> <bean id="dog" class="com.sys.dto.Dog"/> <!-- 通过 autowire 属性指定 byType 自动装配方式--> <!-- byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean! 注:需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致! --> <bean id="people" class="com.sys.dto.People" autowire="byType"> <property name="name" value="姚青"/> </bean> </beans>
-
测试结果
当类型不唯一时,会提示报错
运行报错:No qualifying bean of type ‘com.sys.dto.Dog’ available: expected single matching bean but found 2: dog,dog2
-
-
-
-
扩展
-
constructor :constructor 方式是通过构造函数进行装配
-
autodetect :autodetect 方式是根据 byType 和 constructor 两种方式进行自动装配
-