[SpringBoot2]容器功能_底层注解配置绑定_@Configuration@Import@Conditional@ImportResource

@Configuration&@Bean

  • 告诉SpringBoot这是一个配置类==配置文件
#############################Configuration使用示例######################################################
/*** 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的* 2、配置类本身也是组件* 3、proxyBeanMethods:代理bean的方法*      Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】*      Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】*      组件依赖必须使用Full模式默认。其他默认是否Lite模式****/
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {/*** Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象* @return*/@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例public User user01(){User zhangsan = new User("zhangsan", 18);//user组件依赖了Pet组件zhangsan.setPet(tomcatPet());return zhangsan;}@Bean("tom")public Pet tomcatPet(){return new Pet("tomcat");}
}################################@Configuration测试代码如下########################################
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
public class MainApplication {public static void main(String[] args) {//1、返回我们IOC容器ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//2、查看容器里面的组件String[] names = run.getBeanDefinitionNames();for (String name : names) {System.out.println(name);}//3、从容器中获取组件Pet tom01 = run.getBean("tom", Pet.class);Pet tom02 = run.getBean("tom", Pet.class);System.out.println("组件:"+(tom01 == tom02));//true 组件默认是单实例的//4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892MyConfig bean = run.getBean(MyConfig.class);System.out.println(bean);//如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。//保持组件单实例User user = bean.user01();User user1 = bean.user01();System.out.println(user == user1);User user01 = run.getBean("user01", User.class);Pet tom = run.getBean("tom", Pet.class);System.out.println("用户的宠物:"+(user01.getPet() == tom));}
}

 User user01 = run.getBean("user01", User.class);Pet tom = run.getBean("tom", Pet.class);System.out.println("用户的宠物:"+(user01.getPet() == tom));

当proxyBeanMethods = true时,用户中的宠物就是容器中的宠物,当
proxyBeanMethods = false时,用户中的宠物不是容器中的宠物

@Import

 * 4@Import({User.class, DBHelper.class})*      给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名****/@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}

测试:

@SpringBootApplication
public class MainApplication {public static void main(String[] args) {//1.返回我们IOC容器ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//2.查看容器里面的组件String[] names = run.getBeanDefinitionNames();for (String name :names){System.out.println(name);}//获取组件System.out.println("=============================================");String[] beanNamesForType = run.getBeanNamesForType(User.class);for (String s : beanNamesForType){System.out.println(s);}DBHelper bean1 = run.getBean(DBHelper.class);System.out.println(bean1);}

在这里插入图片描述

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入

在这里插入图片描述

=====================测试条件装配==========================
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
//@ConditionalOnBean:在容器中有某个组件
//@ConditionalOnBean(name = "tom")
@ConditionalOnMissingBean(name = "tom")
public class MyConfig {/*** Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象* @return*/@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例public User user01(){User zhangsan = new User("zhangsan", 18);//user组件依赖了Pet组件zhangsan.setPet(tomcatPet());return zhangsan;}@Bean("tom22")public Pet tomcatPet(){return new Pet("tomcat");}
}public static void main(String[] args) {//1、返回我们IOC容器ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//2、查看容器里面的组件String[] names = run.getBeanDefinitionNames();for (String name : names) {System.out.println(name);}boolean tom = run.containsBean("tom");System.out.println("容器中Tom组件:"+tom);boolean user01 = run.containsBean("user01");System.out.println("容器中user01组件:"+user01);boolean tom22 = run.containsBean("tom22");System.out.println("容器中tom22组件:"+tom22);}

举例:

	@ConditionalOnBean(name = "tom")@Bean("tom22")public Pet tomcatPet(){return new Pet("tomcat");}

表示当容器中有组件tom的时候,才会创建组件tom22到容器中

@ConditionalOnMissingBean(name = "tom")
public class MyConfig {
//........
}

表示当容器中没有组件tom的时候,才会创建Myconfig中的那些组件到容器中

@ImportResource

  • 原生配置文件引入
======================beans.xml=========================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="haha" class="com.atguigu.boot.bean.User"><property name="name" value="zhangsan"></property><property name="age" value="18"></property></bean><bean id="hehe" class="com.atguigu.boot.bean.Pet"><property name="name" value="tomcat"></property></bean>
</beans>
@ImportResource("classpath:beans.xml")
public class MyConfig {}======================测试=================boolean haha = run.containsBean("haha");boolean hehe = run.containsBean("hehe");System.out.println("haha:"+haha);//trueSystem.out.println("hehe:"+hehe);//true

配置绑定

如何使用Java读取到properties文件中的内容,并且把它封装到JavaBean中,以供随时使用;

public class getProperties {public static void main(String[] args) throws FileNotFoundException, IOException {Properties pps = new Properties();pps.load(new FileInputStream("a.properties"));Enumeration enum1 = pps.propertyNames();//得到配置文件的名字while(enum1.hasMoreElements()) {String strKey = (String) enum1.nextElement();String strValue = pps.getProperty(strKey);System.out.println(strKey + "=" + strValue);//封装到JavaBean。}}}

@Component + @ConfigurationProperties

/*** 只有在容器中的组件,才会拥有SpringBoot提供的强大功能*/
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {private String brand;private Integer price;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public Integer getPrice() {return price;}public void setPrice(Integer price) {this.price = price;}@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", price=" + price +'}';}
}

application.properties:

mycar.brand=BYD
mycar.price=10000000

测试:

@RestController
public class HelloController {@AutowiredCar car;@RequestMapping("/car")public Car car(){return car;}
}

在这里插入图片描述

@EnableConfigurationProperties + @ConfigurationProperties

@Configuration//告诉SpringBoot这是一个配置类==配置文件
@EnableConfigurationProperties(Car.class)
//1.开启Car配置绑定功能
//2.把这个Car这个组件自动注册到容器中
public class MyConfig {
//.......
}
@ConfigurationProperties(prefix = "mycar")
public class Car {private String brand;private Integer price;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public Integer getPrice() {return price;}public void setPrice(Integer price) {this.price = price;}@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", price=" + price +'}';}
}
  • 只用一个@ConfigurationProperties是不行的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core微服务开发服务间调用篇-GRPC

在单体应用中&#xff0c;相互调用都是在一个进程内部调用&#xff0c;也就是说调用发生在本机内部&#xff0c;因此也被叫做本地方法调用&#xff1b;在微服务中&#xff0c;服务之间调用就变得比较复杂&#xff0c;需要跨网络调用&#xff0c;他们之间的调用相对于与本地方法…

基于.NetCore3.1搭建项目系列 —— 认证授权方案之Swagger加锁

1开始在之前的使用Swagger做Api文档中&#xff0c;我们已经使用Swagger进行开发接口文档&#xff0c;以及更加方便的使用。这一转换&#xff0c;让更多的接口可以以通俗易懂的方式展现给开发人员。而在后续的内容中&#xff0c;为了对api资源的保护&#xff0c;我们引入了认证授…

今晚8点,dotnet课堂全新起航,张善友/陈计节/刘腾飞我们一起来聊聊abp的故事...

直播主题&#xff1a;我们和Abp的故事直播嘉宾&#xff1a;张善友&#xff0c;陈计节&#xff0c;刘腾飞直播话题张善友&#xff1a;我是如何使用Abp的刘腾飞&#xff1a;利用Abp的模块化解决单体和分布式混合架构陈计节&#xff1a;Abp开源项目的DevOps实践Abp VNext 处于被低…

你知道技术委员会吗?嗯,一个既重要却又鸡肋的神秘组织

这是头哥侃码的第209篇原创前几天&#xff0c;在某群里有个有关 “技术委员会” 的话题讨论的挺火。很多时候&#xff0c;这种争论是不可能有结果的&#xff0c;因为每个人都会从自己的立场和三观出发&#xff0c;公说公有理&#xff0c;婆说婆有理&#xff0c;一般除了搞得唾沫…

[SpringBoot2]Lombok

引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>idea中搜索安装lombok插件 简化JavaBean开发 NoArgsConstructor //无参构造器 //全参构造器 //AllArgsConstructor Data ToStrin…

谷歌提议更改Istio指导委员会

导语谷歌认为&#xff0c;社区成员可以通过提交代码和非代码贡献的任何组合来对Istio项目产生影响。正文近日&#xff0c;谷歌针对Kubernetes环境的开源Istio服务网格项目的管理&#xff0c;提出了改变规则的理由&#xff0c;并提出了围绕贡献者席位和社区席位创建具有相同投票…

[SpringBoot2]yaml

简介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一种标记语言&#xff09;的递归缩写。在开发的这种语言时&#xff0c;YAML 的意思其实是&#xff1a;“Yet Another Markup Language”&#xff08;仍是一种标记语言&#xff09;。 非常适合用来做以数据…

Golden Master Pattern :一种在.NET Core中重构遗留代码的利器

在软件开发领域中工作的任何人都将需要在旧代码中添加功能&#xff0c;这些功能可能是从先前的团队继承而来的&#xff0c;您需要对其进行紧急修复。可以在文献中找到许多遗留代码的定义&#xff0c;我更喜欢的定义是&#xff1a;“通过遗留代码&#xff0c;我们指的是我们害怕…

[SpringBoot2]web场景_静态资源规则与定制化

静态资源目录 只要静态资源放在类路径下&#xff1a; called /static (or /public or /resources or /META-INF/resources 访问 &#xff1a; 当前项目根路径/ 静态资源名 原理&#xff1a; 静态映射/**。 请求进来&#xff0c;先去找Controller看能不能处理。不能处理的所有请…

【Ids4实战】最全的 v4 版本升级指南

&#xff08;恰似一江春水向东流&#xff09;最近听说IdentityServer4从v3升级到v4了&#xff0c;其实很简单&#xff0c;就是nuget包升级一下的事儿&#xff0c;不过没想到涉及到的内容还挺多&#xff0c;要不然也不会直接从3.1直接蹦到4.0&#xff0c;这么大的跨度&#xff0…

你真的清楚DateTime in C#吗?

DateTime&#xff0c;就是一个世界的大融合。日期和时间&#xff0c;在我们开发中非常重要。DateTime在C#中&#xff0c;专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结&#xff0c;包括DateTime对象的整体应用&#xff0c;以及如何处理不同的区域、时区、…

【翻译】.NET 5中的性能改进

在.NET Core之前的版本中&#xff0c;其实已经在博客中介绍了在该版本中发现的重大性能改进。 从.NET Core 2.0到.NET Core 2.1到.NET Core 3.0的每一篇文章&#xff0c;发现谈论越来越多的东西。然而有趣的是&#xff0c;每次都想知道下一次是否有足够的意义的改进以保证再发表…

[SpringSecurity]框架概述

概要 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的 成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方 案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”&a…

[译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01

这是系列文章中的第一篇&#xff1a;使用GraphvizOnline可视化ASP.NETCore3.0终结点。.第1部分-使用DOT语言来可视化你的ASP.NETCore3.0终结点(本文)第2部分-向ASP.NET Core应用程序添加终节点图第3部分-使用ImpromptuInterface创建一个自定义的DfaGraphWriter&#xff0c;以便…

.NET Core CLI 的性能诊断工具介绍

前言开发人员的.NET Core项目上线后&#xff0c;经常会出现各种问题&#xff0c;内存泄漏&#xff0c;CPU 100%&#xff0c;处理时间长等&#xff0c; 这个时候就需要快速并准确的发现问题&#xff0c;并解决问题&#xff0c; 除了项目本身的日志记录外&#xff0c;NET Core 为…

[SpringSecurity]HelloWorld入门案例

入门案例 第一步 创建springboot工程 第二步 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springfram…

ASP.NET Core静态文件处理源码探究

前言静态文件&#xff08;如 HTML、CSS、图像和 JavaScript&#xff09;等是Web程序的重要组成部分。传统的ASP.NET项目一般都是部署在IIS上&#xff0c;IIS是一个功能非常强大的服务器平台&#xff0c;可以直接处理接收到的静态文件处理而不需要经过应用程序池处理&#xff0c…

[SpringSecurity]基本原理_过滤器链

SpringSecurity 本质是一个过滤器链&#xff1a; 从启动是可以获取到过滤器链&#xff1a; org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFil ter org.springframework.security.web.context.SecurityContextPersistenceFilter org.s…

通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序

最近两天在Linux中调试.NET Core应用程序&#xff0c;同时我发现在Linux中调试.NET Core应用程序并不容易。一直习惯在Visual Studio中进行编码和调试。现在我想的是可以简单快速的测试.NET Core应用在Linux。所以通过本篇文章我们能了解到如何在Windows中使用Visual Studio进行…