Spring框架基础知识(03)

简介: Spring框架基础知识

7. Spring管理对象的作用域


由Spring管理的对象,默认情况下,是单例的!所以,其作用域就非常久!


在Spring管理对象的情况下,讨论对象的作用域,其本质就是讨论其是否单例!


在创建对象的方法之前,添加@Scope注解,并配置注解参数为prototype,就可以使得该对象不是单例的:


@Scope("prototype")
@Bean
public User user() {
    return new User();
}


由Spring管理的对象,如果是单例模式的,默认情况下,是饿汉式的!在创建对象的方法之前,添加@Lazy注解,就可以调整为懒汉式的:


@Bean
@Lazy
public User user() {
    return new User();
}


一般,在开发项目时,极少调整对象的作用域!

8. 当天小结:


Spring的主要作用:创建对象,管理对象;

如果某个方法是用于给Spring框架创建对象的,这个方法就必须添加@Bean注解;

所有添加了@Bean注解的方法,其所在的类应该添加@Configuration注解,凡添加了@Configuration注解的类称之为配置类;

默认情况下,由Spring管理的对象是单例的,使用@Scope注解可以将Spring管理的对象调整为“非单例”的;

默认情况下,由Spring管理的单例的对象是是“饿汉式”的,使用@Lazy可以将它们改为“懒汉式”的。

附1:设计模式之单例模式


单例模式的特点:在同一时期,某个类的对象一定最多只有1个!也许会尝试多次的获取对象,但是,获取到的一定是同一个对象!


假设项目中有King类:


public class King {
}


很显然,目前它并不是单例的,因为,可以:


King k1 = new King();

King k2 = new King();

King k3 = new King();


以上代码就创建了3个King类型的对象!如果要实现单例,首先,就必须限制构造方法的访问,例如:


public class King {
    private King() {
    }
}


每个类中都可以有若干个构造方法,如果某个类没有显式的声明任何构造方法,编译器就会自动添加1个公有的、无参数的构造方法!如果类中已经声明任何构造方法,则编译器不会自动添加构造方法!

由于将构造方法声明为私有的,则原有的King k1 = new King();这类代码就不能用于创建对象了!


限制构造方法的访问,其目的是“不允许随意创建对象”,并不是“不允许创建对象”,在King类的内部,还是可以创建对象的,可以添加方法,返回内部创建的对象:

public class King {
    private King king = new King();
    private King() {
    }
    public King getInstance() {
        return king;
    }
}



所以,当需要King类型的对象时,可以通过getInstance()方法来获取!


但是,以上代码是不可行的!因为,如果要调用getInstance()方法,必须先获取King的对象,而获取King对象的唯一方式就是调用getInstance()方法!为了解决这个问题,必须在getInstance()方法的声明之前添加static修饰符,最终,就可以通过类名.方法名()的语法格式来调用方法了!同时,由于“被static修饰的成员,不可以访问其它未被static修饰的成员”,所以,全局属性king也必须被static修饰:

public class King {
    private static King king = new King();
    private King() {
    }
    public static King getInstance() {
        return king;
    }
}



至此,基本的单例模式的代码就设计完成了!


以上代码是“饿汉式”的单例模式,另外,还有“懒汉式”的单例模式!


基本的懒汉式单例模式的代码是:

public class King {
    private static King king = null;
    private King() {
    }
    public static King getInstance() {
        if (king == null) {
            king = new King();
        }
        return king;
    }
}



注意:以上代码是多线程不安全的!


在开发领域中,只要数据的产生、变化不是开发人员预期的,就称之为“不安全”,也就是“数据安全问题”。

为了保障线程安全,应该为以上创建对象的代码片断“加锁”,例如:


public class King {
    private static King king = null;
    private King() {
    }
    public static King getInstance() {
        synchronized ("hello") {
            if (king == null) {
                king = new King();
            }
        }
        return king;
    }
}


当然,无论是哪个线程在什么时候执行以上代码,都必须先“锁住”代码片断后才能开始执行,是没有必要的,“锁”的性能消耗是浪费的,所以,可以进一步调整为:


public class King {
    private static King king = null;
    private King() {
    }
    public static King getInstance() {
        if (king == null) { // 判断有没有必要锁定接下来的代码
            synchronized ("java") {
                if (king == null) { // 判断有没有必要创建对象
                    king = new King();
                }
            }
        }
        return king;
    }
}

至此,懒汉式的单例模式就完成了!


目录
相关文章
|
8天前
|
存储 安全 Java
事件的力量:探索Spring框架中的事件处理机制
事件的力量:探索Spring框架中的事件处理机制
24 0
|
18天前
|
缓存 Java Spring
Spring 框架中 Bean 的生命周期
Spring 框架中 Bean 的生命周期
30 1
|
1月前
|
开发框架 安全 Java
Spring 框架:企业级应用开发的强大工具
在当今数字化时代,企业级应用开发的需求日益增长。为了满足这一需求,开发者们需要一款功能强大、易于使用的开发框架。Spring 框架作为 Java 领域的领先者,为企业级应用开发提供了全面的解决方案。本文将深入探讨 Spring 框架的各个方面,包括其历史、核心模块、优势以及应用场景。
23 0
|
1月前
|
存储 Java 数据库
|
1月前
|
人工智能 JSON 前端开发
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
|
3月前
|
XML Java 数据库连接
JAVAEE框架整合技术之spring03-SpringJdbcTemplate模板技术和事务处理
JAVAEE框架整合技术之spring03-SpringJdbcTemplate模板技术和事务处理
67 0
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架(十六)Spring Boot及Dubbo zipkin 链路追踪组件埋点
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文第一部分为调用链、OpenTracing、Zipkin和Jeager的简述;第二部分为Spring Boot及Dubbo zipkin 链路追踪组件埋点
|
2月前
|
缓存 安全 Java
Shiro框架以及Spring Boot整合Shiro
Shiro框架以及Spring Boot整合Shiro
Shiro框架以及Spring Boot整合Shiro
|
3月前
|
Java 数据库连接 Maven
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
|
3月前
|
Java 数据库 数据安全/隐私保护
基于SSM框架实现管科类考研自我管理系统(分前后台spring+springmvc+mybatis+maven+jsp+jquery)
基于SSM框架实现管科类考研自我管理系统(分前后台spring+springmvc+mybatis+maven+jsp+jquery)