重学Spring框架系列之——使用Spring创建自定义Bean的实例

重学Spring(二:IOC的XML配置) 接着上一期来继续学习IOC容器的xml配置: 一、复杂类型的赋值 <!--给数组赋值, 使用array标签--> <!--<property name="hobbies" value="book,sport,movie"></property>--> <property name="hobbies"> <array> <value>book</value> <va 阅读详情

本文将为大家讲解一下如何使用Spring创建自定义的类的实例,也就是将自定义的类交由Spring来管理。下面将会通过XML和注解两种形式来进行演示。

环境准备

为了方便,下面将采取Maven项目进行演示。

pom.xml中添加Spring环境的spring-context和用于测试的junit坐标。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13.1</version>
  <scope>test</scope>
</dependency>

用于演示使用Spring创建自定义组件的类

// 1、Person类
public class Person {

  // 姓名
  private String name;

  // 年龄
  private String age;

  // ...get、set方法
}

// 2、PersonController
public class PersonController {

}

// 3、PersonService
public class PersonService {

}

// 4、PersonDao
public class PersonDao {

}

通过bean标签实现

1、创建Spring的配置文件(名beans.xml,该名随意),并通过“”标签配置需要创建的类。

<!-- 配置person类 -->
<bean id="person" class="com.springtest.bean.Person"></bean>

bean标签中常用的属性有

id属性:表示该对象的唯一标识。
class属性:需要创建对象的类对应的全类名。

2、创建测试类,进行测试。

@Test
public void test1() {
    // 创建Spring的IOC容器,读取配置文件beans.xml。
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    // 通过bean的id获取实例。
    Object person = context.getBean("person");
    // 也可以通过bean的类型: context.getBean(Person.class);
    System.out.println(person);
}

3、测试结果为获取成功。

在这里插入图片描述

注意:因为spring默认使用的是无参构造创建的实例,所以必须确保要创建的实体类中有无参构造,否则将会报错。

在这里插入图片描述

通过配置文件加注解的方式实现

Spring提供了四个注解用于创建对象

@Controller:使用在Web层。
@Service:使用在业务(service)层。
@Repository:使用在持久(dao)层。
@Component:表示普通组件。

说明:这四个注解的valeu属性就是标注bean的id的。等价于配置文件中bean标签的id属性。value属性也可以省略不写,如果省略则id使用的是类名的首字母小写。

1、要想使用这些注解创建对象,那就必须在配置文件中开启组件扫描。

开启组件扫描之前需要先引入context名称空间

在这里插入图片描述

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

开启组件扫描。

<!-- 方式一:如需要扫描多个包,可以使用逗号(,)将多个包隔开 -->
<context:component-scan base-package="com.springtest.controller,com.springtest.service"/>
<!-- 方式二:可直接扫描多个包的上级目录 -->
<context:component-scan base-package="com.springtest"/>

2、在需要创建实例的类上添加对应的注解。

@Component
public class Person {
  // ...省略其它代码
}

@Controller
public class PersonController {

}

@Service
public class PersonService {

}

@Repository(value = "personDao")
public class PersonDao {

}

3、测试代码

@Test
public void test2() {
    // 读取配置文件beans.xml,创建Spring的IOC容器。
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    // 通过bean的id获取实例。
    Object person = context.getBean("person");
    System.out.println(person);
    // 通过bean的类型获取实例
    PersonController personController = context.getBean(PersonController.class);
    System.out.println(personController);
    // 通过bean的id加类型获取实例
    PersonService personService = context.getBean("personService", PersonService.class);
    System.out.println(personService);
    /**
     * 注意:PersonDao类的@Repository注解指定了value属性,
     *      获取对象时就不能在使用默认值了,需要使用value属性规定的值。
     */
    Object personDao = context.getBean("personDao");
    System.out.println(personDao);

}

4、执行结果

在这里插入图片描述

全注解方式实现

全注解形式是通过@Configuration注解替换掉原来的xml配置文件的。

