广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java基础之Bean的创建、定位和使用
  • 418
分享到

Java基础之Bean的创建、定位和使用

2024-04-02 19:04:59 418人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、前言二、自动装配Bean2.1 注册Bean2.2 使用Bean三、手动装配3.1 Java类四、XML文件五、导入配置5.1 Java类六、导入到XML一、前言 Bean是

一、前言

Bean是一个由spring ioc容器实例化、组装和管理的对象。在 Spring 中,类的实例化、依赖的实例化、依赖的传入都交由 Spring Bean 容器控制,而不是用new方式实例化对象、通过非构造函数方法传入依赖等常规方式。这样可以减少垃圾回收对大量实例的回收工作。

在举例中使用到了三个类AAA,BBB和CCC。其中AAA和BBB是平等的两个类,可以相互调用。CCC是以BBB为构造参数的类。

二、自动装配Bean

2.1 注册Bean

为所有想要创建Bean的类添加@Component,即可在自动扫描开始时自动将类注册为Bean。

扫描默认是关闭的。要打开扫描功能,需要为包内的一个类加上注解@ComponentScan。又因为每个项目都需要配置类,所以约定注解@ComponentScan加在配置类上。

因为是隐式定义方法,所以有一定的限制。比如说在同一个包内。

比如,为AAA类添加了注解@Component


@Component
 
Public class AAA{
 
}

如果注解扫描的功能开启,那么会自动扫描所有加了该注解的类。

但是扫描功能默认是关闭的。在与AAA类同一包内添加新的类AConfig并加上@ComponentScan即可开启自动扫描功能,Spring将自动扫描该包内所有带有@Component的类。而AConfig中的内容与扫描功能无关。

【启动扫描的类名为AConfig是习惯而非规定,因为既和A有关,又和config有关】

开启自动扫描的另一种方式:XML配置

在XML文件中加入


<context : component-scan base-package="XXX">

其中XXX是AAA所在的包,即可开启对该包的自动扫描。

@ComponentScan默认扫描本包内的类注解,若想扫描其他包则需要加入参数basePackages="XXX",XXX是想要扫描的包。同理,想要指定多个包来扫描:@ComponentScan(basePackage={"XXX", "XX2"}),用大括号扩住所有包。其中basepackage可以省略,可以只写包名。

因为将字符串指定为参数的时候不安全所以有指定包中的类来表明包的方法。将@Component中的参数换成(basePackageClass={AAA.class, BBB.class})即可扫描AAA和BBB所在的包。

单元测试时在测试类添加@ContextConfiguration(class=Aconfig.class)来指定配置类,即@ComponentScan所在的类,即可用指定配置类管理Bean。

自动形成的Bean的ID会和类名一致,就是首字母会变成小写格式。如AAA类的Bean是aAA。(其余字母不是固定大写,而是不变)

由于Bean的ID是由@Component生成的,所以在@Component中可以指定Bean的ID。@Component(”IDofA“)这样就能将AAA类的Bean的ID指定为IDofA

2.2 使用Bean

创建好Bean之后需要使用Bean

在使用Bean的方法上添加@Autowired,传入有Bean的类对象时即可实现Bean的注入。

在演示中发现,即使有注入,也要有参数传入

与不适用注解的区别在于,如果用了注入,在使用被注入的方法时无需对该方法的类实例化。

该程序中useAxe()方法使用到了Axe类,但是并没有实例化Axe类。

这里使用@Autowired,效果是使用player.play()的时候无需实例化plyaer

Required=flase可以让无Bean时不报错,不推荐。

三、手动装配

使用带有注解的Java类或在XML文件内显式地声明Bean的注册和注入。

3.1 Java类

因为自动装配需要在源码的类上加注解,所以Java类注解法适用于无法修改源码的情况。

分为两步:生成Bean和注入Bean

使用@Bean注解来生成Bean

假如AAA类要使用BBB类的对象。就要在AConfig中加入如下方法:


@Bean
 
public BB bBB(){
 
    return new BBB();
 
}

根据习惯,这个方法的名字和所需要引用的类一致来表名引用的时哪个类,只是首字母会变成小写。

@Bean会告诉spring这个方法将会返回一个对象,spring会将这个对象注册为Bean。默认情况下Bean的ID和配置中的方法同名,也可以用@Bean的name参数来修改。


@Bean(name="IDofB")
 
public BBB bBB(){
 
    return new BBB();
 
}

在配置方法中,实现了BB接口的类BBC和BBD都可以作为返回的对象被注册成Bean。


@Bean
 
public BB otherBB(){
    If(num>10)
        return new BBC();
    Else
        return new BBD();
}

