Spring中Bean的加载方式~
1、方式一:基于spring.xml方式配置Bean
user
import lombok.Data;
/**
* @author : ly
*/
@Data
public class User {
private String name;
private Integer age;
}
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user1" class="com.ly.domain.User">
<property name="name" value="张三"/>
<property name="age" value="25"/>
</bean>
</beans>
test
/**
* @author : ly
*/
@SpringBootTest
public class GetBeanTest {
private ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
@Test
public void testXML(){
User user1 = app.getBean("user1", User.class);
System.out.println("user1 = " + user1);
}
}
结果

2、方式二:基于properties方式配置Bean
properties
user.(class) = com.ly.domain.User
user.name = 李四
user.age = 20
test
@Test
public void testProperties(){
GenericApplicationContext applicationContext = new GenericApplicationContext();
//创建一个PropertiesBeanDefinitionReader,可以从properties读取Bean的信息,将读到的Bean信息放到applicationContext中
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(applicationContext);
//创建一个properties文件对应的Resource对象
Resource classPathResource = new ClassPathResource("bean1.properties");
//加载配置文件
propReader.loadBeanDefinitions(classPathResource);
applicationContext.refresh();
User user = applicationContext.getBean(User.class);
System.out.println(user);
}
结果

3、方式三:@Component + @ComponentScan,衍生注解@Controller、@Service、@Repository...
这种方式常用,而且不叫简单就不写案例了
4、方式四:@Bean针对第三方的Bean
例如我们配置MybatisPlus分页插件时,就是使用@Bean方式把分页插件MybatisPlusInterceptor交给Spring管理
@Bean
@Configuration
public class MybatisPlusConfig {
//分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setMaxLimit(500L);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setDbType(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInterceptor);//分页
return interceptor;
}
}
5、方式五:@Import|@ImportSelector|@ImportBeanDefinitionRegistrar导入对应的Bean
@Import
通过import的方式将bean加入到spring容器中,这些在容器中bean名称是该类的全类名 ,比如com.ly.User
test
@Import(User.class)
@ImportSelector
UserImportSelector
/**
* @author : ly
*/
@Slf4j
public class UserImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
log.info("通过ImportSelector导入对应的Bean");
return new String[]{"com.ly.domain.Dog"};
}
}
MyImportSelector
/**
* @author : ly
*/
@Import(UserImportSelector.class)
public class MyImportSelector {
}
test
@Test
public void testImportSelector(){
Dog dog = ctx.getBean(Dog.class);
System.out.println("dog = " + dog);
}
结果

@ImportBeanDefinitionRegistrar
UserImportBeanDefinitionRegistrar
public class UserImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
registry.registerBeanDefinition("dogRegister",new RootBeanDefinition(Dog.class));
}
}
UserImportRegisterAnnotation
/**
* @author : ly
*/
@Import(UserImportBeanDefinitionRegistrar.class)
public class UserImportRegisterAnnotation {
}
test
@Test
public void testImportRegister(){
Dog dog = ctx.getBean("dogRegister", Dog.class);
System.out.println("dog = " + dog);
}
结果

6、方式六:BeanFactoryPostProcessor注册对应的Bean
UserBeanDefinitionRegistryPostProcessor
/**
* @author : ly
*/
public class UserBeanDefinitionRegistryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
User user = new User();
user.setName("王五");
user.setAge(20);
configurableListableBeanFactory.registerSingleton("userProcessor", user);
}
}
测试
@Test
public void testProcessor(){
AnnotationConfigApplicationContext app2 = new AnnotationConfigApplicationContext();
app2.register(UserBeanDefinitionRegistryPostProcessor.class);
app2.refresh();
User userProcessor = app2.getBean("userProcessor", User.class);
System.out.println("userProcessor = " + userProcessor);
}
结果

