iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBootBean被加载时进行控制
  • 361
分享到

SpringBootBean被加载时进行控制

SpringBootBean加载控制SpringBoot加载BeanSpringBootBean 2023-02-10 12:02:38 361人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录序章加载控制@Conditional派生注解这是我未加控制前的代码控制后bean依赖的属性配置序章 简介:bean的加载控制指根据特定情况对bean进行选择性加载以达到适用项目的

序章

简介:bean的加载控制指根据特定情况对bean进行选择性加载以达到适用项目的目标。

根据之前对bean加载的八种方式,其中后面四种是可以对bean被加载时进行控制。

我拿第六种来举个例子。

之前也举过例子,但是实际开发呢,一般不会那么使用。

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        try {
            Class<?> name = Class.forName("yi.beans.kun");
            if (name!=null){
                return new String[]{"yi.beans.Cat"};
            }
        }catch (ClassNotFoundException e){
            return new  String[0];
        }
        return null;
    }
}

通过查看某个类是否存在来控制是否加载目标类。

这个类我是不存在的。

import org.springframework.context.annotation.Import;
import yi.beans.MyImportSelector;
@Import(MyImportSelector.class)
public class AConfig {
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import yi.config.AConfig;
public class App3 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(AConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

所以我是没有加载这个bean的,还是老话,前面的那些暂时不看。

加载控制@Conditional派生注解

到了这里,你的spring项目就该换成SpringBoot项目了,pom.xml中添加坐标,我就不多说了,这就是springboot的注解,源代码中大量使用。

这是我未加控制前的代码

import org.springframework.context.annotation.ComponentScan;
@ComponentScan("yi.beans")
public class AConfig {
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import yi.config.AConfig;
public class App3 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(AConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

有猫,有狗,有老鼠,只不过我给他们都起了名字,你们很容易就会看出来。

现在我要对猫这个bean在创建时加一控制。

控制后

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissinGClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWEBApplication;
import org.springframework.stereotype.Component;
@ConditionalOnClass(Mouse.class)    //要加载猫,必须要有老鼠这个bean
@ConditionalOnBean(name = "zhizhi")     //而且这个老鼠bean的名字必须是“zhizhi”
@ConditionalOnMissingClass("yi.beans.Dog")      //但是不能有狗,猫捉老鼠不想有狗
@ConditionalOnNotWebApplication     //环境必须为非Web环境
@Component("miao")  //猫的bean叫“miao”
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cat {
    String shout;
}

这里我加了几个常见的派生注解,其他的代码都是不用变的,我的bean里卖虽然有一个叫做“zhizhi”的老鼠,但是有狗,所以猫是加载不出来的。

其中的

@ConditionalOnClass
@ConditionalOnBean

这两个注解非常相似,一般就用上面那个控制类的字节码或者路径。下面那个获取bean的名字,搭配使用就好了。

bean依赖的属性配置

先定义两个最基础的bean

import lombok.Data;
@Data
public class Mouse {
    private String name;
    private int age;
}
import lombok.Data;
@Data
public class Cat {
    private String name;
    private int age;
}

cartoon:
  cat:
    name: "图多盖洛"
    age:  5
  mouse:
    name: "泰菲"
    age: 1 

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "cartoon")    
public class CartoonProperties {
    private Cat cat;
    private Mouse mouse;
}
import lombok.Data;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Data
@Component
@EnableConfigurationProperties(CartoonProperties.class)
public class CartoonCatAndMouse {
    private Cat cat;
    private Mouse mouse;
    private CartoonProperties cartoonProperties;
    public CartoonCatAndMouse(CartoonProperties cartoonProperties){
        this.cartoonProperties=cartoonProperties;
        this.cat=new Cat();
        this.cat.setName(cartoonProperties.getCat()!=null&& StringUtils.hasText(cartoonProperties.getCat().getName())?
                cartoonProperties.getCat().getName():"Tom");
        this.cat.setAge(cartoonProperties.getCat()!=null&& cartoonProperties.getCat().getAge()!=0?
                cartoonProperties.getCat().getAge():6);
        this.mouse=new Mouse();
        this.mouse.setName(cartoonProperties.getMouse()!=null&&StringUtils.hasText(cartoonProperties.getMouse().getName())?
                cartoonProperties.getMouse().getName():"Jerry");
        this.mouse.setAge(cartoonProperties.getMouse()!=null && cartoonProperties.getMouse().getAge()!=0?
                cartoonProperties.getMouse().getAge():2);
    }
    public void play() {
        System.out.println(cat.getAge()+"岁的"+cat.getName()+"和"+mouse.getAge()+"岁的"+mouse.getName()+"打起来了");
    }
}
import com.yi.bean.CartoonCatAndMouse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootBean2ApplicationTests {
    @Autowired
    private CartoonCatAndMouse cartoonCatAndMouse;
    @Test
    void contextLoads() {
        cartoonCatAndMouse.play();
    }
}

可以看到加载的就是我们自己写的配置,现在我把配置注解一部分,我们再来看运行结果。

cartoon:
  cat:
#    name: "图多盖洛"
    age:  5
  mouse:
#    name: "泰菲"
    age: 1

可以看到,没有写的属性使用的就是默认属性,也就是自动配置的思想,只有在调用的时候才会生成bean,默认的bean也不会在项目加载时就添加,这样压力会很大。如果我们没有使用某个第三方的bean,我们的项目启动时也并不会加载默认的bean。

到此这篇关于SpringBoot Bean被加载时进行控制的文章就介绍到这了,更多相关SpringBoot Bean加载控制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBootBean被加载时进行控制

本文链接: https://www.lsjlt.com/news/195497.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBootBean被加载时进行控制
    目录序章加载控制@Conditional派生注解这是我未加控制前的代码控制后bean依赖的属性配置序章 简介:bean的加载控制指根据特定情况对bean进行选择性加载以达到适用项目的...
    99+
    2023-02-10
    SpringBoot Bean加载控制 SpringBoot加载Bean SpringBoot Bean
  • EntityFramework加载控制LoadingEntities
    Entity Framework允许控制对象之间的关系,在使用EF的过程中,很多时候我们会进行查询的操作,当我们进行查询的时候,哪些数据会被加载到内存中呢?所有的数据都需要吗?在一些...
    99+
    2024-04-02
  • openstack中控制台无法加载 加载太慢
    如果在OpenStack控制台加载过慢或无法加载,可能有以下几个原因和解决方法:1. 网络连接问题:请确保您的网络连接稳定,并且能够...
    99+
    2023-10-11
    openstack
  • Springbean加载控制实现方法
    目录1. Controller加载控制1.1 Controller加载控制与业务bean加载控制1.2 加载Spring控制的bean的时候排除掉SpringMVC控制的bean(方...
    99+
    2022-12-23
    Spring bean加载控制 bean加载控制
  • Entity Framework如何加载控制Loading Entities
    小编给大家分享一下Entity Framework如何加载控制Loading Entities,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!E...
    99+
    2023-06-29
  • Spring bean加载控制如何实现
    这篇文章主要讲解了“Spring bean加载控制如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring bean加载控制如何实现”吧!1. Controll...
    99+
    2023-07-04
  • CSS怎么控制动画行进
    本文小编为大家详细介绍“CSS怎么控制动画行进”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS怎么控制动画行进”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。拆解分析需求动画控制要完成的效果是:页面 rend...
    99+
    2023-07-04
  • spring怎么进行事务控制
    Spring框架中的事务控制可以通过两种方式进行:1. 基于注解的事务控制:- 在需要事务控制的方法上使用`@Transaction...
    99+
    2023-09-29
    spring
  • 如何进行Apache 访问控制
    这篇文章主要为大家分析了如何进行Apache 访问控制的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何进行Apache 访问控制”的知识吧。Apache ...
    99+
    2023-06-04
  • 利用python进行数据加载
    前言 最近参加了datawhale的组队学习活动,在组队学习动员下,开始通过强迫自己输出来实现更好的输入与处理,6-15开始自己的第一次文章发布,我会把自己这个真的很小白遇到的问题写...
    99+
    2024-04-02
  • SpringMVC bean加载控制的实现分析
    目录一、问题分析二、思路分析三、环境准备四、设置bean加载控制一、问题分析 入门案例的内容已经做完了,在入门案例中我们创建过一个SpringMvcConfig的配置类,再回想前面咱...
    99+
    2023-02-06
    SpringMVC bean加载控制 SpringMVC bean加载机制
  • JavaScriptcanvas绘制圆形加载进度条
    本文实例为大家分享了JavaScript canvas绘制圆形加载进度条的具体代码,供大家参考,具体内容如下 1.需求:通过canvas绘制一个圆形的进度条 2.实现思路: 2.1 ...
    99+
    2024-04-02
  • VUE中状态控制与延时加载刷新的示例分析
    这篇文章主要介绍VUE中状态控制与延时加载刷新的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在实际项目中,我们经常会遇到这种状况,某些数据我们希望等到需要的时候再去获取,或...
    99+
    2024-04-02
  • springboot中怎么控制bean的加载顺序
    这期内容当中小编将会给大家带来有关springboot中怎么控制bean的加载顺序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1.为什么需要控制加载顺序springboot遵从约定大于配置的...
    99+
    2023-06-16
  • SpringMVC bean实现加载控制方法详解
    目录1、Spring配置类排除加载SpringMVC的bean2、Servlet容器配置类简洁开发1、Spring配置类排除加载SpringMVC的bean SpringMVC 通常...
    99+
    2024-04-02
  • 怎样进行jQuery动态加载JS
    怎样进行jQuery动态加载JS,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。如果您要创建一个web2.0的应用程序,那么你的网页会包括大...
    99+
    2024-04-02
  • 使用@ConditionalOnProperty控制是否加载的操作
    @ConditionalOnProperty控制是否加载 public interface OSService { void os(); } @ConditionalOnP...
    99+
    2024-04-02
  • 如何使用PHP进行权限控制?
    在现代的网站和应用中,权限控制是一项必备功能。无论是通过身份验证还是其他方式,让用户有不同的权限和角色是确保程序安全的关键。PHP是一种流行的服务器端语言,提供了许多不同的方法来实现权限控制。在本文中,我们将探讨如何使用PHP进行权限控制,...
    99+
    2023-05-24
    PHP 权限控制 用户认证
  • PHP 函数的执行顺序可以被控制吗?
    php 函数的执行顺序控制php 函数通常按出现顺序执行,但可通过以下技巧控制:嵌套函数:延迟内部函数执行,直至外部函数返回。闭包:允许在外部函数执行后调用函数,引用外部变量。匿名函数:...
    99+
    2024-04-17
    php 函数执行顺序 作用域
  • 如何使用CSS控制动画行进
    这篇文章主要讲解了“如何使用CSS控制动画行进”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用CSS控制动画行进”吧!正文从这里开始。今天要介绍一种很...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作