springboot注解之容器功能
添加组件
@Configuration、@Bean
//以swagger为例
@Configuration(proxyBeanMethods = false)
@EnableSwagger2 //使用swagger注解
public class SwaggerConfig {
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
//.paths(Predicates.not(PathSelectors.regex("/admin/.*")))
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build();
}
}
@Configuration
:告诉SpringBoot这是一个配置类 ,即配置文件,配置类也是组件@Bean
:添加组件。返回类型就是组件类型。返回值就是组件在容器中的实例,可以自定义组件名,默认组件名为方法名
proxyBeanMethods参数
true:full模式,表示通过
@Bean
注册的组件是单实例的,也是默认值。配置类中注册的组件每次被调用时,都会检查容器中是否已经存在该组件,若存在就不重新创建
false:lite模式,表示组件无论被调用多少次返回的组件都是新创建的,关闭了检查机制,组件每次被调用时都是重新创建
@Configuration(proxyBeanMethods = false)
public class MyConfig {
/*
给容器中添加组件。
以方法名作为组件的id。
返回类型是组件类型,返回值就是组件在容器中的实例
*/
@Bean
public User getUser(){
User lixiang = new User("莉香", 18);
//user组件依赖了Pet组件
lixiang.setPet(getPet());
return lixiang;
}
@Bean
public Pet getPet(){
Pet pet = new Pet("哈士奇");
return pet;
}
}
@SpringBootApplication
public class Springboot01Application {
public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(Springboot01Application.class, args);
//2、查看IOC容器里的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//3、从容器中获取组件
MyConfig bean = run.getBean(MyConfig.class);
User user1 = bean.getUser();
User user2 = bean.getUser();
//User(userName=莉香, age=18, pet=Pet(name=哈士奇, weight=null))
System.out.println(user1);
//org.springframework.aop.config.internalAutoProxyCreator,配置类是一个代理对象
System.out.println(bean);
//4、测试proxyBeanMethods,默认开启
System.out.println(user1 == user2); //false
Pet pet = run.getBean("getPet", Pet.class);
System.out.println("是否是同一个宠物:"+ (user1.getPet() == pet)); //是否是同一个宠物:false
}
}
说明:
- 配置类的组件之间无依赖关系用
Lite
模式加速容器启动过程,减少判断- 有依赖关系,用
Full
模式(默认),得到之前单实例组件,
@Bean、@Component、@Controller、@Service、@Repository
它们是Spring的基本标签,在Spring Boot中并未改变它们原来的功能
@Bean
:初始化一个Spring IOC容器管理的新对象。@Component
: 被注解的类会自动被添加进Spring容器中@Repository
: 用于持久层@Service
: 表示被注解的类是位于业务层的业务组件。@Controller
:用于标注控制层
- 以上组件的功能起始都是给IOC容器中注册组件,只是应用的场景不同
- 只有组件在容器中才能访问容器中的其他组件,这也是为什么实现类要加
@Service
或@component
,因为实现类经常要使用@Autowired
自动装配其他组件
@ComponentScan
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
...
}
- 启动类注解
@SpringBootApplication
的组合属性之一@ComponentScan
的功能其实就是自动扫描加载符合条件的组件(@Component
,@Service
,@Repository
)或者用@Bean
修饰加入到IOC容器中的组件- 我们可以通过
basePackages
属性定制@ComponentScan自动扫描的范围,如果不指定,则默认会从启动类所在包开始向下扫描
@Import
顾名思义,将已存在的类导入到IOC容器中
@Import({User.class, DBHelper.class})//给容器中自动创建出这两个类型的组件
@Configuration(proxyBeanMethods = false)
public class MyConfig {
}
@Conditional条件装配
满足Conditional指定的条件,则进行注入
F4打开继承结构,可以看到有很多判断条件,springboot底层使用该注解的地方很多,可自行了解
@ImportResource
原生配置文件引入:若项目中有用原先xml
方式的配置文件,spring容器是获取不到配置文件的数据的,在配置类中加入该注解就可以获取xml
文件配置的组件
<!--======================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>
@Configuration
@ImportResource("classpath:beans.xml")
public class MyConfig {
}
配置绑定
@ConfigurationProperties + @Component
读取到properties文件中的内容,并且把它封装到实体类中
@Data
@ToString
@Component //注册进容器中
@ConfigurationProperties(prefix = "mycar") //获取前缀带有mycar的配置
public class Car {
private String brand;
private Integer price;
}
类的属性必须有
get
、set
方法
#application.properties
mycar.brand=BYD
mycar.price=10000
@ConfigurationProperties
只能给注册进容器的组件绑定配置,但有时调用的是第三方接口,若接口方实体类进容器,@ConfigurationProperties
就无法使用,这时就要用到另一个注解
@EnableConfigurationProperties
+ @ConfigurationProperties
@EnableConfigurationProperties
:获取配置文件的属性值同时会将实体类加入容器中
@Configuration
@EnableConfigurationProperties({Car.class})
public class MyConfig {
}
@EnableConfigurationProperties
的参数是数组形式,参数只有一个值时可以不加{}
,有多个参数时要加{}
,并用,
隔开
//此时可以不加@Component
@Data
//@Component
@ConfigurationProperties(prefix = "mycar") //获取前缀带有mycar的配置
public class Car {
private String brand;
private Integer price;
}
springboot注解之容器功能的更多相关文章
- springboot注解大全
springboot注解:@Service: 注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一个数据 ...
- 【转载】springboot注解
https://blog.csdn.net/yitian_66/article/details/80866571 springboot注解:@Service: 注解在类上,表示这是一个业务层bean@ ...
- SPRINGBOOT注解最全详解(
# SPRINGBOOT注解最全详解(整合超详细版本) 使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 ...
- springboot注解之@Import @Conditional @ImportResource @ConfigurationProperties @EnableConfigurationProperties
1.包结构 2.主程序类 1 @SpringBootApplication(scanBasePackages={"com.atguigu"}) 2 public class Mai ...
- SpringBoot切换Tomcat容器,SpringBoot使用Jetty容器
SpringBoot切换Tomcat容器, SpringBoot修改为Jetty容器, SpringBoot使用undertow容器, SpringBoot使用Jetty容器 ============ ...
- 转-spring-boot 注解配置mybatis+druid(新手上路)-http://blog.csdn.net/sinat_36203615/article/details/53759935
spring-boot 注解配置mybatis+druid(新手上路) 转载 2016年12月20日 10:17:17 标签: sprinb-boot / mybatis / druid 10475 ...
- Springboot关于tomcat容器配置、三大组件配置、拦截器配置
原文地址:http://www.javayihao.top/detail/172 1.tomcat配置 Springboot默认使用的就是嵌入式servlet容器即tomcat,对于web项目,如果使 ...
- springboot + 注解 + 拦截器 + JWT 实现角色权限控制
1.关于JWT,参考: (1)10分钟了解JSON Web令牌(JWT) (2)认识JWT (3)基于jwt的token验证 2.JWT的JAVA实现 Java中对JWT的支持可以考虑使用JJWT开源 ...
- 【Spring注解驱动开发】使用@Import注解给容器中快速导入一个组件
写在前面 我们可以将一些bean组件交由Spring管理,并且Spring支持单实例bean和多实例bean.我们自己写的类,可以通过包扫描+标注注解(@Controller.@Servcie.@Re ...
随机推荐
- Jmeter压测学习3---通过正则表达式提取token
上一个随笔记录的是用json提取器提取token,这个随笔记录用正则表达式提取token 一.添加正则表达式 登录右击添加->后置处理器->正则表达式提取器 正则提取器参数说明: 要检查的 ...
- Windows10系统下Java JDK下载、安装与环境变量配置(全网最全步骤)
1.首先要明确: JDK.JRE.JVM的含义 2.下载目前最新的JDK:Java SE Development Kit 17,传送门::https://www.oracle.com/java/tec ...
- Spring配置文件结构对于生成Bean的影响
Spring配置文件结构对于生成Bean的影响 有段时间忙于毕设,导致Spring学习的东西忘了很多,所以最近又开始从头看Spring的基础.基础的Bean的装配不再多说了.这一次,主要是深入一点了解 ...
- 如何在 Serverless K8s 集群中低成本运行 Spark 数据计算?
作者 | 柳密 阿里巴巴阿里云智能 ** 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 ...
- NOIP2012提高组初赛NB题
本题中,我们约定布尔表达式只能包含 p, q, r 三个布尔变量,以及"与"(∧)."或"(∨)."非"(¬)三种布尔运算.如果无论 p, ...
- 洛谷4366——最短路(dijkstra,思维,异或)
题目大意 给定一个n个点,m条边的图,每条边有边权,而每个点\(i\)也可以直接到达\(j\),代价是\(i\ xor\ j\),给定一个S和T,求S到T的最小代价 其中\(n\le100000,m\ ...
- Spring事件,ApplicationEvent在业务中的应用
前言 关于事件驱动模型,百度百科在有明确的解释.在JDK的Util包里抽象了事件驱动,有兴趣的朋友可以自行去看下相关类的定义.Spring事件模型ApplicationEvent是基于JDK里的事件模 ...
- python实现地理编码
python实现地理编码 去高德地图申请好key python代码 # -*- coding:utf_8 -*- # !/usr/bin/python37 """ @au ...
- 对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)
前言 这是<Spring Cloud 进阶>专栏的第六篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得了? 阿里面 ...
- vue3.x全局$toast、$message、$loading等js插件
有时候我们需要使用一些类似toast,messge.loading这些跟js交互很频繁的插件,vue3.x这类插件的定义跟vue2.x插件稍大,而且相对变得复杂了一点点. 第一种.需要时创建,用完移除 ...