@Configuration注解的作用就是告诉Spring标注了这个注解的类是一个配置类,它等价于原来的一个配置文件。

1、编写配置类。

通过@ComponentScan注解配置开启组件扫描。
通过@Bean注解在IOC容器中注入一个实例,也就是创建一个实例。

/**
 * @Configuration注解用于告诉spring这是一个配置类。
 * @ComponentScan注解用于开启组件扫描。
 *    @ComponentScan(basePackages = {"com.springtest"})就等价于在配置
 *    文件中写“<context:component-scan base-package="com.springtest"/>”
 *    basePackages属性的写法跟配置文件的一样,也可以写多个扫描包,多个包之间用逗号隔开
 */
@Configuration
@ComponentScan(basePackages = {"com.springtest"})
public class MainSpringConfig {

}

2、在配置类中通过@Bean注解注入一个实例。

作用:将@Bean注解标注在方法上,用于向IOC容器中注入一个bean,这个bean的类型就是方法的返回值类型,bean的id默认使用的是方法的名称,也可以通过valeu属性或name属性指定。

@Bean(value = "person2")
public Person person() {
    return new Person();
}

3、在需要创建实例的类上添加对应的注解。跟上面通过配置文件加注解的方式一样,使用的也是相同的代码就在此处赘述。

4、进行测试。

@Test
public void test3() {
    // 读取MainSpringConfig配置类,创建Spring的IOC容器
    ApplicationContext context = new AnnotationConfigApplicationContext(MainSpringConfig.class);
    // 通过bean的id加类型获取实例,获取标注了@Service注解的personService实例
    PersonService personService = context.getBean("personService", PersonService.class);
    System.out.println(personService);
    // 通过id名称获取@Bean注解的person2实例
    Object person2 = context.getBean("person2");
    System.out.println(person2);
}

5、测试结果。

在这里插入图片描述

通过Spring的FactoryBean接口实现

编写org.springframework.beans.factory.FactoryBean接口的实现类,用于注入Bena。

1、编写FactoryBean接口的实现类。

public class PersonFactory implements FactoryBean<Person> {

  // 通过该方法向IOC容器中注入一个Person的实例
  public Person getObject() {
    return new Person();
  }

  // 设置注入bean的类型
  public Class<?> getObjectType() {
    return Person.class;
  }

  // 设置是否单例,默认是true。
  public boolean isSingleton() {
    return true;
  }
}

2、将PersonFactory注入到Spring的IOC容器中,下面使用的@Bean注解的方式。

1、注入bean的id默认是方法名,可通过@Bean注解的value或name属性进行修改。
2、注入bean的类型是PersonFactory的getObject方法的返回值类型也就是Person。
3、通过id(personFactory)获取到的bean实例是Person类型的,如果想要获取PersonFactory的bean实例需要在注入的bean的id加上前缀【&】作为id。这个前缀是在org.springframework.beans.factory.BeanFactory接口规定的。

@Bean
public PersonFactory personFactory() {
    return new PersonFactory();
}

3、测试获取实例。

@Test
public void test4() {
    // 读取MainSpringConfig配置类,创建Spring的IOC容器
    ApplicationContext context = new AnnotationConfigApplicationContext(MainSpringConfig.class);
    // 获取工厂类创建的实例
    Object person = context.getBean("personFactory");
    System.out.println(person);
    // 获取工厂类的实例
    Object personFactory = context.getBean("&personFactory");
    System.out.println(personFactory);
}

4、测试结果。

在这里插入图片描述

这就是常用的几种使用Spring创建自定义bean的实例的方式。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。

R语言实战:GEO单细胞数据下载与自动化整理全流程(附代码) 本文详细介绍了使用R语言从GEO数据库下载scRNA-seq数据并实现自动化整理的完整流程。通过GEOquery和Seurat等工具包,读者可以高效获取单细胞RNA测序数据,完成从原始数据下载到预处理的全过程,最终生成可直接用于分析的Seurat对象。文章包含完整代码示例,特别适合生物信息学研究者处理单细胞数据。 阅读详情

相关推荐

