Spring bean定义和属性赋值


Spring Bean

由 Spring IoC 容器管理的对象称为 Bean,Bean 根据 Spring 配置文件中的信息创建

可以把 Spring IoC 容器看作是一个大工厂,Bean 相当于工厂的产品。如果希望这个大工厂生产和管理 Bean,就需要告诉容器需要哪些 Bean,以哪种方式装配。

Spring 配置文件支持两种格式,即 XML 文件格式和 Properties 文件格式。

Properties 配置文件主要以 key-value 键值对的形式存在,只能赋值,不能进行其他操作,适用于简单的属性配置。
XML 配置文件采用树形结构,结构清晰,相较于 Properties 文件更加灵活。但是 XML 配置比较繁琐,适用于大型的复杂的项目。

通常情况下,Spring 的配置文件都是使用 XML 格式的。XML 配置文件的根元素是 ,该元素包含了多个子元素 。每一个 元素都定义了一个 Bean,并描述了该 Bean 是如何被装配到 Spring 容器中的。

一个简单的Spring bean

实体类 User
这就是一个简单的实体类

public class User {
    
    
    private Integer age;
    private String name;
    public void setAge(Integer age) {
    
    
        this.age = age;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
    @Override
    public String toString() {
    
    
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

spring.xml中注册User这个bean,交给spring管理
在spring的xml配置文件中定义 bean ,将 User 类的全类写上,这样spring工厂,就能利用反射机制进行对象的创建,然后又配置了属性name,以及值value,前提是 User 类中对这些字段提供了相应的setter方法,便于spring利用反射机制调用setter方法,完成依赖的注入,perfect

<!-- User -->
<bean class="com.liu.c.User" id="user">
    <property name="age" value="18"/>
    <property name="name" value="小刘"/>
</bean>

测试
创建启动工厂,获取 user 对象,并打印

public class TestUser {
    
    
    public static void main(String[] args) {
    
    
        String springProperties = "spring.xml";
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springProperties);
        User user = context.getBean("user", User.class);
        System.out.println(user);
    }
}

结果

因为spring工厂默认是单例模式,单例在工厂创建时就会实例化对象,并将配置的依赖关系利用 Java 的反射机制进行依赖注入,所以我们看到,在打印 user 时默认调用了重写的 toString 方法,并且成功为属性赋值了

User{age=18, name='小刘'}

当然如果想要spring工厂创建多例的对象,只需要在相应的bean配置中加入scope属性,配置scope="prototype"即可实现多例,默认是 singleton 意思是单个实例

 <!-- User -->
<bean class="com.liu.c.User" id="user" scope="prototype">
    <property name="age" value="18"/>
    <property name="name" value="小刘"/>
</bean>
public class TestUser {
    
    
    public static void main(String[] args) {
    
    
        String springProperties = "spring.xml";
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springProperties);
        User user = context.getBean("user", User.class);
        User user1 = context.getBean("user", User.class);
        System.out.println(user.hashCode());
        System.out.println(user1.hashCode());
    }
}

你说对吧,佩奇
在这里插入图片描述

33317023
13818597

Spring Bean属性注入的两种方式

Spring 主要使用两种方式来对属性进行注入

  • setter注入(important)
  • 构造注入 (了解知道)

setter 注入

在 Spring 实例化 Bean 的过程中,IoC 容器首先会调用默认的构造方法(无参构造方法)实例化 Bean(Java 对象),然后通过 Java 的反射机制调用这个 Bean 的 setXxx() 方法,将属性值注入到 Bean 中

步骤:
在 Bean 中提供一个默认的无参构造函数,因为如果没有无参构造,spring就无法通过无参构造的方式创建对象,更别提通过反射获取对象里的setter方法,进行赋值了(没有其他带参构造函数的情况下,可省略,默认是有无参构造的),并为所有需要注入的属性提供一个 setXxx() 方法
在 Spring 的 XML 配置文件中,使用 <beans> 及其子元素 <bean> 对 Bean 进行定义
<bean> 元素内使用 <property> 元素对各个属性进行赋值。

具体代码上面的那个User就是通过setter进行赋值的,这里就不冗余再写一遍了,对于其他类型的注入,将会在下一篇文章写,需要的小伙伴可以关注我哦,可以一起交流呀!下面就说一说使用构造函数的方法进行注入

构造函数注入

我们可以通过 Bean 的带参构造函数,以实现 Bean 的属性注入。

步骤
在 Bean 中添加一个有参构造函数,构造函数内的每一个参数代表一个需要注入的属性;
在 Spring 的 XML 配置文件中,通过 <beans> 及其子元素 <bean> 对 Bean 进行定义;
<bean> 元素内使用 <constructor-arg> 元素,对构造函数内的属性进行赋值,Bean 的构造函数内有多少参数,就需要使用多少个 <constructor-arg>元素。

对User进行改造

User
提供一个有参构造,这时默认的无参构造就会被覆盖,因此可以把无参构造再次定义一次

public class User {
    
    
    private Integer age;
    private String name;

    public User() {
    
    
    }

    public User(Integer age, String name) {
    
    
        this.age = age;
        this.name = name;
    }

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

spring.xml使用构造方式进行赋值

<!-- User -->
<bean class="com.liu.c.User" id="user" scope="prototype">
    <constructor-arg name="age" value="15"/>
    <constructor-arg name="name" value="小张"/>
    <!--这里也可以使用index,就是说构造方法的参数,注意是从0开始的哦,那这里的0就表示user构造函数的
    第一个参数age,以此类推,但不建议这样使用,因为可读性变差了,养成好习惯,关注代码的可维护-->
<!--        <constructor-arg index="0" value="15"/>-->
<!--        <constructor-arg index="1" value="小张"/>-->
</bean>

结果
成功赋值了,为什么说不推荐呢,举个例子,比如现在这个类的属性有很多,然后你就需要重写很多构造方法,会显得十分的臃肿和麻烦

User{age=15, name='小张'}

好了,这就是今天的全部内容了,明天分享一下对于其他类型的注入,比如数组,集合类型的注入方法,也很简单,注入学习完了之后,就学习一下bean的作用域和生命周期,OK,拜拜了ヾ(•ω•`)o

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_53321320/article/details/123555506