当前位置: 首页 > news >正文

java 继承 默认作用域,Spring(三)——Bean的 继承关系、依赖关系、作用域

1、Bean的继承关系

此处的继承并非面向对象当中的继承关系,而是 配置 上的继承关系。

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">

package test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {

// 导入IOC容器

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

// 获取Person对象

Person person1 = (Person) ctx.getBean("ren1");

Person person2 = (Person) ctx.getBean("ren2");

// 输出Person

System.out.println(person1);

System.out.println(person2);

}

}

在 ren2 的 bean 中是有一个 parent 的属性的,这个属性指向 ren1 bean,这说明 ren2 继承了 ren1 的内容的。

但是如果在ren2有属性值,那么将重写该属性值,类似于面向对象的重写。

Spring允许继承 bean 的配置,被继承的 bean 成为父 bean,继承这个父 bean 的bean 成为子 bean(这并非我们所说的父类和子类)。子 bean 可以覆盖父 bean 的属性。

这个继承有什么用呢?首先可以省去重复的配置,你只需要继承一个Bean就可以不需要配置那么多的属性了。父bean作为模板,添加abstract属性为true就行了,例如

这样的话就不能创建ren1的实例,只用来被继承。

如果一个bean没有被指定class属性,那么它必须是抽象bean,即 abstract=true。

2、Bean的依赖关系

Car.java

package test;

public class Car {

private String brand;

private String carID;

public Car() {

super();

}

}

Person.java

package test;

public class Person {

private String name;

private int age;

private Car car;

public Person() {

}

}

applicationContext.xml

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">

在这里,我们模拟的是每个人有一辆车,而车又是一个JavaBean,因此我们这里需要用到引用,即在property中不再是value属性了而是ref。

这里需要注意的是,如果没有定义car的JavaBean那么就会报错的。所以我们才说Person依赖于Car。这也很容易理解,我都没写id,怎么填写ref的值呢?

** 小结 **

继承关系,在子bean中添加parent属性,属性值为父bean的id。同时父bean可以添加abstract属性作为子bean的模版,变成抽象bean。

依赖关系。首先需要定义依赖的bean(此例为Car),然后在被依赖bean(此例为Person)中的属性值用ref取代value,并指向依赖bean的ID。

3、Bean的作用域

默认情况下,IOC容器,即那个xml文件只会为bean创建一个对象,这就是所说的单例类。每次调用这个bean的,容器只会返回同一个bean对象。

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">

package test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {

// 导入IOC容器

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

// 获取Person对象

Car car1 = (Car) ctx.getBean("che");

Car car2 = (Car) ctx.getBean("che");

// 输出Person

System.out.println(car1 == car2);

}

}

这里的输出结果是 true 说明这两个是同一个对象的。

修改配置文件:

运行Mian.java可以看到输出结果为false。

我们看到scope的属性,这里singleton当然就是这个属性的默认值了,将 scope="prototype" 即原型。

原型是指:每次向容器中获取bean对象,都会返回一个新的bean,即这两个bean不是同一个对象。

我们同时发现这个 scope 的取值还有 session 和 request ,这两个比较少用就不说了。

小结

使用bean的 scope 属性来配置bean的作用域。

singleton:默认值。容器初始时创建bean实例,在这整个容器的声明周期内只创建这一个bean

prototype:原型的。容器初始化不创建bean的实例。而在每次请求时都创建一个新的Bean实例,并返回。

session和request:少用。

相关文章:

  • matlab中的newfis,(To be removed) Create new fuzzy inference system
  • php apache 301重定向,Apache下修改.htaccess实现301重定向方法汇总
  • php一对多关联,SpeedPHP/数据表一对多关联
  • import matlab.engine,请教python导入matlab engine失败的问题。
  • php封装pdo连接书记库,PHP封装的PDO数据库操作类实例分析
  • 推荐几本php的好书,新手,求几本php的好书!
  • 管理python库的工具,Python的包管理工具
  • php 对象注入,小记一次PHP对象注入
  • oracle export表结构,oracle下导入导出表结构
  • oracle自定义异常标量,gqlgen/graphql自定义标量
  • oracle安装出现连接失败怎么办,oracle客户端PLSQL连接失败解决方法
  • oracle数据库架ssm,GitHub - wind0926/ssm-maven: smm框架+maven+oracle的旅游后台系统
  • oracle快速生成一千万条数据,[Oracle]快速生成大量模拟数据的方法
  • oracle存储过程生成uuid,存储过程 根据uuid
  • oracle submit_time,Oracle '26-2月 -19 03.34.47.000000 下午' 字符串日期解析
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • jquery cookie
  • Just for fun——迅速写完快速排序
  • k8s如何管理Pod
  • Laravel5.4 Queues队列学习
  • mysql常用命令汇总
  • SwizzleMethod 黑魔法
  • uni-app项目数字滚动
  • vue-cli3搭建项目
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 简单数学运算程序(不定期更新)
  • 讲清楚之javascript作用域
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 如何利用MongoDB打造TOP榜小程序
  • 数组大概知多少
  • 写代码的正确姿势
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # Apache SeaTunnel 究竟是什么?
  • $NOIp2018$劝退记
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C语言)fgets与fputs函数详解
  • (备忘)Java Map 遍历
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (十五)使用Nexus创建Maven私服
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转) ns2/nam与nam实现相关的文件
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .form文件_SSM框架文件上传篇
  • .gitignore文件设置了忽略但不生效
  • .net wcf memory gates checking failed
  • .Net 垃圾回收机制原理(二)
  • .Net(C#)自定义WinForm控件之小结篇
  • .NetCore项目nginx发布
  • .NET开发人员必知的八个网站
  • .net中的Queue和Stack
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析