我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring定义Bean的方式有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring定义Bean的方式有哪些

本文小编为大家详细介绍“Spring定义Bean的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring定义Bean的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    1.通过XML的方式来生成一个bean

    最简单也是最原始的一种方式,通过XML来定义一个bean,我们来看下其过程

    1)创建entity,命名为Student

    @Data@AllArgsConstructor@NoArgsConstructorpublic class Student implements Serializable {     private static final long serialVersionUID = -2088281526481179972L;    private int id;    private String name;    private int age;}

    2)在beans.xml中定义Student

        <!-- 1.空值的student -->    <bean id="studentNoValue" class="domain.Student"/>     <!-- 2.带值的student -->    <bean id="student" class="domain.Student">        <property name="id" value="11"/>        <property name="age" value="22"/>        <property name="name" value="jack"/>    </bean>     <!-- 3.全参构造:使用成员变量名称对应 -->    <bean id="studentConstruct" class="domain.Student">        <constructor-arg name="age" value="22"></constructor-arg>        <constructor-arg name="id" value="11"></constructor-arg>        <constructor-arg name="name" value="jack"></constructor-arg>    </bean>     <!-- 4.全参构造:使用成员变量index对应 -->    <bean id="studentConstruct2" class="domain.Student">        <constructor-arg index="0" value="11"></constructor-arg>        <constructor-arg index="1" value="jack"></constructor-arg>        <constructor-arg index="2" value="22"></constructor-arg>    </bean>     <!-- 5.全参构造:使用成员变量类型对应 -->    <bean id="studentConstruct3" class="domain.Student">        <constructor-arg type="int" value="11"></constructor-arg>        <constructor-arg type="java.lang.String" value="jack"></constructor-arg>        <constructor-arg type="int" value="22"></constructor-arg>    </bean>

    总结:可以看到,创建bean的方式多种多样,我们可以通过属性来赋值<property>,也可以通过构造参数来赋值<constructor>,关于构造赋值以上展示了三种方式,我们可以根据自己的需求来选择对应的方式。

    3)测试bean

    public class ApplicationContextTest {     @Test    public void testXml(){        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");        Student studentNoValue = (Student) applicationContext.getBean("studentNoValue");        Student studentFullValue = (Student) applicationContext.getBean("studentFullValue");        System.out.println(studentNoValue);        System.out.println(studentFullValue);          Student studentConstruct1 = (Student) applicationContext.getBean("studentConstruct");        Student studentConstruct2 = (Student) applicationContext.getBean("studentConstruct2");        Student studentConstruct3 = (Student) applicationContext.getBean("studentConstruct3");        System.out.println(studentConstruct1);        System.out.println(studentConstruct2);        System.out.println(studentConstruct3);         Book bookChinese = (Book) applicationContext.getBean("bookChinese");        System.out.println(bookChinese);    }}// res:Student(id=0, name=null, age=0)Student(id=11, name=jack, age=22)Student(id=11, name=jack, age=22)Student(id=11, name=jack, age=22)Student(id=11, name=jack, age=22)

    2.<bean>标签深入了解

    我们刚才介绍了最基本的Bean使用方式,大家会发现<bean>标签还有其他的属性,比如name/scope/lazy-init/init-method/...等,这些是做什么用的呢?我们在实际的工作中怎么使用呢?

    1)name属性

    在介绍name属性之前,我们先来看下ApplicationContext.getBean()的两种方式

    * ApplicationContext.getBean(String name)

    * ApplicationContext.getBean(Class<T> requiredType)

    第一种方式的这个name是什么呢?我们应该如何定义,又该如何使用呢?

    // 上文示例中,我们只是指定了Bean的id和class,如下所示<bean id="studentNoValue" class="domain.Student" />    // 具体获取bean的方式如下:Student studentNoValue = (Student) applicationContext.getBean("studentNoValue"); // 可以看到,在没有指定bean的name属性的时候,默认使用id来获取bean,当做name使用// 如果我们不想根据id获取,那就需要主动指定bean的name属性,如下所示:<bean id="studentNoValue" class="domain.Student" name="stuName"/>// 这样在获取的时候,就需要使用指定的名称来获取,再根据id来获取的时候就会报错了Student studentNoValue = (Student) applicationContext.getBean("stuName");    * 根据Class来获取这种方式很好理解,这个不关心你定义的id或者name是什么,使用如下:Student studentNoValue = (Student) applicationContext.getBean(Student.class);

    2)scope属性

    可以看到,在使用scope属性的时候,提示有两种输入值,分别是singleton/prototype

    这个就代表了Spring-Bean的两种创建模式,单例模式和原型模式

    * Spring默认使用单例模式来创建Bean,通过ApplicationContext所获得的bean都是同一个bean(在beanName相同的情况下),我们可以来验证下

    Student studentNoValue = (Student) applicationContext.getBean("stuName");Student studentNoValue2 = (Student) applicationContext.getBean("stuName"); System.out.println(studentNoValue == studentNoValue2);// true

    可以看到的是结果输入为true,从工厂类中两次获取的stuName是同一个对象。

    * 下面来验证下原型模式

    原型模式:每次获取的bean都为一个新的对象

    // 修改beans.xml中studentNoValue的scope为prototype<bean id="studentNoValue" class="domain.Student" name="stuName" scope="prototype"/> // 然后执行上面的测试代码Student studentNoValue = (Student) applicationContext.getBean("stuName");Student studentNoValue2 = (Student) applicationContext.getBean("stuName"); System.out.println(studentNoValue == studentNoValue2);// false

    可以看到,输出结果为false,原型模式下从工厂类两次获取的stuName不是同一个对象。

    3)init-method和destroy-method方法

    见名知意,init-method应该是初始化方法的意思,destroy-method应该是销毁方法的意思。那怎么使用呢?

    // 在Student.java中添加init()方法和destroy()方法public void init(){    System.out.println("student init...");} public void destroy(){    System.out.println("student destroy...");} // 在beans.xml中studentNoValue的bean上添加 init-method和destroy-method<bean id="studentNoValue" class="domain.Student" name="stuName" init-method="init" destroy-method="destroy"/> // 测试方法如下:ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");Student studentNoValue = (Student) applicationContext.getBean("stuName"); applicationContext.close(); // 执行结果:student init...student destroy...

    总结:在获取bean的时候init()方法被执行,在容器被销毁的时候,执行了destroy()方法

    根据这个,我们可以在初始化bean和销毁bean的时候做点什么,比如关闭连接,保存记录之类的操作。

    延伸:那么初始化init()方法在构造方法之前调用,还是之后调用呢?读者可以自行验证下

    总结:还有一些其他属性,笔者就不再一一验证了,下面说一下通过JavaConfig的方法来实现bean的定义。

    3.JavaConfig方式的bean定义

    JavaConfig是Spring4.x推荐的配置方式,可以完全替代XML的方式定义。

    1)如何定义一个Bean

    // 创建一个类,命名为SpringConfiguration@Configurationpublic class SpringConfiguration {    @Bean    public Student student(){        return new Student(11,"jack",22);    }} // 使用beanAnnotationConfigApplicationContext applicationContext                = new AnnotationConfigApplicationContext(SpringConfiguration.class);Student student = (Student) applicationContext.getBean("student")System.out.println(student); // res:Student(id=11, name=jack, age=22)

    相对于XML的使用方式而言,JavaConfig的使用方式基本是同步的

    * @Configuration等同于<beans></beans>

    * @Bean等同于<bean></bean>

    * 通过AnnotationConfigApplicationContext来加载JavaConfig

    * 方法名student()就等同于<bean>中的id,默认方法名就是beanName

    2)@Bean的其他参数

    * name属性等同于<bean>的name

    * initMethod属性等同于<bean>的init-method

    * destroyMethod属性等同于<bean>的destroy-method

    * scope这个比较奇怪,不属于@Bean的参数,这是一个单独的注解,使用方式如下

    @Bean(name = "stu",autowire = Autowire.BY_TYPE)@Scope(value = "singleton")public Student student(){    return new Student(11,"jack",22);}

    读到这里,这篇“Spring定义Bean的方式有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Spring定义Bean的方式有哪些

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Spring定义Bean的方式有哪些

    本文小编为大家详细介绍“Spring定义Bean的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring定义Bean的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.通过XML的方式来
    2023-07-05

    spring注入bean的方式有哪些

    Spring注入Bean的方式有以下几种:1. 构造器注入:通过构造器参数来注入依赖的Bean。2. Setter方法注入:通过调用Bean的Setter方法来设置依赖的Bean。3. 接口注入:通过实现接口来注入依赖的Bean。4. 注解
    2023-09-05

    Spring创建bean的方式有哪些

    这篇文章主要讲解了“Spring创建bean的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring创建bean的方式有哪些”吧!环境Ubuntu 22.04IntelliJ
    2023-07-02

    spring装配bean的方式有哪些

    Spring装配Bean的方式有以下几种:1. 基于XML配置文件:通过在XML配置文件中定义Bean的方式进行装配,可以使用元素定义Bean的名称、类型、属性等信息。2. 基于注解:通过在Java类上添加特定的注解(如@Component
    2023-09-27

    Spring实例化bean的方式有哪些

    这篇文章主要介绍了Spring实例化bean的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring实例化bean的方式有哪些文章都会有所收获,下面我们一起来看看吧。一、bean实例化&mdash
    2023-07-02

    Spring IOC的bean声明方式有哪些

    本篇内容主要讲解“Spring IOC的bean声明方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring IOC的bean声明方式有哪些”吧!  Spring简介  Spring
    2023-06-02

    解读Spring定义Bean的两种方式:<bean>和@Bean

    这篇文章主要介绍了Spring定义Bean的两种方式:<bean>和@Bean,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-14

    Spring中实例化bean的方式有哪些

    这篇文章主要为大家展示了“Spring中实例化bean的方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring中实例化bean的方式有哪些”这篇文章吧。前言在介绍Bean的实例化的
    2023-05-30

    Spring Bean属性注入的方式有哪些

    这篇文章主要介绍“Spring Bean属性注入的方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean属性注入的方式有哪些”文章能帮助大家解决问题。属性注入概念Spring
    2023-07-02

    Spring容器中添加bean的方式有哪些

    这篇文章主要介绍“Spring容器中添加bean的方式有哪些”,在日常操作中,相信很多人在Spring容器中添加bean的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring容器中添加bean
    2023-06-20

    Spring bean有哪几种注入方式

    这篇文章主要讲解了“Spring bean有哪几种注入方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring bean有哪几种注入方式”吧!目录一、Set方式注入pojo层:1.xm
    2023-06-20

    Spring中获取Bean对象的注入方式有哪些

    本篇内容主要讲解“Spring中获取Bean对象的注入方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中获取Bean对象的注入方式有哪些”吧!前言获取 bean 对象也叫做对
    2023-07-05

    php定义数组的方式有哪些

    这篇文章将为大家详细讲解有关php定义数组的方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。定义数组的方法:1、使用“array(值1,值e2...)”语句;2、使用“array(key1=>值1
    2023-06-15

    python元组的定义方式有哪些

    Python元组的定义方式有以下几种:使用逗号分隔的值:tuple1 = 1, 2, 3使用圆括号括起来的值:tuple2 = (4, 5, 6)使用tuple()函数:tuple3 = tuple([7, 8, 9])在定义一个元素
    2023-10-23

    java创建bean的方式有哪些

    在Java中,创建bean的方式有以下几种:1. 手动创建:通过使用new关键字实例化一个对象,并为其设置属性值。```javaBean bean = new Bean();bean.setName("John");bean.setAge(
    2023-09-21

    Spring容器注入bean的方法有哪些

    本文小编为大家详细介绍“Spring容器注入bean的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring容器注入bean的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。@Compon
    2023-07-05

    python字符串定义的方式有哪些

    本篇文章和大家了解一下python字符串定义的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。Python是一种广泛使用的编程语言,特别是在数据分析、机器学习和人工智能领域。在Python中,字符串是一个非常重要
    2023-07-06

    php字符串的定义方式有哪些

    本文小编为大家详细介绍“php字符串的定义方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“php字符串的定义方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。有4种定义方式:1、用单引号包裹字符,
    2023-07-02

    Java中定义接口的方式有哪些

    在Java中定义接口的方式有以下几种:1. 使用关键字`interface`来定义接口,接口可以包含方法的声明(没有实现),常量的声明和默认方法的实现。```javapublic interface MyInterface {int SOM
    2023-09-23

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录