热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java的Spring框架中bean的继承与内部bean的注入

这篇文章主要介绍了Java的Spring框架中bean的继承与内部bean的注入,Spring框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下

bean的定义继承
bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,比如初始化方法,静态工厂方法名等容器的具体信息。

子bean定义从父定义继承配置数据。子的定义可以覆盖一些值,或者根据需要添加其他。

Spring bean定义继承无关,与Java类的继承,但继承的概念是一样的。你可以定义一个父bean定义为模板和其他孩子bean可以从父bean继承所需的配置。

当使用基于XML的配置元数据,指明一个子bean定义使用所在的当前属性指定的父bean作为这个属性的值。

例如:
让我们使用Eclipse IDE,然后按照下面的步骤来创建一个Spring应用程序:

2015125162144585.png (594×321)

以下是我们定义的“HelloWorld”豆里面有两个属性message1和message2配置文件beans.xml中。下一步“helloIndia”豆已经被定义为“HelloWorld”的子bean使用parent属性。该子bean继承message2属性原状,并覆盖message1 属性,并引入多一个属性message3。

<&#63;xml version="1.0" encoding="UTF-8"&#63;>



 
  
  
 

 
  
  
 



这里是HelloWorld.java 文件的内容:

package com.yiibai;

public class HelloWorld {
 private String message1;
 private String message2;

 public void setMessage1(String message){
  this.message1 = message;
 }

 public void setMessage2(String message){
  this.message2 = message;
 }

 public void getMessage1(){
  System.out.println("World Message1 : " + message1);
 }

 public void getMessage2(){
  System.out.println("World Message2 : " + message2);
 }
}

这里是HelloIndia.java文件的内容:

package com.yiibai;

public class HelloIndia {
 private String message1;
 private String message2;
 private String message3;

 public void setMessage1(String message){
  this.message1 = message;
 }

 public void setMessage2(String message){
  this.message2 = message;
 }

 public void setMessage3(String message){
  this.message3 = message;
 }

 public void getMessage1(){
  System.out.println("India Message1 : " + message1);
 }

 public void getMessage2(){
  System.out.println("India Message2 : " + message2);
 }

 public void getMessage3(){
  System.out.println("India Message3 : " + message3);
 }
}

以下是MainApp.java文件的内容:

package com.yiibai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
 public static void main(String[] args) {
  ApplicationContext cOntext= 
    new ClassPathXmlApplicationContext("Beans.xml");

  HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

  objA.getMessage1();
  objA.getMessage2();

  HelloIndia objB = (HelloIndia) context.getBean("helloIndia");
  objB.getMessage1();
  objB.getMessage2();
  objB.getMessage3();
 }
}

创建完成源代码和bean配置文件,让我们运行应用程序。如果一切顺利,这将打印以下信息:

World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!

如果你在这里看到,我们没有通过message2同时创建“helloIndia”的bean,但它通过了,因为bean定义的继承。

bean定义模板:
您可以创建可以在不会花太多功夫被其他子bean定义的bean定义模板。在定义bean定义模板,不应指定类属性,并应与真值指定如下所示的抽象属性:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>



 
  
  
  
 

 
  
  
 



父bean不能被实例化它自己,因为它是不完整的,而且它也明确地标记为抽象。当一个定义是抽象的这个样子,它只是作为一个纯粹的模板bean定义,充当子定义的父定义使用。

注入内部bean
正如你所知道的Java内部类是其他类的范围内定义的,同样,内部bean是被其他bean的范围内定义的bean。因此元素内元件被称为内部bean和它如下所示。

<&#63;xml version="1.0" encoding="UTF-8"&#63;>



 
  
   
  
 



例如:
我们使用Eclipse IDE,然后创建一个Spring应用程序,

这里是TextEditor.java文件的内容:

package com.yiibai;

public class TextEditor {
 private SpellChecker spellChecker;

 // a setter method to inject the dependency.
 public void setSpellChecker(SpellChecker spellChecker) {
  System.out.println("Inside setSpellChecker." );
  this.spellChecker = spellChecker;
 }
 // a getter method to return spellChecker
 public SpellChecker getSpellChecker() {
  return spellChecker;
 }

 public void spellCheck() {
  spellChecker.checkSpelling();
 }
}

下面是另外一个相关的类文件SpellChecker.java内容:

package com.yiibai;

public class SpellChecker {
 public SpellChecker(){
  System.out.println("Inside SpellChecker constructor." );
 }

 public void checkSpelling(){
  System.out.println("Inside checkSpelling." );
 }
 
}

以下是MainApp.java文件的内容:

package com.yiibai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
 public static void main(String[] args) {
  ApplicationContext cOntext= 
    new ClassPathXmlApplicationContext("Beans.xml");

  TextEditor te = (TextEditor) context.getBean("textEditor");

  te.spellCheck();
 }
}

以下是配置文件beans.xml文件里面有配置为基于setter 注入,但使用内部bean:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>



 
 
  
   
  
 



创建源代码和bean配置文件来完成,让我们运行应用程序。如果一切顺利,这将打印以下信息:

Inside SpellChecker constructor.
Inside setSpellChecker.
Inside checkSpelling.


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 【具体报错信息】ErrorparsingD:\android-sdks\system-images\android-22\android-wear\armeabi-v7a\devi ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • Principle for Mac(交互式屏幕设计软件)免激活版
    Mac上好用的交互式屏幕设计软件,PrincipleforMac是一款交互式屏幕设计软件,principle mac让您的设计将以原则出现,随时为您注入新的活力。如果您进行更改,再 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
author-avatar
qianweirui7058
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有