7、方式七:FactoryBean
当我们通过配置文件、注解声明或者是注册BeanDenifition的方式,往Spring容器中注入了一个class类型为FactoryBean类型的Bean时候,其实真正注入的Bean类型为getObjectType方法返回的类型,并且Bean的对象是通过getObject方法返回的。
UserFactoryBean
/**
* @author : ly
*/
public class UserFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
User user = new User();
user.setName("赵六");
user.setAge(23);
return user;
}
@Override
public Class<?> getObjectType() {
return User.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
test
@Test
public void testFactorBean(){
app2.register(UserFactoryBean.class);
app2.refresh();
User bean = app2.getBean(User.class);
System.out.println("bean = " + bean);
}
结果

总结:
Bean注入到Spring容器中大致可以分这么几种:
- 配置文件
- 注解声明
- BeanDefinition
- BeanFactoryPostProcessor注册Bean
- FactoryBean
Spring中Bean的加载方式~的更多相关文章
- 【Spring】详解Spring中Bean的加载
之前写过bean的解析,这篇来讲讲bean的加载,加载要比bean的解析复杂些,该文之前在小编原文中有发表过,要看原文的可以直接点击原文查看,从之前的例子开始,Spring中加载一个bean的方式: ...
- Vue中图片的加载方式
一.前言 VUE项目中图片的加载是必须的,那么vue中图片的加载方式有哪些呢,今天博主就抽点时间来为大家大概地捋一捋. 二.图片的加载方法 1.在本地加载图片(静态加载) 图片存放assets文件夹中 ...
- Spring 容器中bean的加载过程
bean 的加载过程大致可以分为以下几个步骤: 1.获取配置的资源文件 2.对获取到的xml资源文件进行解析 3.获取包装资源 4.解析处理包装之后的资源 5.加载 提取bean 并进行注册(添加到b ...
- Spring IoC bean 的加载
前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 容 ...
- 如果你还不知道如何控制springboot中bean的加载顺序,那你一定要看此篇
1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功 ...
- Spring中资源的加载原来是这么一回事啊!
1. 简介 在JDK中 java.net.URL 适用于加载资源的类,但是 URL 的实现类都是访问网络资源的,并没有可以从类路径或者相对路径获取文件及 ServletContext , 虽然可以通过 ...
- 浅谈Entity Framework中的数据加载方式
如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...
- 简说Spring中的资源加载
声明: 本文若有 任何纰漏.错误,请不吝指正!谢谢! 问题描述 遇到一个关于资源加载的问题,因此简单的记录一下,对Spring资源加载也做一个记录. 问题起因是使用了@PropertySource来进 ...
- Spring中的资源加载
大家也都知道JDK的类加载器:BootStrap ClassLoader.ExtenSion ClassLoader.Application ClassLoader:也使用了双亲委派模型,主要是为了防 ...
- Spring中Bean的不同配置方式
Bean的配置方式一共分为三种: 1.基于XML(适用于第三方类库,无法在类中写注解以及写命名空间的配置等情况) 2.基于注解(适用于大部分情况) 3.基于Java类 以下是三种不同情况的配置方式 ...
随机推荐
- Java并发编程 优化多任务查询接口
代码展示 @RestController @RequestMapping("/api") public class TestController { @Resource priva ...
- Pytorch语法——torch.autograd.grad
The torch.autograd.grad function is a part of PyTorch's automatic differentiation package and is use ...
- Java实践项目 - 商品分类
Smiling & Weeping ---- 好想回到那个拉钩许诺的年代 1.1商品分类的思路:一次性查询三级分类 (一级为美味麒麟榜,二级为闭眼入,第三级为商品) 优点:只需要一次查询,根据 ...
- C# 代码实现关机
AdvApi32.LookupPrivilegeValue(null, "SeShutdownPrivilege", out var lpLuid); using var t = ...
- Vue Vuex状态管理
1.1 理解 Vuex 1.1.1 Vuex 是什么 概念:专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 Vue 应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组 ...
- mpi转以太网连接300PLC与易控INSPEC上位机软件通讯
300PLC转以太网与易控 INSPEC 上位机软件通讯 易控 INSPEC 软件通过以太网连接西门子 S7300 系列 PLC, 兴达易控MPI-ETH-XD1.0通讯模块为 PLC 提供以太网通讯 ...
- ECS搭建FTP服务
实验云账号,创建资源后生成收起 子用户名称: u-7ngohee5@1111971854401817 子用户密码: Jp1Ho5Aj5Ek5Yx1P AK ID: LTAI5tGc6fVMJj44H4 ...
- P6066 [USACO05JAN] Watchcow S
prologue 这个题这么水的一个板子题. analysis 这个题目我们正反建两条边,在跑欧拉回路的时候,看这个边是不是被走过,走过就不走,跳过这个边.如果没走,就走这条边并且标记这个边走过了. ...
- 虹科案例|Redis企业版数据库:金融行业客户案例解读
传统银行无法提供无缝的全渠道客户体验.无法实时检测欺诈.无法获得业务洞察力.用户体验感较差.品牌声誉受损和业务损失?虹科提供的Redis企业版数据库具有低延迟.高吞吐和可用性性能,实施Redis企业版 ...
- 【数字图像处理】Matlab实现-图像增强-彩色图像增强(彩虹编码,热金属编码)
伪彩色处理 伪彩色增强:把一幅黑白域图像的不同灰度级映射为一幅彩色图像的技术手段. 伪彩色增强有很多种方法,而下面的增强方法则是使用的空间域灰度级-彩色变换法. 空间域灰度级-彩色变换法:可以将灰度图 ...