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的加载方式~的更多相关文章

  1. 【Spring】详解Spring中Bean的加载

    之前写过bean的解析,这篇来讲讲bean的加载,加载要比bean的解析复杂些,该文之前在小编原文中有发表过,要看原文的可以直接点击原文查看,从之前的例子开始,Spring中加载一个bean的方式: ...

  2. Vue中图片的加载方式

    一.前言 VUE项目中图片的加载是必须的,那么vue中图片的加载方式有哪些呢,今天博主就抽点时间来为大家大概地捋一捋. 二.图片的加载方法 1.在本地加载图片(静态加载) 图片存放assets文件夹中 ...

  3. Spring 容器中bean的加载过程

    bean 的加载过程大致可以分为以下几个步骤: 1.获取配置的资源文件 2.对获取到的xml资源文件进行解析 3.获取包装资源 4.解析处理包装之后的资源 5.加载 提取bean 并进行注册(添加到b ...

  4. Spring IoC bean 的加载

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 容 ...

  5. 如果你还不知道如何控制springboot中bean的加载顺序,那你一定要看此篇

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功 ...

  6. Spring中资源的加载原来是这么一回事啊!

    1. 简介 在JDK中 java.net.URL 适用于加载资源的类,但是 URL 的实现类都是访问网络资源的,并没有可以从类路径或者相对路径获取文件及 ServletContext , 虽然可以通过 ...

  7. 浅谈Entity Framework中的数据加载方式

    如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...

  8. 简说Spring中的资源加载

    声明: 本文若有 任何纰漏.错误,请不吝指正!谢谢! 问题描述 遇到一个关于资源加载的问题,因此简单的记录一下,对Spring资源加载也做一个记录. 问题起因是使用了@PropertySource来进 ...

  9. Spring中的资源加载

    大家也都知道JDK的类加载器:BootStrap ClassLoader.ExtenSion ClassLoader.Application ClassLoader:也使用了双亲委派模型,主要是为了防 ...

  10. Spring中Bean的不同配置方式

    Bean的配置方式一共分为三种: 1.基于XML(适用于第三方类库,无法在类中写注解以及写命名空间的配置等情况) 2.基于注解(适用于大部分情况) 3.基于Java类 以下是三种不同情况的配置方式   ...

随机推荐

  1. 淘宝详情api接口的使用说明

    淘宝详情API接口是一种可以用来获取淘宝商品详细信息的服务,包括图片.标题.价格.销量.评论等数据.下面是淘宝详情API接口的使用说明: 1.关于申请API接口权限: 在使用淘宝详情API接口前,需要 ...

  2. API数据接口获取商品详情数据该怎么操作

    随着电商行业的快速发展,获取商品详情数据是电商应用的重要功能之一.为了提高用户的购物体验,开发者可以利用API接口获取商品详情数据,方便用户了解商品的具体信息和特点.在本文中,我们将介绍如何使用API ...

  3. ArcMap中矢量数据修改标注Label的方法

      本文介绍在ArcMap软件中,修改图层标签(Label)所显示字段与具体显示内容的方法.   在之前的文章中,我们看到了ArcMap中修改图层标签的重要性:可是,如何自定义图层的标签内容呢?    ...

  4. 原来你是这样的JAVA--目录

    .NET程序员转Java过程中遇到的一些经验分享,陆续更新中. 原来你是这样的Java[01]--基础一瞥 原来你是这样的Java[02]-包.传参.构造器 原来你是这样的Java[03]-继承.多态 ...

  5. xlsx和path的运用

    从后端获取Excel模板 app.get('/api/download-template', (req, res) => { const templatePath = path.join(__d ...

  6. 华为云ECS上搭建Hadoop集群环境启动时报错“java.net.BindException: Cannot assign requested address”问题的解决

    启动时使用: ./sbin/start-all.sh 1 报错: java.net.BindException: Problem binding to [test7972:9000] java.net ...

  7. 8K Star,一款开源仿Notion且AI强化的编辑器:Novel

    Notion相信大家都不陌生了,一款非常好用的笔记软件,TJ君也一直在用来记笔记和写文章.关于Notion的替代品,之前有给大家推荐AFFiNE ,但这个还是一个比较成型的软件. 那么如果想开发一个类 ...

  8. dedebiz 清理冗余废弃未引用图片方法

    原理描述: 在原有织梦后台菜单中增加"清理冗余图片按钮",实现清理冗余图片的功能. 操作步骤: 1. 打开后台admin\sys_sql_query.php代码 在该文件中搜索如下 ...

  9. ERROR: nginx-1.22.1 installation failed.

    libraries. You can either do not enable the module or install the libraries.make: *** No rule to mak ...

  10. SpringBoot + 自定义注解 + AOP 高级玩法打造通用开关

    前言 最近在工作中迁移代码的时候发现了以前自己写的一个通用开关实现,发现挺不错,特地拿出来分享给大家. 为了有良好的演示效果,我特地重新建了一个项目,把核心代码提炼出来加上了更多注释说明,希望xdm喜 ...