前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数一数Spring Bean的几种加载方式以及常识技巧

数一数Spring Bean的几种加载方式以及常识技巧

作者头像
大话swift
发布2019-09-09 18:24:31
2.3K0
发布2019-09-09 18:24:31
举报
文章被收录于专栏:大话swift

获得一个bean的流程

1 声明bean (声明不代表已经创建)

2加载进Spring容器中

3获取

常规的装配bean的两种方式呢?

1 xml配置解析加载

xml声明bean我们已经接触过,这里我们稍微回顾一下步骤

1 classpath下创建springconfig的xml文件

2 通过beanfactory加载

通常我们使用对应资源的applicationCOntext

代码语言:javascript
复制
ApplicationContext context = new ClassPathXmlApplicationContext("beanXmlContext.xml");XmlBeanExample example = context.getBean(XmlBeanExample.class);

bean的xml相互引用

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">    <import resource="applicationContext.xml"/>    <bean class="com.bean.code.XmlBeanExample" name="beanExample"/></beans>

导入之后就可以获取其他xml中声明的bean

代码语言:javascript
复制
LogAspect logAspect = context.getBean(LogAspect.class);ProductService productService = (ProductService) context.getBean("productService");productService.doSOmeThing();

2注解方式获取

采用注解的方式大致与xml过程一致分为

声明bean 配置bean

bean扫描

加载bean

1 声明bean

注解使用@Component声明一个bean,与xml功能相同可以申明scope bean名称(默认为手写字母小写的类名)

代码语言:javascript
复制
@Component//@Component(value = "student1")@Primary
public class Student {    String name;    @Value(value = "12")    String age;}

2

1的步骤只是声明了一个bean和系统配置,而个个声明都是在class文件中怎么知道bean的存在呢?于是就需要进行扫描找到bean

代码语言:javascript
复制
@ComponentScan//@ComponentScan(basePackages = "com.bean.*")public class StudentConfig {}

而对于ComponentScan默认是扫描自身所在的当前包,当然了也可指定扫描某些个包和需要扫描的某些class

3加载bean到Spring容器中

对于1 2步骤声明和扫描得到bean之后我们需要的就是将这些bean加载到SPring容器中来使用

代码语言:javascript
复制
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(StudentConfig.class);Student student = (Student) context.getBean("student");System.out.println(student);Student student1 = context.getBean(Student.class);System.out.println(student1);StudentService service = context.getBean(StudentService.class);service.getStudent();

上述代码首行就是采用注解的方式来将bean装载到容器中

3自动装载autowried

对于不同自动装载我们还是用学生的粒子,小a和小b两个学生

我们自动装载时怎么区分a和b呢?

Spring为我们提供了策略 :

1 采用优先级

声明bean时有一个@Primary的可选注解,默认遇到相同的bean(类型而非名称)则先采用@Promary的bean

2采用鉴别方式Qualifier

通常我们的bean都是有名字的,那么我们可以通过名称来指定某一个bean进行自动装配

//根据类型来查找到符合条件的 @Autowired//自动装配的时候还可以从符合条件的bean中指定某一个具体的 //如 我们有两个 bean 分别为 a1 a2 那么可以制定哪个 // a1 a2的bean也是有优先级的,默认是注入优先级搞的Primary @Qualifier("student1") //指定student1去干 Student student;

其实这个很好理解:上学时都有课代表,最后大家角逐出了 a b两个,最终老师制定了a,同时说b是备选,当a请假时b来负责……但是莫一天老师看到a在那里学习就说b你去发作业本吧

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档