Spring Bean的定义及三种创建方式

 更新时间:2023年07月04日 11:31:54   作者:熊猫Jay  
本文主要介绍了Spring容器获取Bean的9种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

定义

Spring bean 对象是构成应用程序的支柱,也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的。

创建Bean

基于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="beanDemoJay" class="demo.BeanDemoJay"/>
</beans>

基于注解扫描的配置

从 Spring 2.5 开始就可以使用注解来配置依赖注入,在可以使用基于注解的配置之前,我们将需要在我们的 Spring 配置文件中启用它。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 开启基于注解的配置 -->
    <context:annotation-config/>
    <!-- bean definitions go here -->
</beans>

当开启后,将可以在代码上使用注解,这表明 Spring 应该自动连接值到属性,方法和构造函数。如下是常用的注解:

序号说明
1@Required 注解应用于 bean 属性的 setter 方法。
2@Autowired 注解可以应用到 bean 属性的 setter 方法,非 setter 方法,构造函数和属性。
3@Qualifier通过指定确切的将被连线的 bean,@Autowired 和 @Qualifier 注解可以用来删除混乱。
4JSR-250 AnnotationsSpring 支持 JSR-250 的基础的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。

基于Java的配置

基于 Java 的配置,可以使你在不用配置 XML 的情况下编写大多数的 Spring,主要通过 @Configuration 和 @Bean 等注解。

注解说明
@Component最普通的一个注解,一般用于把普通pojo实例化到spring容器中。@Controller 和 @Service 和@Repository 是它的特殊情况,只是作为一个普通的类,不需要特殊归类时,比较适合采用@Component注解。
@Controller用于标注控制层,表示向控制层注入服务层的数据
@Service用于标注服务层,来进行业务的逻辑处理,在服务层注入DAO层数据
@Repository用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
@Configuration用于定义配置类,可替换xml配置文件,也可以理解为Spring配置文件当中的上下文。

依附于@Configuration的注解

@Bean 创建Deom

@Configuration
public class Demo {
    @Bean
    public Demo demo(){
        return new Demo();
    }
}

@Import 创建Cofing

@Configuration
@Import(Config.class)
public class Demo {
}

@Import.ImportSelector 选择器,传入@Import注解所在类Demo上所有的注解信息,返回要导入的类名

@Configuration
@Import(ImportSelector_.class)
public class Demo {   
}
public class ImportSelector_ implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.spring.demo.beanlifecycle.Demo"};
    }
}

@Impport.ImportBeanDefinitionRegistrar Bean定义注册器,传入@Import注解所在类Demo上所有的注解信息:

Mybatis的Mapper接口就是用这种方式将Bean定义注册到Spring上下文的

@Configuration
@Import(ImportBeanDefinitionRegistrar_.class)
public class Demo {
}
public class ImportBeanDefinitionRegistrar_ implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Bean.class).setInitMethodName("init").setDestroyMethodName("destroy").getBeanDefinition();
        registry.registerBeanDefinition("bean", beanDefinition);
        System.out.println("registerBeanDefinitions: " + beanDefinition);
    }
}

FactoryBean

当通过“factoryBean”获取实例时,FactoryBean会调用getObject()方法;

当通过“&factoryBean”获取实例时,返回FactoryBean的实例;

当通过Demo.class来获取bean实例时,调用factoryBean的getObjectTyoe()来获取类型。

@Configuration
public class Demo {
    @Bean
    public FactoryBean_ factoryBean(){
        return new FactoryBean_();
    }
}
public class FactoryBean_ implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        return new Demo();
    }
    @Override
    public Class<?> getObjectType() {
        return Demo.class;
    }
}

到此这篇关于Spring Bean的定义及三种创建方式的文章就介绍到这了,更多相关Spring Bean定义及创建内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解JavaSE中抽象类与接口的定义及使用

    详解JavaSE中抽象类与接口的定义及使用

    这篇文章主要为大家详细介绍了JavaSe的抽象类和接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-07-07
  • Java中二叉树的先序、中序、后序遍历以及代码实现

    Java中二叉树的先序、中序、后序遍历以及代码实现

    这篇文章主要介绍了Java中二叉树的先序、中序、后序遍历以及代码实现,一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成,需要的朋友可以参考下
    2023-11-11
  • Java设计模式之装饰模式原理与用法实例详解

    Java设计模式之装饰模式原理与用法实例详解

    这篇文章主要介绍了Java设计模式之装饰模式原理与用法,结合实例形式详细分析了装饰模式的概念、原理、定义与使用方法,并总结分析了装饰模式的优缺点,具有一定参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • Java中处理XML数据的方法

    Java中处理XML数据的方法

    本文介绍了在Java中处理XML数据的几种常见方法:DOM、SAX和JAXB,每种方法都有其适用的场景和优缺点,具体选择取决于项目的需求和性能考虑,这篇文章主要介绍了Java中处理XML数据的方法,需要的朋友可以参考下
    2024-06-06
  • 分析Java中为什么String不可变

    分析Java中为什么String不可变

    Java中为什么String是不可变性的。今天我们从多角度解析为什么Java把String做成不可变的。
    2021-06-06
  • Springcould多模块搭建Eureka服务器端口过程详解

    Springcould多模块搭建Eureka服务器端口过程详解

    这篇文章主要介绍了Springcould多模块搭建Eureka服务器端口过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java反射 PropertyDescriptor类案例详解

    Java反射 PropertyDescriptor类案例详解

    这篇文章主要介绍了Java反射 PropertyDescriptor类案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • java随机抽取指定范围不重复的数字

    java随机抽取指定范围不重复的数字

    这篇文章主要介绍了java随机抽取指定范围不重复的数字的相关资料,需要的朋友可以参考下
    2016-06-06
  • Java Session会话追踪原理深入分析

    Java Session会话追踪原理深入分析

    web开发阶段我们主要是浏览器和服务器之间来进行交互。浏览器和服务器之间的交互就像人和人之间进行交流一样,但是对于机器来说,在一次请求之间只是会携带着本次请求的数据的,但是可能多次请求之间是会有联系的,所以提供了会话机制
    2022-11-11
  • Spring Boot + EasyExcel + SqlServer 进行批量处理数据的高效方法

    Spring Boot + EasyExcel + SqlServer 进行批量处理数据的高效方法

    在日常开发和工作中,我们可能要根据用户上传的文件做一系列的处理,本篇文章就以Excel表格文件为例,主要介绍了Spring Boot + EasyExcel + SqlServer 进行批量处理数据的高效方法,需要的朋友可以参考下
    2024-06-06

最新评论