wordpress手机站模板,广州旅游攻略景点必去,表白网站建设,单位公众网站建设要求#x1f648;作者简介#xff1a;练习时长两年半的Java up主 #x1f649;个人主页#xff1a;程序员老茶 #x1f64a; ps:点赞#x1f44d;是免费的#xff0c;却可以让写博客的作者开心好久好久#x1f60e; #x1f4da;系列专栏#xff1a;Java全栈#xff0c;… 作者简介练习时长两年半的Java up主 个人主页程序员老茶 ps:点赞是免费的却可以让写博客的作者开心好久好久 系列专栏Java全栈计算机系列火速更新中 格言种一棵树最好的时间是十年前其次是现在 动动小手点个关注不迷路感谢宝子们一键三连 目录 课程名Java内容/作用知识点/设计/实验/作业/练习学习SpringBoot自动配置中bean的加载控制bean的加载控制 课程名Java
内容/作用知识点/设计/实验/作业/练习
学习SpringBoot自动配置中bean的加载控制
bean的加载控制
前面复习bean的加载时提出了有关加载控制的方式其中手工注册beanImportSelector接口ImportBeanDefinitionRegistrar接口BeanDefinitionRegistryPostProcessor接口都可以控制bean的加载这一节就来说说这些加载控制。
企业级开发中不可能在spring容器中进行bean的饱和式加载的。什么是饱和式加载就是不管用不用全部加载。比如jdk中有两万个类那就加载两万个bean显然是不合理的因为你压根就不会使用其中大部分的bean。那合理的加载方式是什么肯定是必要性加载就是用什么加载什么。继续思考加载哪些bean通常受什么影响呢最容易想的就是你要用什么技术就加载对应的bean。用什么技术意味着什么就是加载对应技术的类。所以在spring容器中通过判定是否加载了某个类来控制某些bean的加载是一种常见操作。下例给出了对应的代码实现其实思想很简单先判断一个类的全路径名是否能够成功加载加载成功说明有这个类那就干某项具体的工作否则就干别的工作。
public class MyImportSelector implements ImportSelector {Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {try {Class? clazz Class.forName(com.itheima.bean.Mouse);if(clazz ! null) {return new String[]{com.itheima.bean.Cat};}} catch (ClassNotFoundException e) {
// e.printStackTrace();return new String[0];}return null;}
} 通过上述的分析可以看到此类操作将成为企业级开发中的常见操作于是springboot将把这些常用操作给我们做了一次封装。这种逻辑判定你开发者就别搞了我springboot信不过你这种新手开发者我给你封装一下做几个注解你填参数吧耶happy。
下例使用ConditionalOnClass注解实现了当虚拟机中加载了com.itheima.bean.Wolf类时加载对应的bean。比较一下上面的代码和下面的代码有没有感觉很清爽。其实此类注解还有很多。
Bean
ConditionalOnClass(name com.itheima.bean.Wolf)
public Cat tom(){return new Cat();
} ConditionalOnMissingClass注解控制虚拟机中没有加载指定的类才加载对应的bean。
Bean
ConditionalOnMissingClass(com.itheima.bean.Dog)
public Cat tom(){return new Cat();
} 这种条件还可以做并且的逻辑关系写2个就是2个条件都成立写多个就是多个条件都成立。
Bean
ConditionalOnClass(name com.itheima.bean.Wolf)
ConditionalOnMissingClass(com.itheima.bean.Mouse)
public Cat tom(){return new Cat();
} 除了判定是否加载类还可以对当前容器类型做判定下例是判定当前容器环境是否是web环境。
Bean
ConditionalOnWebApplication
public Cat tom(){return new Cat();
} 下面是判定容器环境是否是非web环境。
Bean
ConditionalOnNotWebApplication
public Cat tom(){return new Cat();
} 当然还可以判定是否加载了指定名称的bean这种有什么用呢太有用了。比如当前容器中已经提供了jdbcTemplate对应的bean你还需要再加载一个全新的jdbcTemplate的bean吗没有必要了嘛。spring说如果你自己写的话我就不帮你操这份心了如果你没写我再给你提供。自适应自适应明白没有的话就提供给你有的话就用你自己的是不是很帅
Bean
ConditionalOnBean(namejerry)
public Cat tom(){return new Cat();
} 以下就是判定当前是否加载了mysql的驱动类如果加载了我就给你搞一个Druid的数据源对象出来完美
public class SpringConfig {BeanConditionalOnClass(namecom.mysql.jdbc.Driver)public DruidDataSource dataSource(){return new DruidDataSource();}
} 其中springboot的bean加载控制注解还有很多这里就不一一列举了最常用的判定条件就是根据类是否加载来进行控制。
总结
springboot定义了若干种控制bean加载的条件设置注解由spring固定加载bean变成了可以根据情况选择性的加载bean
往期专栏Java全栈开发数据结构与算法计算机组成原理操作系统数据库系统物联网控制原理与技术