Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning

一:Spring配置

1、别名

<!--别名,如果添加了别名,我们也可以使用别名来获取这个对象-->
<alias name="user" alias="user_plus"/>

2、Bean的配置

  1. id:bean的唯一标识符,也就是相当于 对象名称
  2. class:bean对象所对应的全限定类名,-> 包名+ 类名
  3. name:也是别名的意思,但是这个比较高级,可以同时取多个别名 (中间可用空格,逗号等符合隔开)
<bean id="user" class="com.csnz.pojo.User" name="user_high user_anotherName">
<!--使用无参构造创建对象-->
    <property name="name" value="潮汕奴仔"/>
</bean>    

3、import

这个import,一般用于团队开发使用,作用是:将多个配置文件,导入合并为一个
Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning
使用的时候,直接使用总的配置就可以了

二:Bean标签

作用:

用于配置对象让 spring 来创建的。
默认情况下它调用的是类中的无参构造函数如果没有无参构造函数则不能创建成功

属性:

id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。

  • singleton :默认值,单例的.
  • prototype :原型模式,(多例的.),每次从容器中get的时候,都会产生一个新对象
  • request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
  • session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
  • application :将单个bean定义作用于ServletContext的生命周期。
    仅在web感知的Spring ApplicationContext上下文中有效。
  • websocket:将单个bean定义作用于WebSocket的生命周期。
    仅在web感知的Spring ApplicationContext上下文中有效

init-method:指定类中的初始化方法名称。
destroy-method:指定类中销毁方法名称。

三:Bean的作用域及生命周期

单例对象:scope=“singleton”

一个应用只有一个对象的实例。它的作用范围就是整个引用。

生命周期:

对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。

多例对象:scope=“prototype”

每次访问对象时,都会重新创建对象实例。

生命周期:

对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了

四:Bean的自动装配

自动装配是Spring满足bean依赖的一种方式

Spring会在上下文中自动寻找,并自动给bean装配属性

在Spring中有三种装配的方式

  1. 在XML中显式的配置
  2. 在Java中显式配置
  3. 隐式 的自动装配bean

测试 在XML中显式的配置

Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning
cat类

public class Cat {
    public void call(){
        System.out.println("喵呜 ~ ~");
    }
}

dog类

public class Dog {
    public void call(){
        System.out.println("汪汪 ~ ~");
    }
}

person类

public class Person {
    private String name;
    private Cat cat;
    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = 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;
    }
}

application-context.xml文件

<?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="person" class="com.csnz.pojo.Person">
    <property name="name" value="潮汕奴仔"/>
    <property name="cat" ref="cat"/>
    <property name="dog" ref="dog"/>
</bean>
<bean id="cat" class="com.csnz.pojo.Cat"/>
<bean id="dog" class="com.csnz.pojo.Dog"/>

</beans>

测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test{
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
        Person person = context.getBean("person",Person.class);
        person.getCat().call();
        person.getDog().call();
    }

Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning

测试自动装配

ByName自动装配

<!--
    byName:会自动在容器上下文中查找,和自己对象set方法 后面的名称(首字母小写) 对应的 BeanId
-->
<bean id="person" class="com.csnz.pojo.Person" autowire="byName">
    <property name="name" value="潮汕奴仔"/>
<!--    <property name="cat" ref="cat"/>-->
<!--    <property name="dog" ref="dog"/>-->
</bean>
<bean id="cat" class="com.csnz.pojo.Cat"/>
<bean id="dog" class="com.csnz.pojo.Dog"/>

ByType自动装配

<!--
    byName:会自动在容器上下文中查找,和自己对象set方法 后面的名称(首字母小写) 对应的 BeanId
    byType:会自动在容器上下文中查找,和自己对象属性具有相同类型 的 Bean (约束,保证类型全局唯一)
-->
<bean id="person" class="com.csnz.pojo.Person" autowire="byType">
    <property name="name" value="潮汕奴仔"/>
<!--    <property name="cat" ref="cat"/>-->
<!--    <property name="dog" ref="dog"/>-->
</bean>
<bean id="cat" class="com.csnz.pojo.Cat"/>
<bean id="dog" class="com.csnz.pojo.Dog"/>

总结:

ByName的时候

需要保证所有bean的 id 唯一
并且这个 bean 需要和自动注入的属性的 set方法后面的名称(首字母小写) 的值一致

ByType的时候

需要保证所有bean的 class 唯一,并且这个bean 需要和自动注入的 属性的类型一致

五:使用注解实现自动装配

实现步骤:

  1. 导入约束:context 约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>
  1. 配置注解的支持:<context:annotation-config/>

  2. 在要注入的属性上使用@Autowired注入
    Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning

@Autowired注解

自动按照类型注入。当使用注解注入属性时,set 方法可以省略,前提是 自动装配的属性 在IOC容器中存在,且符合命名规范(ByName)。它只能注入其他 bean 类型
当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。
直接在属性上使用即可,也可以在set方法上使用

@Nullable注解

字段标记了这个注解,说明这个字段可以为null
或 定义Autowired的required属性为false,说明这个对象可以为null,否则不允许为空

@Qualifier注解

在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
如果使用 @Autowired注解 进行自动装配的时候 无法准确定位到某个bean的话,可以使用 @Qualifier(value=“xxx”)搭配 @Autowired注解 ,指定一个唯一的 bean 对象 注入

属性:
value:指定 bean 的 id。

测试

当出现多个cat类型 并且bean 的id 稀奇古怪时
Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning

会报如下错误!
No qualifying bean of type ‘com.csnz.pojo.Cat’ available: expected single matching bean but found 2: cat555,cat666
解决方法:需使用 @Qualifier 注解
Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning
而当出现如下情况时 无需配置 @Qualifier注解
Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning
因为 @Autowired 会先根据 类型 查看 发现不为一 根据 命名规范查看 发现 dog 这个bean

@Resource注解

直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型
和 @Autowired注解差不多 功能比@Autowired完善一点点

属性:
name:指定 bean 的 id
Spring 札记(二、Spring配置、Bean标签、作用域及生命周期、自动装配)In the spring of learning

小结:

@Resource 和 @Autowired 的区别

  1. 都是用来 实现 自动装配的,都可以放在属性字段上

  2. @Autowired 默认通过 byType方式 实现,如果有多个类型相同,则根据命名规范找对象(byName) 这个对象必须存在(在XML中注册)不然使用Autowired注解直接爆红

  3. @Resource 默认通过 byName方式实现,如果找不到名字,则通过byType实现,如果两个都找不到的情况下,就报错

总而言之,他们俩的执行顺序不同,@Autowired 默认通过 byType方式 实现, @Resource 默认通过 byName方式实现。

上一篇:Spring04


下一篇:关于Spring注解容器配置的那些事,掌握这几点,不再难!