基于注解开发的Spring入门指南02

Spring IoC 好在哪里?

带着上篇结尾的疑问我们来到了本篇文章,在这里先讲解一下在开发中ioc的优势都体现在哪几个方面:

解耦

首先就是使用ioc能够解耦我们的代码,这是针对java这种面向对象编程的语言,我们可以想象在程序代码中,我们拥有非常多的类,有简单的类,有复杂的类,有时候我们创建一个类对象时还要传入各种对象,依赖性非常强,如果是小项目那还好,如果是大项目就会让人头疼,因为这些对象难以得到有效的管理,在这里我们可以把类的基本信息写到配置类中,这个类可以包含一个对象的多种创建逻辑,而且默认是单例的,在需要使用这个对象的时候,只需直接找到容器,容器就会自动获取相应的对象,这样我们就不需要知道整个对象的创建逻辑了。
当我们随便找到一个spring项目看源码的时候,就会发现你很少能够看到有创建对象的痕迹,整个程序就代码会变得很干净,没有了各种对象的复杂创建,不用担心对象之间的依赖,开发起来简直不要太爽。

第二个spring项目

这里我们照常导入一个依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

作用域与加载方式

这次将介绍spring bean的四个作用域,和bean的加载方式:

  1. SCOPE_PROTOTYPE 这个是多例
  2. SCOPE_SINGLETON 这个是单例
  3. SCOPE_REQUEST 这个是多例,但是这是在web环境下的
  4. SCOPE_SESSION 这个是多例,也是web环境下的

还有bean的加载方式
只要在配置类的bean上加上@Lazy就是懒加载,不加则不是

实际上有5个,但是spring的@Scop注解中只有这4个注释,那我就只介绍上面这四个好了

直接上代码

这是个bean

package com.ioc.bean;

import org.springframework.beans.factory.annotation.Value;

/**
 * Copyright (C), 2018-2021
 * FileName: Person
 * Author:   BurNIng
 * Date:     2021/2/8 15:21
 * Description: 人Class
 */
public class Person {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

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

    public Person() {
    }
}

这是个配置类

package com.ioc.configclass;

import com.ioc.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;

/**
 * Copyright (C), 2018-2021
 * FileName: MainConfig
 * Author:   BurNIng
 * Date:     2021/2/8 17:56
 * Description: bean作用域配置类
 */
@Configuration
public class MainConfig {
    /**
     * lazy: 懒加载
     *  不会影响scope的设置
     *
     * scope: 四个作用域
     * 	 * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
     * 	 * @see ConfigurableBeanFactory#SCOPE_SINGLETON
     * 	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
     * 	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
     * @return person
     */
    @Lazy
    @Scope("prototype")
    @Bean
    public Person person() {
        System.out.println("李四对象的创建");
        return new Person("李四",18);
    }
}

测试类

package com.ioc.test;

import com.ioc.bean.Person;
import com.ioc.configclass.MainConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Copyright (C), 2018-2021
 * FileName: Test
 * Author:   BurNIng
 * Date:     2021/2/8 18:03
 * Description: test
 */
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext
                //MainConfig01是配置类,想要获取配置类中注入的bean必须传入MainConfig.class类信息,来获取相应spring容器
                annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器初始化");
        System.out.println("===============================================================================");
        /**
         * 多例懒加载的结果:
         *      容器初始化
         *      ===============================================================================
         *      李四对象的创建
         *      李四对象的创建
         *      false
         * 单例懒加载的结果:
         *      容器初始化
         *      ===============================================================================
         *      李四对象的创建
         *      true
         */
        System.out.println(
                annotationConfigApplicationContext.getBean(Person.class)
        );
        System.out.println(
        	annotationConfigApplicationContext.getBean(Person.class) == 
        	annotationConfigApplicationContext.getBean(Person.class)
        );
    }
}

运行结果都写在注释上了,我门可以看到加载方式不会影响多例与单例的结果

使用@Value给属性赋值:

在我们定义bena的时候,我们可以利用注解@Value给对应的属性赋上对应的值,这个注解在我们读取属性文件的时候非常有用,其用法如下:

  1. 基本赋值
  2. SpEL:#{}
  3. 可以写${}:取出配置文件【properties】中的值(在运行环境变量中的值)

如spel的话我们可以在其中写一些表达式来赋值,比如@Value("#{1+17}")
像读取properties文件,我们可以这样写@Value("${db.user}"),这样就把db.properties文件中的db.user=root的root读取出来了
最后上代码

package com.ioc.bean;

import org.springframework.beans.factory.annotation.Value;

/**
 * Copyright (C), 2018-2021
 * FileName: Person
 * Author:   BurNIng
 * Date:     2021/2/8 15:21
 * Description: 人Class
 */
public class Person {
    /**
     * 使用@Value赋值:
     * 1.基本赋值
     * 2.SpEL:#{}
     * 3.可以写${}:取出配置文件【properties】中的值(在运行环境变量中的值)
     */
    @Value("张三")
    private String name;

    @Value("#{17+1}")
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

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

    public Person() {
    }
}

为了篇幅省略了配置类与测试类,与上面无异
最终运行的结果:
在这里插入图片描述
还是用着上面的代码

以上就是这些了,之后有补充的我会继续填补,期待下一次的博文

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值