Spring学习笔记——@Configuration和@Bean注解
前言
在Spring框架中,有两种对容器的配置和启动方式,一种是基于XML文档的配置方式,一种则是“零配置”,即Java Based Configuration。
而在零配置中,最常见的就是单独使用@Component
(及其等效注解@Controller
、@Repository
、@Service
),或者共同使用@Configuration
和@Bean
注解,这里将全部介绍。同时也会介绍几乎所有常见的注解配置
@Component
该注解是配置Bean的最基本注解,当该注解修饰一个类时,在初始化容器并扫描后,会进行基本的Bean配置。
@Component
public class Person {private Axe axe;public void setAxe(Axe axe) {this.axe = axe;}
}
这直接就相当于在容器中配置了一个id为person的bean,当然,默认id是类的首字母小写,也可以这样自定义名称:
@Component("person")
至于@Repository
、@Controller
、@Service
都是@Component
的变体,作用完全一致,只是为了便于区分常常用于修饰不同的类型,分别是数据层bean,控制层bean,服务层bean。
@Scope
该注解用于指定被修饰的bean的作用域,Spring中的bean一共有6种作用域:
- singleton单例模式,只生成一个实例
- prototype原型模式,每次获取bean时都会生成一个实例
- request,对于每一个HTTP请求都会生成一个实例
- session,对于每一次HTTP会话都会生成一个实例
- application,对于整个web应用,该bean只生成一个实例
- websocket,对于整个WebSocket通信,该bean只生成一个实例
使用方法就是直接将对应的作用域名称作为value值传给@Scope
:
@Scope("singleton")
@Resource、@Value
这两个注解用于配置依赖项,前者用于注入容器中的bean,后者用于直接注入值。
这里注意@Resource
这个注解默认时byName的,可以通过指定name属性来指定要注入的bean的id是什么,当然也可通过指定type的方式调整为byType注入
@PostConstuct、@PreDestroy
这两个注解用于生命周期回调
@Component
public class Person {// ...// ...@PostConstuctpublic void init() {System.out.println("Doing init method...");}@PerDestroypublic void destroy() {System.out.println("Doing destroy method...");}
}
@Bean
该注解一般需要配合@Configuration走CGLIB代理才能发挥出更好的作用。
实际上该注解是将该注解修饰的函数的返回值作为bean注册到容器中。
@Configuration
public class MyBean {@Bean(value = "wood", initMethod = "init")public Axe getWoodAxe() {return new WoodAxe();}@Bean("axeMan")public Person getAxeMan(Axe axe) {return axe::chop;}
这里注意,当我们使用@Bean注解时,可以通过之前的方式指定生命周期回调,但是也可通过@Bean自带的属性来指定,但是指定的必须是返回值类中有的函数(如果返回值为一个接口,接口中必须有相关的函数)
其次,@Bean注解修饰的函数可以带任意数量的形参,形参会自动执行byType的自动注入,因此需要注意当检测到多个可匹配的类时会报错。
同时,当指定bean的生命周期时,仍然是使用上述@Scope
注解
并且,可以使用name属性指定该bean的名字
使用@Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"})
这样的形式指定大量别名
使用@Description("Provides a basic example of a bean")
注解进行bean的描述注解
容器的启动
首先抛开SpringBoot的启动方式不谈,我们先来说一下怎么直接启动一个注解相关的Spring容器。
根据官方文档指出,当我们需要使用注解来开发时,应该使用AnnotationConfigApplicationContext
来实例化一个Spring的容器:
public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);MyService myService = ctx.getBean(MyService.class);myService.doStuff();
}
Spring学习笔记——@Configuration和@Bean注解相关推荐
- Spring学习笔记15--注解Bean
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...
- Spring学习笔记--自动装配Bean属性
Spring提供了四种类型的自动装配策略: byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType – 把与Bean的属性具有相同类型 ...
- Spring @Configuration 和 @Bean 注解
@Configuration 和 @Bean 注解 带有 @Configuration 的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源.@Bean 注解告诉 Spri ...
- spring学习笔记06-spring整合junit(出现的问题,解决的思路)
spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...
- spring学习笔记01-BeanFactory和ApplicationContext的区别
spring学习笔记01-BeanFactory和ApplicationContext的区别 BeanFactory 和 ApplicationContext 的区别 BeanFa ...
- spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)
spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...
- Spring学习笔记之MyBatis
系列文章目录 Spring学习笔记 之 Springhttps://blog.csdn.net/weixin_43985478/article/details/124411746?spm=1001.2 ...
- 【Spring学习笔记 九】Spring声明式事务管理实现机制
什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...
- Spring 学习笔记----->AOP
Spring 学习笔记----->AOP 代理模式 为什么学代理模式? 因为这就是Spring Aop的底层 代理模式的分类: 静态代理 动态代理 静态代理 生活用的例子: 房东 public ...
最新文章
- 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)
- UNITY技巧-查找脚本被哪个场景引用
- JQueryEasyUI学习笔记(十一)datagrid 右键菜单,冻结列
- win7下搭建小程序服务器,技术开发人员告诉你微信小程序怎么做
- 解析几何 —— 经典题解
- iphone core animation教程
- 24个能给你的博客带来流量的网站
- MongoDb系列文章
- 热议:为什么近些年硕士生考博意愿偏低?
- 荣耀盒子显示服务器繁忙错误码7,【沙发管家】华为荣耀盒子的三种解决方式...
- catia二次开发:人机交互select,start command
- 利用frps进行内网穿透
- 华为以太网链路聚合Eth-Trunk实验
- 一个类的属性调用另一个类的实例
- 1、查询姓名中包含‘u’字母的员工记录2、同名去重3、字段计算
- 股票量化交易有什么优势?注意哪些风险?
- 2021年广东省安全员A证第三批(主要负责人)考试总结及广东省安全员A证第三批(主要负责人)试题及解析
- 汉高2019年第三季度销售额增长0.8%,达50.77亿欧元
- InfluxDB2.2及Influx安装
- macOS中比较好的解压缩软件:The Unarchiver
热门文章
- ANSYS中关于质量矩阵 刚度矩阵的提取【1】
- 笔记——流水线基础概念
- 重磅!发表在人工智能顶刊(TPAMI)上的一篇文章表示脑电与计算机视觉的交叉存在缺陷和盲点...
- mac下安装redis 和 redis可视化工具rdm并且连接redis
- 格式工厂视频压缩转码选择
- 手把手教你使用cmake生成contrib扩展库,以windows 10+VS2015+opencv3.3+contrib3.3为例
- 【Qt】 Fractal Designer 5.3 Bug Report
- 面料淡季就是服装的旺季
- 毕业一年感想~微思顾轻展望
- 帝国时代3java_帝国时代3-亚洲王朝