在innovus中通过ecoAddRepeater插入buffer/inverter

在innovus中,我们可以通过ecoAddRepeater命令来在net上添加单个buffer或者成对的inverters。ecoAddRepeater命令的行为由命令setEcoMode控制。 选项说明 -cell <list of cells> 指定插入的buffer或者inverter的类型。 -net <netName> | -term <inst1/term1 inst2/term2 ...> -net指定需要插入buffer/inverters的

kevindas的博客 1万+

使用注解配置spring、spring与junit整合配置

1、将对象注册到容器中 在配置文件applicationContext.xml中配置如下代码,可将对象匹配进来: &lt;!-- 指定扫描cn.itcast.bean包下的所有类中的注解 注意:在扫描时,会扫描指定包下的所有的子孙包 但不会扫描所有的父包 --&gt; &lt;context:component-scan base-package="cn.itcast.bean...

huicooling的博客 441

电影票购票小程序搭建(源码部署)

答:为用户提供便捷的购票方式,包括授权登录、个性化推荐、在线选座、订单管理等功能,同时在界面设计上注重用户友好性,简化用户的购票流程。答:通过展示电影院的优惠活动和票价信息,同时提供电影推荐功能,根据用户的历史购票记录和电影评分推荐个性化的电影列表,吸引用户购票。编写页面逻辑代码:使用JavaScript编写小程序页面的逻辑代码,实现电影列表的获取、电影详情的展示、座位选择的逻辑等。设计小程序界面:使用WXML和WXSS编写小程序的界面代码,实现电影列表的展示、电影详情的样式、座位选择页面的布局等。

2301_79072569的博客 2068

Person类1.定义类名 2.编写类的属性3.编写类的方法

1.定义类名 2.编写类的属性3.编写类的方法

m0_62084473的博客 623

磁感应强度B、磁场强度H、矢量磁位A的study

学完电磁场很久了但是对电磁场中磁感应强度B⃗\vec{B}B、磁场强度HHH、矢量磁位A⃗\vec{A}A,这几个变量所表征的含义一直很模糊,所以就总结了一下

sinat_42386289的博客 1万+

手把手教你搭建自己的 API 中转站

本文介绍了如何通过开源工具CLIProxyAPI(CPA)搭建本地AI模型代理服务,解决多工具切换、海外API访问困难等问题。CPA可将OpenAI、Gemini等不同服务的API统一封装,用户只需配置一次账号信息,所有客户端即可通过标准接口访问。文章详细讲解了CPA的下载安装、配置修改、账号导入及客户端连接方法,并强调其经济性、可控性和集中管理优势。通过自建中转站,用户可避免第三方服务的质量风险,实现多账号负载均衡,构建个人AI资源池。最后提供了网络配置等实用建议,帮助开发者高效使用AI编程工具。

DongJiYong_20的博客 1785

Sping框架基本学习(一)

Spring概念 Spring是开源的轻量级框架 Spring的核心 apo:面向切面编程,扩展功能不是修改源代码实现 ioc:控制反转 比如有一个类,在类中有一个方法(不是静态),调用类里的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象 把对象创建不是通过new方式实现,而是交给spring配置创建类对象 SPring是一站式框架 spring在ja...

sun_shine_szc的博客 256

[AI8051U入门第一步]环境安装和按键控制流水灯

本文介绍了AI8051U单片机的开发环境搭建及GPIO应用。主要内容包括:1)通过ISP软件完成Keil开发环境配置;2)AI8051U特性介绍,包括32位8051内核、浮点运算单元及丰富外设;3)GPIO输入输出模式解析,并附流水灯控制代码;4)提供完整的系统初始化、延时函数及LED控制代码实现。文章配套资源包含完整工程代码,适用于智能硬件及物联网开发。

sinat_58149788的博客 669

