Spring——SpringIOC创建对象的方式、Spring配置文件简单介绍、Bean作用域及自动装配

Spring——SpringIOC创建对象的方式、Spring配置文件简单介绍

一、SpringIOC创建对象的方式

我们平时在创建对象的时候会使用无参构造、有参构造的方式创建。那么我们来看看Spring中怎么处理这两种情况。

创建实体类,并在实体类构造和set方法内部输出测试

package com.muhan.pojo;

public class User {
    private int id;
    private String name;
    private int age;

    public User() {
        System.out.println("User====无参构造");
    }

    public User(String name) {
        System.out.println("User====一个参参数的构造");
        this.name = name;
    }

    public User(String name, int age) {
        System.out.println("User====两个个参参数的构造");
        this.name = name;
        this.age = age;
    }

    public User(int id, String name, int age) {
        System.out.println("User====三个参参数的构造");
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        System.out.println("User====setId方法被调用");
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("User====setName方法被调用");
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        System.out.println("User====setAge方法被调用");
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试代码:

import com.muhan.pojo.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {
    @Test
    public void test(){
        //获取ClassPathXmlApplicationContext对象,关联spring配置文件applicationContext.xml
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取对象名为user的对象
        User user = (User) context.getBean("user");
        System.out.println(user);
    }
}

(1)使用构造器通过下标注入

①使用三个参数构造器下标赋值:

    <!--1.使用构造器下标注入-->
    <bean id="user" class="com.muhan.pojo.User">
        <!--
            index=0:id
            index=1:name
            index=2:age
        -->
        <constructor-arg index="0" value="001"/>
        <constructor-arg index="1" value="张三"/>
        <constructor-arg index="2" value="18"/>
    </bean>

测试结果:
在这里插入图片描述
②使用两个参数构造器下标赋值:

    <!--2.使用构造器下标注入-->
    <bean id="user" class="com.muhan.pojo.User">
        <!--
            index=0:name
            index=1:age
        -->
        <constructor-arg index="0" value="张三"/>
        <constructor-arg index="1" value="18"/>
    </bean>

测试结果:
在这里插入图片描述
③使用一个参数的构造器下标赋值:

    <!--3.使用构造器下标注入-->
    <bean id="user" class="com.muhan.pojo.User">
        <constructor-arg index="0" value="张三"/>
    </bean>

测试结果:
在这里插入图片描述
④使用无参构造器创建对象:

    <!--4.使用构造器下标注入-->
    <bean id="user" class="com.muhan.pojo.User">
        
    </bean>

测试结果:
在这里插入图片描述

(2)使用构造器通过名称注入

①使用三个参数构造器通过名称注入

    <!--1..使用三个参数构造器通过名称注入-->
    <bean id="user" class="com.muhan.pojo.User">
        <constructor-arg name="id" value="001"/>
        <constructor-arg name="name" value="张三"/>
        <constructor-arg name="age" value="18"/>
    </bean>

测试结果:
在这里插入图片描述
②使用两个参数构造器通过名称注入

    <!--2.使用两个参数构造器通过名称注入-->
    <bean id="user" class="com.muhan.pojo.User">
        <constructor-arg name="name" value="张三"/>
        <constructor-arg name="age" value="18"/>
    </bean>

测试结果:
在这里插入图片描述
③使用一个参数构造器通过名称注入

    <!--3.使用一个参数构造器通过名称注入-->
    <bean id="user" class="com.muhan.pojo.User">
        <constructor-arg name="name" value="张三"/>
    </bean>

测试结果:
在这里插入图片描述

(3)setter注入

①使用setter注入一个值:

    <!--1.使用setter注入一个值-->
    <bean id="user" class="com.muhan.pojo.User">
        <property name="name" value="张三"/>
    </bean>

测试结果:
在这里插入图片描述
①使用setter注入两个值:

    <!--2.使用setter注入两个值-->
    <bean id="user" class="com.muhan.pojo.User">
        <property name="id" value="001"/>
        <property name="name" value="张三"/>
    </bean>

测试结果:
在这里插入图片描述
①使用setter注入三个值:

    <!--3.使用setter注入三个值-->
    <bean id="user" class="com.muhan.pojo.User">
        <property name="id" value="001"/>
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
    </bean>

测试结果:
在这里插入图片描述

二、SpringIOC创建对象的方式总结

(1)注入方式:

  • 1.通过构造注入(constructor-arg,下标与构造方法参数参数对应)
    • 通过下标(index)
      • 通过有参构造,无参构造
    • 通过参数名(name)
      • 通过有参构造,无参构造
  • 2.通过setter注入(property,可以任意组合注入,默认调用无参构造和set方法)

(2)注意:

  • 当我们使用setter(property)注入的时候,必须要有对应的set方法和无参构造(如果不写有参构造,默认会有无参构造),如果没有就会报错
  • 当我们使用构造注入的时候,必须要有对应的构造方法,如果没有就会报错

三、Spring配置文件简单介绍

(1)bean

<!--bean讲解:
1.没有id,没有name,我们依旧可以获取这个对象,但是不建议使用、需要使用类的class对象获取;
    User bean = context.getBean(User.class);

2.id 就是对象的名字
3.class 就是要实例化的类
4.name就是别名
    有id的时候,name是别名 , 没有id的时候,name就是对象的名字
    别名可以起多个
-->
<bean id="user" name="userTwo,user3" class="com.kuang.pojo.User">
    <property name="name" value="Spring"/>
</bean>

(2)alias

<!--alias讲解:
1. name : 就是bean对象的id
2. alias : 对象的别名
-->
<alias name="user" alias="user4"/>

(3)import

<!--import讲解
作用:导入另外一个资源,把另外配置文件装进来
    classpath*: 他会去所有地方寻找你的文件。【效率低】
    classpath: 只会在classpath中寻找文件,找不到就报错;【建议使用】
    file:填写文件路径url【不建议使用】
    http:填写网络路径url【不建议使用】
-->
<import resource="classpath*:userBeans.xml"/>
<import resource="classpath:userBeans.xml"/>
<import resource="file:"/>
<import resource="http:"/>

四、Bean作用域及自动装配(转载)

在Spring中,那些组成应用程序的主体及由SpringIOC容器所管理的对象,被称之为bean。简单地讲,bean就是由IOC容器初始化、装配及管理的对象。
配置文件中定义 Bean 时,我们不但可以配置 Bean 的属性值以及相互之间的依赖关系,还可以定义 Bean 的作用域 。作用域会对 Bean 的生命周期和创建方式产生影响 。
Bean 的作用域类型:

类型说明
singleton在 Spring 容器中仅存在一个 Bean 实例, Bean 以单例的形式存在,默认值。
prototype每次从容器中调用 Bean 时,都会返回一个新的实例,即相当于执行 new XxxBean() 的实例化操作。
request每次 http 请求都会创建一个新的 Bean , 仅用于 WebApplicationContext 环境。request.setAttribute("","")
session同一个 http Session 共享一个 Bean ,不同的 http Session 使用不同的 Bean,仅用于 WebApplicationContext 环境。session.setAttribute("","")
globalSession同一个全局 Session 共享一个 bean, 用于 Porlet, 仅用于 WebApplication 环境。application.setAttribute("","")

Spring 以容器的方式,使得我们仅需配置,即可得到天然的单例模式。

在五种作用域中,request、session和globalSession三种作用域仅在web的应用中使用。

单列模式:该对象再内存中只存在一份
单列模式的实现方式有很多种,但是一般都是使用static关键字,让其成为静态共享资源
单列模式分为饿汉式和懒汉式,饿汉式的意思就是不管你要不要这个对象,我都给你提前创建好,在类加载的时候资源就加载;懒汉式是当需要时再加载。也就是说饿汉式和懒汉式最大的区别就是加载时机不同。
还有一种比较安全的实现方式是使用枚举实现单例模式

自动装配(了解)
自动装配的意思是说,当自动装配的属性和引用 的名称一样,可以使用自动装配

<bean id="myRole" class="com.kuang.dao.Role" p:id="101" p:name="管理员"/>

<!--自动装配,不建议使用,建议使用注解-->
<bean id="user" class="com.kuang.dao.User" autowire="byName"/>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值