由此,可以在配置方法中返回不同的对象,只要有返回就能被注册成Bean。相对的,一个@Bean可以根据情况返回多个Bean实例中的一个,也会出现一种可能,多个@Bean各自满足条件返回了同一个Bean实例。

例如:

假设一个类CCC在实例化时需要一个BBB作为参数,及构造函数为


CCC(BBB){
 
    This.bbb=BBB;
 
}

那么会出现多个CCC类实例同时调用同一个BBB的现象。


@Bean
public CCC cCC(){
 
    return new CCC(BBB());
}
 
 
@Bean
public CCC anotherCCC(){
 
    return new CCC(BBB());
}

以上两个方法都返回了同一个实例,即new CCC(BBB())。这时spring会拦截第二个BBB()产生的BBB对象,让两个CCC类方法cCC()和anotherCCC()调用同一个BBB对象。

四、XML文件

在XML文件中写一个<Bean>即可生成Bean


<Bean id="IDofCCC" class="packagename.CCC">

如果不指定id则id会自动变成packagename.CCC#0,再引用packagename.CCC类时会将新的Bean对象id命名为packagename.CCC#1。即,自动命名时号码自增。

spring在发现<Bean>时,会自动执行类的构造方法来生成实例注册成Bean。

如果需要声明一个引用BBB的CCC


<Bean id="IDofCCC" class="packagename.CCC">
    <constructor-arg ref="bBB" />
</Bean>

其中bBB是一个BBB类的Bean,由此讲该Bean注入到CCC。

<constructor>标签可以用c命名空间来做一些简写。举一些具体的例子:

有一个引用如下

这个标签向CDPlayer类中注入了compactDisc,用c命名空间来代替<constructor>标签

其中,cd-ref中的cd是CDPlayer的构造方法的参数。在调试和封装中,将代码中的参数放在XML中不安全。所以可以用代号来代替参数cd。

只有一个构造方法时也可以省略代号

回归到通用符号,上例中的BBB有已经被赋值或构造时就被定义的属性。如果我们需要注入一个类BBC,且BBC在构造时需要输入参数,则可以在<constructor-arg>中输入参数。


<Bean id="IDofCCC" class="packagename.CCC">
 
    <constructor-arg value="vob1" />
    <constructor-arg value="vob2" />
    <constructor-arg value="vob3" />
 
</Bean>

此例的意义是:需要生成一个CCC类的Bean,且在构造CCC的时候需要三个参数。在<constructor-arg />中使用value来以此指定三个参数。

赋值的操作也可以用c命名空间来简化,用上面的具体例子来说明:

用<constructor>标签在声明引用的时候给BlankDisc赋了两个值。

简化后的c命名空间:

其中BlankDisc类构造有title和artist两个参数,刚好对应c:的两个属性。

当然

既然标签都可以不用命名就能赋值,c命名空间也可以。

将属性名的位置排号也能实现依次赋值的作用。

若属性只有一个,则连排号也能省略。

如果不需要输入参数也可以用<property>来代替<constructor>,会简洁很多。

property标签

第一个compact是CDPlayer的构造方法中参数的名称,第二个compact是引用的类名。简化后的p命名空间也是p:开头

五、导入配置

5.1 Java类

若多个注册Bean的方法在不同的配置类中,则可以通过@import来将BConfig引入到CConfig中

例如:若BBB有一个配置类


@Configuration
public class BConfig {
    @Bean
    public BBB bBB( ) {
 
        return new BBB ( ) ;
    }
}

将BBB导入CConfig


@Configuration
@import(BConfig.class)
public class CConfig {
    @Bean
    public CCC cCC(BBB bBB) {
 
        return new CCC (bBB) ;
    }
}

这样就能跨配置类使用Bean。

这种引用不是只有一对一可用。还可以定义一个新的配置类,把BConfig和CConfig都引用进去。

以上是导入用配置类生成的Bean。若要导入XML配置的Bean则需要@importResource。为配置类加上注解@importResource("classpath:Bconfig.xml")

六、导入到XML

同理,使用<import>标签也可以实现向XML文件中导入其他的XML文件。


<import resource="Bconfig.xml" />

到此这篇关于Java基础之Bean的创建、定位和使用的文章就介绍到这了,更多相关Bean的创建、定位和使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java基础之Bean的创建、定位和使用