Spring 学习之 二----Spring创建对象的三种方式

    最近在系统的学习Spring,现在就Spring的一些知识进行总结。    我们知道Spring是一个开放源代码的设计层面的框架,他主要解决的是业务逻辑层与其他各层之间松耦合的问题。    Spring 有三个核心:    1.IOC 控制反转我们以前在A对象中创建B对象时,都是直接在A对象内部使用new B() 的方法创建对象,这样下去,A和B有很强的的耦合性。那么我们用到了Spring...

liuying1802028915的博客 1387

【OpenClaw从入门到精通】命令行操作指南——TUI模式高效管理OpenClaw(2026避坑版)

本文将详细介绍OpenClaw的命令行操作,重点介绍TUI(Text User Interface)模式的高效使用方法,以及在实际使用中需要避免的常见陷阱。通过本文的学习,你将掌握OpenClaw命令行的精髓,提升工作效率。

一键难忘的博客 1691

Python爬虫实战:汽车之家车型参数与口碑数据抓取分析

在当今信息爆炸的时代,购车决策已从传统的4S店咨询转变为数据驱动的智能化过程。汽车之家作为国内领先的汽车信息平台,汇聚了海量车型参数、车主口碑和专业评测数据。本文将详细介绍如何使用Python最新爬虫技术构建一个高效、稳定的汽车数据采集系统,通过多维度数据分析辅助用户做出更明智的购车决策。本项目将采用异步爬虫、智能反爬绕过、数据清洗与分析等现代化技术栈,完整实现从数据采集到可视化分析的全流程。本文详细介绍了如何使用Python最新技术构建一个功能完整的汽车之家数据爬虫系统。

2201_76125261的博客 1488

Java之自定义Spring框架

</bean>

故里有青山,而我心里有你 996

改进yolov8|BackBone改进:PWConv、FasterNeXt替换yolov8主干网络

各位哥哥姐姐弟弟妹妹大家好,我是干饭王刘姐,主业干饭,主业2.0计算机研究生在读。和我一起来改进yolov8变身计算机大牛吧!本文中的论文笔记都是刘姐亲自整理,原创整理哦~

weixin_44379985的博客 748

重学Spring框架系列之——设置Bean的加载时机

本文可能会涉及到一些bena的作用域相关的知识,如果对其不是特别了解的可以查看我上一篇文章。 bean的作用域为singleton和prototype时,其对应的加载时机是不同的。 通常情况下spring中bean为单例时,bean实例的创建是在加载配置文件或配置类时创建的,而bean为多实例时,bean实例的创建是在获取该实例时创建的。 通过文字描述可能比较抽象下面通过代码来查看一下。 注意:spring创建实例时默认调用的是无参构造,下面我们在无参构造中加上输出语句用于查看调用时机。 public c

first_M的博客 756

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

重学Spring框架系列之——设置Bean的作用域

Bean的作用域 在Spring中,默认情况下创建的bean都是单实例对象,当然也可以通过实际的需求进行修改。我们可以将这种操作视为设置bean的作用域。实现的方式有配置文件和注解两种形式,然而不论是哪种方式它们都对应了四种作用域。 这四种作用域分别为: singleton(默认值):表示创建的对象是单实例的。 prototype:表示创建的对象是多实例的。 request:表示一次请求生成一个实例。 session:表示一次会话生成一个实例。 注:在这四种作用域中,singleton和prototyp

first_M的博客 1304

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

重学Spring框架系列之——什么是Spring框架

说在前面 Spring框架算得上是java程序员必备的一项技能了。不论是早期的SSM或SSH架构,还是现在流行的SpringBoot加SpringCloud构建的分布式、微服务架构。Spring在其中扮演着不可或缺的角色,其重要性也是不言而喻的。 为了更好的工作和自身的提升,菜鸟又重新学习了一下Spring框架,在学习的过程中也有一些收获,从而想着通过文章将自己的学习过程记录下来。也希望可以帮助到有需要的人。如果文章中存在不合理或错误的地方也希望大家可以提出来,我会及时改正,希望我们可以一起进步。 既然我们

first_M的博客 590

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

重学Spring总结

重学Spring总结

北执南念的博客 1256

【Spring进阶】Spring IOC实现原理是什么?容器创建和对象创建的时机是什么?

