IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Boot07 -> 正文阅读

[Java知识库]Spring Boot07

目录

3.7Bean的作用域

3.8使用@Profile


3.7Bean的作用域

在前面介绍BeanFactroy时,其中isSingleton()和isPrototype()俩个方法没有说,这两个方法是判断用来Bean的作用域的

isSingleton判断当前Bean是否为单例
isPrototype判断当前Bean是否为原型

对于单例来说,无论我们获取多少次,获取的都是同一个对象。

对于原型来说,我们每获取一次,获取的对象都不相同

在一般的容器中Bean的作用域只会存在单例和原型,而在Web容器中存在Page(页面)?,request(请求),session(会话),application(应用)4种作用域,Spring无法支持,为了满足各类的作用域在Spring的作用域中就存在如下所示的几种类型

作用域类型使用范围作用域描述
singleton所以Spring应用默认值,IoC容器只存在一个单例
prototype所以Spring应用每当从IoC容器中取出一个Bean,则创建一个新的Bean
sessionSpring web 应用HTTP会话
applicationSpring web 应用Web工程生命周期
requestSpring web 应用Web工程单次请求
globalSessionSpring web 应用在一个全局的HTTP Session中,一个Bean定义对应一个实例。实际中基本不使用

我们通过实例来比较Singleton与Prototype的区别

①创建Bean类,配置@Scope(这里不配置也可以,因为SpringIoC默认时单例)

package com.POJO;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class Bean {
}

?②进行测试,首先获取两个Bean实例,对其进行比较,如果返回true说明为单例

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IoCTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
        Bean bean1 = applicationContext.getBean(Bean.class);
        Bean bean2 = applicationContext.getBean(Bean.class);
        System.out.println(bean1);
        System.out.println(bean2);
        System.out.println(bean1==bean2);
        
    }
}

?③运行结果

?④改变@Scope注解的配置项

package com.POJO;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Bean {
}

⑤运行结果

?这里的ConfigurableBeanFactroy只能提供单例和原型,如果在SpringMVC环境中,我们还可以使用WebApplicationContext去定义其他作用域,如请求(SCOPE_REQUEST),等

?

?如果定义上图Bean的作用域,那么每次请求都会共用一个Bean,第二次请求会产生新的Bean

3.8使用@Profile

在企业开发中,往往项目要有四套环境,开发环境,测试环境,准生产环境,生产环境,而且每套环境上下文是不一样的,例如:开发环境的数据库一般和测试环境的数据库不一样,我们要频繁的切换,为了方便Spring提供了Profile机制,使我们可以很方便的实现个环境之间的切换

我们以数据库为例进行解释

假设存在dev_spring_boot和test_spring_boot两个数据库,这样可以使用注解@Profile定义两个Bean,代码如下

@Configuration
@ComponentScan(basePackages = "com.POJO.impl",lazyInit = true)
public class Config{
    @Bean(name = "dataSource")
    @Profile("dev")
    public DataSource getDevdataSource(){
        Properties properties = new Properties();
        properties.setProperty("driverName","com.mysql.jdbc.Driver");
        properties.setProperty("url","jdbc:mysql;//localhost:3306/user");
        properties.setProperty("username","root");
        properties.setProperty("password","root");


        DataSource dataSource = null;
        try {
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataSource;
    }
    @Bean(name = "dataSource")
    @Profile("test")
    public DataSource getTestdataSource(){
        Properties properties = new Properties();
        properties.setProperty("driverName","com.mysql.jdbc.Driver");
        properties.setProperty("url","jdbc:mysql;//localhost:3306/user");
        properties.setProperty("username","root");
        properties.setProperty("password","root");


        DataSource dataSource = null;
        try {
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataSource;
    }

}

那Spring 给我们提供了俩个参数供我们配置,用来修改启动Profile机制,①spring.profiles.active②spring.profiles.default

如果这两个属性都没配置的情况下,spring不会启动Profile机制,这就意味着@Profile注解修饰的Bean将不会被Spring装配到IoC容器

spring.profiles.active的优先级大于spring.profiles.default我觉得看英文能看懂的,以各位的才智

我们来用IDEA演示一下

?在VM 里面配置参数

-Dspring.profiles.active=dev

?如果没有VM选项(如下图所示),我们可以打开修改选项,添加VM选项

?

?那么对于属性配置文件,每个数据库也都要有对于的属性文件吧,我们创建两配置文件

application-dev.properties和application-test.properties,并且配置日志为DEBUG级别,这样会很详细(关于数据库的配置大家应该都会哈哈哈)

//日志配置
logging.level.root=DEBUG
logging.level.org.springframework=DEBUG

?这个时候要注意,按照SpringBoot的规则,假设把选项-Dspring.profiles.active配置的值记为{profile},则它会用application-{profile}.properties文件去代替原来的默认application.properties文件

这样每当我们想切换环境时,我们就可以通过修改-Dspring.profiles.active参数来修改配置文件

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:07:36  更:2022-03-16 22:08:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:08:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码