本文链接: https://www.lsjlt.com/news/125477.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java基础之Bean的创建、定位和使用
    目录一、前言二、自动装配Bean2.1 注册Bean2.2 使用Bean三、手动装配3.1 Java类四、XML文件五、导入配置5.1 Java类六、导入到XML一、前言 Bean是...
    99+
    2022-11-12
  • Java基础之多线程方法状态和创建方法
    目录Java之线程的五大状态及其常用方法(六个状态还有timed_wating超时等待)1.线程的五大状态及其转换 2.设置或获取多线程的线程名称的方法 3.线程休眠------sl...
    99+
    2022-11-12
  • Java基础之CardLayout的使用
    目录一、案例介绍二、案例代码一、案例介绍 在编码前需要将本案例中使用到的三张图片(1.png 、2.png、3.png)保存到src所在的文件夹内。看下图: 1.png: 2.p...
    99+
    2022-11-12
  • Java基础教程之数组的定义与使用
    目录一.数组的基本概念二.数组的声明三.数组的创建及初始化1.数组的创建2.数组的初始化四.访问数组元素 五.for each 循环 六.数组的拷贝 七.数组排序 八.二维数组 总结...
    99+
    2022-11-12
  • Java之SpringBoot创建和使用
    目录Spring Boot 创建和使用Spring BootSpring Boot 项目创建使用 IDEA 创建网页版创建Spring Boot 目录介绍运行 Spring Boot...
    99+
    2023-05-14
    Java Springboot创建和使用 Springboot的创建 Springboot的使用
  • Python基础之类的定义和使用详解
    目录1、定义类2、创建类的实例3、“魔术”方法——_ init ()4、创建类的成员并访问4.1、创建实例方法并访问4.2、创建数据成...
    99+
    2022-11-11
  • Java基础之Thymeleaf的简单使用
    Java代码 package com.zzx.controller; import com.zzx.model.User; import org.springframework...
    99+
    2022-11-12
  • Java基础之创建虚拟机对象的过程详细总结
    目录一、对象的创建1.1 new 类名1.2 分配内存1.3 初始化零值1.4 设置对象信息1.5 构造对象二、对象的内存布局2.1 对象头2.2 实例数据2.3 对齐填充三、对象的...
    99+
    2022-11-12
  • python基础之函数的定义和调用
    # 第一题 # 写函数,接受n个数字,求这些参数数字的和 def sumFunc(*args): # 处理接受的数据 result=0 for item...
    99+
    2022-11-12
  • Java基础知识之ByteArrayOutputStream流的使用
    目录Java ByteArrayOutputStream流的使用一、ByteArrayOutputStream流定义二、ByteArrayOutputStream流实例域三、Byte...
    99+
    2022-11-12
  • Java基础之this关键字的使用
    一、this关键字的作用 this关键字除了可以强调本类中的方法还具有以下作用。 1.表示类中的属性 2.可以使用关键字调用本类中的构造方法 3.this表示当前对象 1.1表示类中...
    99+
    2022-11-12
  • java基础知识之FileInputStream流的使用
    目录一、File流概念二、FileInputStream1)FileInputStream概念2)构造方法3)FileInputStream常用API三、三种read方法效率比较一、...
    99+
    2022-11-12
  • Java基础知识之StringReader流的使用
    目录Java StringReader流的使用一、StringReader流定义二、StringReader的实例域三、StringReader流构造函数四、StringReader...
    99+
    2022-11-12
  • Java基础知识之StringWriter流的使用
    目录Java StringWriter流的使用一、StringWriter流定义二、StringWriter流实例域三、StringWriter流构造函数四、StringWriter...
    99+
    2022-11-12
  • Java基础知识之CharArrayReader流的使用
    目录Java CharArrayReader流一、CharArrayReader流定义二、CharArrayReader流的构造函数三、CharArrayReader流的实例域四、C...
    99+
    2022-11-12
  • Java基础知识之CharArrayWriter流的使用
    目录Java CharArrayWriter流一、CharArrayWriter流定义二、CharArrayWriter流构造函数三、CharArrayWriter流实例域四、Cha...
    99+
    2022-11-12
  • Java基础知识之ByteArrayInputStream流的使用
    目录Java ByteArrayInputStream流一、ByteArrayInputStream流定义二、ByteArrayInputStream流实例域三、ByteArrayI...
    99+
    2022-11-12
  • Java基础知识之BufferedReader流的使用
    目录一、BufferedReader类概念二、BufferedReader类实例域三、BufferedReader类构造函数四、BufferedReader类API五、Buffere...
    99+
    2022-11-12
  • 3)js的基础语法使用以及css定位
    Css 定位:background-position: 20px 40px;  (1)相对定位:      如果仅仅对当前盒子设置相对定位,那么他与原来的盒子没有任何变化      只有一个作用:  父相子绝,不适用相对定位来做压盖现象  ...
    99+
    2023-01-31
    语法 基础 js
  • Java基础入门篇之如何使用面向对象和类的定义
    这篇文章主要讲解了“Java基础入门篇之如何使用面向对象和类的定义”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java基础入门篇之如何使用面向对象和类的定义”吧!一、面向对象面向对象是在程...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作