Spring Bean生命周期解析 Spring容器管理Bean的完整生命周期主要包括以下几个关键阶段: 容器初始化:通过ApplicationContext或BeanFactory加载配置,预注册Bean定义 BeanDefinition生成:解析XML/注解配置,生成包含元数据的Bean蓝图 实例化:通过反射创建Bean对象 依赖注入:按构造器/Setter/字段方式注入依赖 初始化:执行Aware接口回调、init-method等初始化逻辑 缓存管理:将完全初始化的单例Bean加入缓存池 Applic

先做到 再看见 2447

重学Spring5

1. Spring 1.1 简介 Spring : 春天 2002年,首次推出Spring框架的雏形 : interface21框架 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-

weixin_45607293的博客 217

手写简易版 Spring框架

文章目录前言目前已实现1 简单校验2 扫描配置3 根据扫描到的配置组装 BeanDefinition4 根据 BeanDefinition 创建非懒加载、并且是单例的bean,存储到单例池5 增加 BeanNameAware 接口6 增加 InitializingBean 接口7 增加 BeanPostProcessor 接口延伸阅读 前言 最近项目里有大量的 “长的很像的代码”。这类代码,用到了工厂模式、建造者模式,但是最终由于业务复杂,而且功能上是对接平台的,因此会有上百个这种类,每个都不一样。 出于对

FBB360JAVA的博客 1424

菜鸟重学Spring

构建一个spring项目 1、创建一个工程,导入spring 所需的jar包 commons-logging-1.1.1 spring-aop-4.1.6.RELEASE spring-aspects-4.1.6.RELEASE spring-beans-4.1.6.RELEASE spring-context-4.1.6.RELEASE spring-context-support-4.1.6.RELEASE spring-core-4.1.6.RELEASE spring-expressi

cong__cong__cong的博客 284

Spring学习笔记(一) IOC ,bean的配置

最近看到一些帖子很多内容不明白应该开始理解一下基础,不能只会用所以博主决定重学一下SSM和一些基础重点。 目录 什么是IOC :不是技术,是一种设计思想!!!!! Bean的配置和获取方式 配置bean 配置bean的属性 内部bean可以不配置id ,这样其它的bean就无法引用的. 给bean对象的集合类型属性赋值 (这里的集合看成bean的一个属性即可)...

来杯Java 423

爱上源码,重学Spring IoC深入

简单回顾下通俗的讲就是N个Bean互相引用对方,最终形成闭环。项目代码介绍如下(测试类入口: CircleTest.java)配置文件userServiceImplA代码如下return "在UserServiceImplA的Bean中" + "userServiceImplB注入成功>>>>>>>>>" + userServiceImplB;} }

博学谷狂野架构师的博客 735

从官方文档重学spring5

这个注解支持与或非表达式。& |)还可以使用这个注解作为元注解,更加见名知意。5.可以启用响应数据压缩。

qq_47962462的博客 184

爱上源码,重学 Spring 之 IoC 深入源码

简单回顾下通俗的讲就是 N 个 Bean 互相引用对方,最终形成闭环。项目代码介绍如下(测试类入口: CircleTest.java)配置文件userServiceImplA 代码如下}@Overridereturn "在UserServiceImplA的Bean中" +

Candyz7的博客 609

重学lagou | 面试复习(二)Spring

具体过程:判断循环所有的BeanPostProcessor,然后我们aop什么时候被加进来的后置处理器?FactoryBean是spring当中的一个特殊的bean,它是一个接口,实现了FactoryBean的bean能够再创建一个bean,如果你的类实现了FactoryBean,那么spring容器当中存在两个对象,一个是通过getObject()返回的对象,还有一个为当前对象,getObject得到的对象存的是当前类@Component(“名字”)指定的名字,当前对象是“&”+指定的名字。

零一的博客 233
上一篇: 重学Spring框架系列之——揭秘Spring两大核心之一的IOC容器
下一篇: 重学Spring框架系列之——设置Bean的作用域
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值