spring框架学习总结(非xml方式注册bean)
引言
最近在腾讯课堂上学习了spring框架bean的注册(注解形式),为此整理下知识点,方便过后温习,并巩固等。也希望能帮助你们。
核心配置类:
创建核心配置类,需要在类上加上注解@Configuration,配置类可以有多个,相当于spring的xml配置文件,我们想注册的bean都会通过配置类注册进spring的ioc容器,具体实现如下:
package com.jym.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.jym.bean.Person;@Configuration
public class JymConfig {}
第一种方式注册bean:
使用@bean注解: @bean注解是最简单的一种注册方式,具体实现方式:
实体类preson:
public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public Person() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";} }
配置类 注意:这里的beanid 默认为方法名!!!:
@Configuration
public class JymConfig {@Beanpublic Person person(){return new Person("jym",20);}}
测试类:
//获得spring的上下文工具ApplicationContext app = new AnnotationConfigApplicationContext(JymConfig.class);//获取beanPerson person = (Person) app.getBean("person");System.out.println(person);
优点:简单明了
缺点:当有很多bean需要注册的时候 代码过多
第二种方式注册bean:
使用扫描包注解@ComponentScan 有个属性value 后面写上需要扫描的包名,在spring容器初始化的时候,就会把包下类上加 @Componen, @Repository ,@Service ,@Controller的类都注册进ioc容器中
这是最常用的一种注册bean的方式
@Configuration
@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {@Beanpublic Person person(){return new Person("jym",20);}}
第三种方式注册bean:
@Import注解 注册的一个或多个bean。
具体实现:
配置类:
@Configuration
@Import(value = { Dog.class,Monkey.class})
//@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {@Beanpublic Person person(){return new Person("jym",20);}}
测试类代码:
ApplicationContext app = new AnnotationConfigApplicationContext(JymConfig.class);//获得ioc容器的所有bean idString[] str = app.getBeanDefinitionNames();for (int i = 0; i < str.length; i++) {System.out.println(str[i]);}
结果:
根据测试结果能看出 需要创建的bean已经在ioc容器中
通过这种方式注册的bean ,ID为类的包名.类名
第四种方式注册bean:
实现 ImportSelector接口
具体实现方式:
- 先创建实现类,并重写方法
package com.jym.interfaceBean;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;public class JymImportSelector implements ImportSelector{@Overridepublic String[] selectImports(AnnotationMetadata arg0) {return new String[]{"com.jym.bean.Cat"};}}
2.将实现类配置到配置类中:
@Configuration
@Import(value = { Dog.class,Monkey.class,JymImportSelector.class})
//@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {@Beanpublic Person person(){return new Person("jym",20);}}
测试代码跟上面的一样
结果为:
这种方式也可以配置多个bean
第五种方式注册bean:
使用场景 当ioc容易存在某一个bean的时候 就注册另一个bean
实现ImportBeanDefinitionRegistrar接口注册
具体实现(与ImportSelector步骤相同):
package com.jym.interfaceBean;import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.stereotype.Component;import com.jym.bean.Monkey;
@Component
public class JymBeanDefinitionRegistry implements ImportBeanDefinitionRegistrar{/*** AnnotationMetadata 当前注册类的注解信息* BeanDefinitionRegistry BeanDefinition注册类*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata arg0, BeanDefinitionRegistry arg1) {boolean bean1 = arg1.containsBeanDefinition("com.jym.bean.Cat");boolean bean2 = arg1.containsBeanDefinition("com.jym.bean.Dog");//如果同时存在cat dog 类 就注册monkeyif(bean1&&bean2){RootBeanDefinition beanDefinition = new RootBeanDefinition(Monkey.class);arg1.registerBeanDefinition("monkey", beanDefinition);}}}
配置类:
package com.jym.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;import com.jym.bean.Dog;
import com.jym.bean.Monkey;
import com.jym.bean.Person;
import com.jym.interfaceBean.JymImportSelector;@Configuration
@Import(value = { Dog.class,Monkey.class,JymImportSelector.class})
@ComponentScan(value="com.jym.interfaceBean")
public class JymConfig {@Beanpublic Person person(){return new Person("jym",20);}}
结果:
根据结果可见 我们的Monkey也在IOC容器中
感谢您的观看!!
spring框架学习总结(非xml方式注册bean)相关推荐
- spring bean xml 调用方法_Spring通过Xml方式注册Bean的几处关键实现点
1.前言 我们用SpringMVC的时候一般会用到Xml配置文件,那么我们这篇文章就来谈下Spring读取Xml配置文件的一些关键实现点. 2.AbstractRefreshableApplicati ...
- Spring框架学习笔记---完结
一.简介 Spring:春天----->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月24日,Spring框架 ...
- Spring框架学习路线
文章目录 1.Spring 1.1.简介 1.2.优点 1.3.扩展 2.IOC理论 2.1.IOC的创建对象的方法 3.Spring配置 3.1.Bean配置 3.2.import 4.依赖注入 4 ...
- Spring框架学习笔记,超详细!!(4)
Java小白开始学习Spring框架,一方面,跟着视频学习,并记录下学习笔记,方便以后复习回顾.另一方面,发布学习笔记来约束自己,学习路程还很遥远,继续加油坚持!!!希望能帮助到大家! 另外还有我的牛 ...
- Spring框架学习(二)
Spring框架学习笔记---->AOP AOP概念 AOP:aspect oriented programing,面向切面编程. 将软件的各个模块,按照横向的角度进行观察,发现各个模块之间存在 ...
- Spring框架学习笔记(三)(AOP,事务管理)
Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...
- IOC操作Bean管理XML方式(bean的作用域)
目录 IOC操作Bean管理XML方式(bean的作用域) 1.在Spring 里面,设置创建 bean 实例是单实例还是多实例的方式 (1)在Spring 配置文件bean 标签里面有属性(scop ...
- IOC操作Bean管理XML方式(bean 的生命周期)
目录 IOC操作Bean管理XML方式(bean 的生命周期) 1.bean 的生命周期(在单例模式下的生命周期) (1)通过构造器创建 bean 的实例(执行类中无参构造方法去创建对象) (2)为 ...
- Spring框架学习教程,详解Spring注入bean的几种方式
首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...
- Spring框架学习(四):聊一聊xml配置和Java配置
之前的例子在演示过程中直接使用了xml的配置方式,对于刚刚接触Spring的同学来说肯定也是蒙圈的.这篇我们就从配置开始聊起. 在开发过程中,程序员通常使用这两种方式进行Spring的配置: 基于XM ...
最新文章
- 皮一皮:来看看你是哪一档...
- 你是一个合格的数据分析师吗?教你如何提升自己的product sense?
- Redis事务中的watch机制-从实例入手学习
- ESP8266等模块
- 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)
- 【机器学习】 LightGBM——优于XGBoost提升的集成算法(安装+对比XGBoost改进+参数说明+python代码实例)
- IDEA中的HTTP Client Editor测试API
- Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join
- php判断简写,怎么简写php 中的三元运算符
- BiquadFilterNode
- 用英伟达Jetson Nano运行PyTorch Fast.ai丨手把手教程+第三方工具
- 计算机网络 时延、发送时延、传输时延、处理时延、排队时延、时延带宽积
- php伪类,CSS3新增伪类
- 笔记5 bean的作用域
- C++技术之一:C++类 _stdcall
- C++描述 LeetCode 112. 路径总和
- 445端口telnet不通经验总结
- python水果超市管理系统_java实现水果超市管理系统
- 如何同时登陆局域网和互联网?
- 财路网每日原创推送:混迹币圈必看,吐血推荐!