java xml接口实例化_Spring简介及xml配置

Java Web发展史

第一阶段:JavaBean+Servlet+Jsp逐步发展

第二阶段:面对EJB重量级框架带来的种种麻烦

第三阶段:SpringMVC/Struts+Spring+Hibernate/myBatis

第四阶段:享受SpringBoot"约定大于配置"的种种乐趣,很多繁琐的配置都变成了约定

第五阶段:以Dubbo为代表的SOA为服务架构体系(Dubbo是阿里创建的)

第六阶段:比较前沿的技术,SpringCloud 微服务架构技术生态圈(基于SpringBoot,保证了开箱即用,需要什么SpringCloud都有)

IoC 控制反转

不只是Spring的IoC,其他的框架也具有相同的IoC思想及应用:

控制: 控制对象的创建及销毁(生命周期)

反转:将对象的控制权交给IoC容器

IoC容器约定

①所有Bean的生命周期交由IoC容器管理

②所有被依赖的Bean通过构造方法执行注入

③被依赖的Bean需要优先创建

Spring IoC容器使用方法

概述

通过Spring.xml文件实例化Bean.只要Spring.xml中配置了bean标签,则就会根据class创建这个bean的实例.

把一个java bean交给Spring管理步骤:

1、创建一个xml格式的配置文件

2、在xml文件中定义一个bean,给每个bean设定一个id

3、通过ApplicationContext获取Spring上下文

ApplicationContext context = new ClassPathXmlApplicatioinContext("文件名.xml");

4、获取bean

`Bean bean = context.getBeal("第一步中给bean的id",Bean.class);

1、通过构造方法实例化Bean

步骤1:创建要实例化的类,并提供无参构造方法。

public class Bean {

public Bean(){

System.out.println("Bean被创建了");

}

步骤2:spring.xml中配置

测试:

ApplicationContext context=new ClassPathXmlApplicationContext(spring.xml的路径);

Bean bean=context.getBean("bean",Bean.class);

System.out.println(bean);

2、通过静态工厂方法实例化Bean

通过Bean2的工厂的静态方法实例化Bean.

步骤1:创建Bean2的工厂Bean2Factory类以及Bean2类,并且提供一个静态、返回值类型为Bean2的方法,返回new Bean2()。

public class Bean2Factory {

public static Bean2 getBean2(){

return new Bean2();

}

}

public class Bean2 {

public Bean2(){

System.out.println("Bean2被创建了。");

}

步骤2:配置Spring.xml

测试:

ApplicationContext context=new ClassPathXmlApplicationContext("spring-ioc2.xml");

Bean2 bean=context.getBean("bean2factoryId",Bean2.class);

System.out.println(bean);

3、通过实例工厂方法实例化Bean

通过Bean3的工厂的实例方法实例化Bean.

步骤1:创建Bean3的工厂Bean3Factory类以及Bean3类,并且提供一个返回值类型为Bean3的方法,方法返回new Bean3()。

public class Bean3Factory {

public Bean3 getBean3(){

return new Bean3();

}

}

public class Bean3 {

public Bean3(){

System.out.println("Bean3被创建了。");

}

}

步骤2:配置Spring.xml

给bean取别名

有类Bean1,并且通过bean标签实例化Bean1,可以给Bean1的实例取多个名字。

方式一: bean标签里添加name属性

方式二: 添加标签

依赖注入的方式

cfdc23384c1a41d90c5285773c9121f6.png

1.通过构造方法注入Bean

7ebc23cd45075f030def9f8633b328c8.png

简化写法:

304dad5d28f4992440cf17aeb16d5513.png

2.通过Set()方法注入Bean

254ef7d242eabc0595c78579ba5aba2a.png

3.集合类型注入Bean

fd53da8ac15c93c1feaa47be9ca3b5b6.png

9cccc026cef9bdd5859441397bd25b26.png

4.注入null空值

4077547e84a399ada12dc2dd17bf9630.png

5.注入内部bean

43653b5210a72dda9afd845e4d9c8096.png

Spring中Bean的作用域

1、Singleton作用域(单例模式)

通过Spring容器实现单例模式,具有局限性:保证在一个Spring上下文(ApplicationContext)是单例模式,多个AppliactionContext单例模式就失效了。

148bab525aeaa62161f25b4a7b9e240a.png

2、prototype作用域(多例模式)

如果一个的作用域为prototype,则该会被实例化多次,有多个Bean会被创建(每次向Spring上下文请求该Bean都会new一个新的实例)。

5b347d03382dec3b9640f5dc0569a8b7.png

Bean1依赖Bean2,总结起来:

0857864bd33c5e84c61acb890e49b3e8.png

对于蓝框中的情况,有时候我们需要单个Bean1,多个Bean2,就要用到方法注入.

方法注入

6f009878056449cb12fe57bbf5dc6aff.png

Bean2代码修改:

29f7c173b9ede58761a47ea46cdba5e1.png

Spring.xml修改:

b4f883dc60123bc167002478a9f8b96e.png

这样即使Bean1是单例模式,每次拿到Bean1都会是不同的Bean2实例.

3、Web环境作用域

request作用域、session作用域、application作用域、websocket作用域(使用较少).....

request:每次浏览器刷新都会实例化一个新的bean;

session:浏览器刷新不会实例化新的bean,更换浏览器则会实例化新的bean;

application:bean实例化之后就不会改变,更换浏览器也不会。

SpringWeb上下文环境

在web.xml中定义:

664592200e6c1eded41452853d4def8c.png

不使用DispatcherServlet:

c772ffff05b72fd000c0def44b87d46e.png

d25de8520c970f2d96195f26dd44a9e8.png

以RequestController为例:

5071419001e25f410087d5ba0c58e341.png

在spring.xml中添加:

aac4a634cea49058a5887d5b87203a23.png

request:每次浏览器刷新都会实例化一个新的bean;

session:浏览器刷新不会实例化新的bean,更换浏览器则会实例化新的bean;

application:bean实例化之后就不会改变,更换浏览器也不会。

195e7a3a3fa18ee640b32182eff32789.png

4、自定义作用域

Spring内置的自定义SimpleThreadScope作用域

以自定义双例模式为例:

步骤1:实现Scope接口

(org.springframework.beans.factory.config.Scope)主要关注实现的get方法和remove方法。

d6e30a4575505eb63ddd75a01d3fc02d.png

get()方法:按照name参数,按照我们自己定义的规则,去返回一个Bean,如果我们定义的规则里,Bean不存在,那么将通过objectFactory去创建一个Bean。

双例模式:一个bean的Id对应两个实例,实现双例模式,需要两个Map集合,Map map1=new HashMap();Map map2=new HashMap();。

get()方法:

public Object get(String name, ObjectFactory> objectFactory) {

if(!map1.containsKey(name)){ //判断map1是否包含名为name的Bean实例

Object o=objectFactory.getObject();//如果不存在则创建一个ObjectFactory规则Bean

map1.put(name, o); //并把这个Bean放入集合,并命名为name

return o;

}

if(!map2.containsKey(name)){ //map2同map1操作

Object o=objectFactory.getObject();

map2.put(name, o);

return o;

}

//如果map1和map2都包含这个Bean,也就是说Spring上下文通过Id获取有两个实例,则返回一个0或1

int i=new Random().nextInt(2);

if(i==0){

return map1.get(name);//如果是0,则返回对象1

}else{

return map2.get(name);//如果是0,则返回对象2

}

}

remove()方法:和get方法相反,按照name参数,去移除一个Bean。

public Object remove(String name) {

if(map1.containsKey(name)){

Object o=map1.get(name);

map1.remove(name);

return o;

}

if(map2.containsKey(name)){

Object o=map2.get(name);

map2.remove(name);

return o;

}

return null; //说明没拿到任何实例

}

步骤2: spring.xml配置

测试

@Test

public void testBean(){

ApplicationContext ac=new ClassPathXmlApplicationContext("spring-zidingyi.xml");

for(int i=0;i<10;i++){

Bean bean=ac.getBean(“myScope”", Bean.class);

System.out.println(bean);

}

}

补充:SimpleThreadScope

Spring提供的线程内单例作用域:

同一线程中Spring上下文会分配同一实例

不同线程(Thread)中,则获得不同实例。

srping配置:

测试代码:

public void testBean(){

final ApplicationContext ac=new ClassPathXmlApplicationContext("spring-zidingyi.xml");

for(int i=0;i<10;i++){

new Thread(new Runnable(){

@Override

public void run() {

Bean bean=ac.getBean("bean11", Bean.class);

System.out.println(bean);

}

}).start();

}

}

}

默认Scope(单例)Bean的懒加载

Spring容器会在创建容器时提前初始化Singleton作用域的bean,但是如果Bean被标注了lazy-init=“true”,则该Bean只有在其被需要的时候才会被初始化。(只对singleton作用域的bean有效)

多个bean使用懒加载:

表示spring配置文件里所有bean都是懒加载模式。

使用场景:

如果某个Bean在程序整个运行周期都可能不会被使用,那么可考虑设定该Bean为懒加载。

优点:尽可能的节省了资源。

缺点:可能会导致某个操作相应操作时间增加。

Bean初始化及销毁

以singleton作用域为例,假设有一个javaBean,该Bean的作用是连接数据库,该Bean被创建之后,执行数据库连接操作.

Bean初始化

如果需要在Bean实例化时执行一些逻辑,Spring提供了两种方法:

方法1:bean标签里的init-method属性,该值为Bean的某一方法,Spring实例化时,会调用Bean的该方法。

方法2:让Bean实现InitializingBean接口,Spring在实例化该Bean时,检测到Bean实现了该接口,就会调用该接口所定义的相应方法。

Bean销毁

如果需要在Bean销毁之前执行一些逻辑,有两种方法。

方法1:bean标签里的destory-method属性,该值为Bean的某一方法,Spring销毁该Bean时,会调用Bean的该方法。

方法2:让Bean实现DisposableBean接口,Spring在销毁该Bean时,检测到Bean实现了该接口,就会调用该接口所定义的相应方法。

案例1:

通过bean标签的init-method和destory-method属性来指定Bean初始化逻辑和销毁逻辑。

代码:

public class Bean {

public void onInit(){

System.out.println("Bean的初始化逻辑方法被执行了");

}

public void onDestory(){

System.out.println("Bean的销毁逻辑方法被执行了");

}

}

spring.xml配置:

id="bean"

init-method="onInit"

destroy-method="onDestory"/>

测试代码:

@Test

public void test(){

ApplicationContext ac=new ClassPathXmlApplicationContext("spring-initAnddestory.xml");

Bean bean=ac.getBean("bean", Bean.class);

System.out.println(bean);

}

结果:bean的销毁方法没执行,因为当前是单例模式,所以Bean的初始化是在Spring上下文实例化完成的,Bean的销毁是在Spring上下文的销毁过程中执行Bean的销毁。(Spring上下文的销毁定义到AbstractApplicationContext中)

改进:

@Test

public void test(){

AbstractApplicationContext ac=new ClassPathXmlApplicationContext("spring-initAnddestory.xml");

Bean bean=ac.getBean("bean", Bean.class);

System.out.println(bean);

ac.close();

}

注意:如果所有的Bean都有相同名称的初始化方法和相同名称的销毁方法,可以在spring.xml中定义:

default-destory-method="onDestory"/>

案例2:

实现相应接口,并实现相应方法

代码:

public class Bean implements InitializingBean,DisposableBean{

@Override

public void destroy() throws Exception {

System.out.println("Bean的销毁逻辑方法被执行了");

}

@Override

public void afterPropertiesSet() throws Exception {

System.out.println("Bean的初始化逻辑方法被执行了");

}

}

spring.xml配置:

Bean属性继承

应用场景

场景1:

ParentClass(属性1,属性2,属性3,get和set方法)

子类1(属性4,属性5)

子类2(属性6,属性7)

场景2:

子类1和子类2没有父类,而是有一些相同的属性。

类1:(属性1,属性2,属性3,属性4,属性5)

类2:(属性1,属性2,属性3,属性6,属性7)

这两个场景下,通过Spring注入类1和类2的所有属性,一般如下:

abstract="true":设置标签只是定义性的,不会对它进行实例化操作。

parent属性:在Bean的子类bean标签添加,值为父类的Id。

场景1:

spring.xml配置:

场景2:

类1和类2不继承某一父类,只是存在相同属性。

spring.xml配置:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

员工薪酬管理设计方案

待遇管理模块目前我遇到的要分两种方案&#xff0c;第一种是集团版的(有子公司、区域公司)&#xff1b;第二种是标准版的(就是一个标准的公司&#xff0c;不存在什么子公司)&#xff0c;下面就谈谈标准版个人是如何处理的。 特别感谢&#xff1a;江琴童鞋、罗静童鞋两位财务人员…

文件上传简介1---上传到指定的目录

preparation 本节摘要&#xff1a;本节主要介绍上传文件到指定目录。 引入&#xff1a; 文件上传是开发中常用的功能&#xff0c;本节主要介绍用commons-fileupload-1.1.jar包实现基本的文件上传功能&#xff0c;即上传文件到指定的目录中&#xff0c;同时介绍上传过程中使用到…

java驱动pl sql优点_用PL/SQL和Java开发Oracle8i应用程序

用PL/SQL和Java开发Oracle8 i应用程序随着Oracle8i的发布&#xff0c;Oracle 在数据库里支持了二种主要的编程语言??PL/SQL和Java。今天&#xff0c;Oracle的许多客户既使用PL/SQL建立数据库应用程序&#xff0c;也使用Java建立数据库应用程序。既然存在二种数据库编程语言&a…

java客户姓名添加和查找_java类与对象 演练 客户姓名添加与查看

java类与对象 演练 客户姓名添加与查看java类与对象 演练 客户姓名添加与查看https://www.ixigua.com/6870483106223096327?logTag_YUmIb2rn9-6JpoNipj9r属性由于需要保存很多名字因此来一个字符串的数组保存字符串的名字即可考虑&#xff0c;定义多个长度的数组&#xff0c;例…

应用程序调试技术(更新程度:完毕)送源码及PPT

课程简介 调试技术实务分为调试基本概念和设置&#xff0c;Windows下常用到调试工具VS和Windbg的使用&#xff0c;自动化调试技术&#xff0c;以及实际调试场景示例等。不仅仅是介绍枯燥的程序调试技术&#xff0c;而是深入的从操作系统实现以及.NET虚拟机实现的本质出发&#…

安装ie浏览器的js脚本调试工具

在ie中&#xff0c;如果不依赖外部工具进行js调试&#xff0c;而使用原始的alert的话&#xff0c;会大大增加js调试的难度。而微软的office、visual studio里边都带了可以支持ie调试的工具。 在安装office(2003、2007带此工具&#xff0c;2010不带此工具)时&#xff0c;选择自定…

领域驱动设计和开发实战总结

原文见&#xff1a;http://www.infoq.com/cn/articles/ddd-in-practice 转载于:https://www.cnblogs.com/ego/archive/2012/03/03/2378104.html

linux php 上级目录,Linux目录架构详解_php

linux和Windows操作系统的显著区别之一就是目录架构的不同。Linux操作系统的目录架构遵循文件系统层级结构标准。不知你是否使用ls命令浏览过Linux的根目录“/”&#xff0c;亲爱的读者&#xff0c;您都了解这些目录的含义吗?ls -l / 遍历文件系统(点击看大图)本文将引领您浏览…

screen执行php,Linux中screen命令及使用方法

Screen简介Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话&#xff0c;并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。GUN Screen&am…

数据库字符串处理函数

在数据库操作中&#xff0c;经常要进行字符串的拼接和替换等操作。下面总结归纳如下&#xff1a; 示例数据表people如下&#xff1a; 1 sql server数据库中的sql语句可以直接用 号进行字符串的拼接。举例如下&#xff1a; select Name ‘ ’ gentle as message from people …

前端学习(417):京东制作页面25中间部分的准备工作

引入index.css作为中部样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…

前端学习(418):京东制作页面26中间模块划分

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-left:10px;} .grid-coll3{width: 190px;height: 100%;background-color:purple;…

前端学习(419):京东制作页面27左侧分类上

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll1 ul{padding: 20px 0;} .grid-coll1 ul li{padding-left: 12px;}.grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-lef…

UNP Chapter 22 - 信号驱动I/O

22.1. 概述 信号驱动是指当某个描述字上发生了某个事件时&#xff0c;让内核通知进程。 这里描述的信号驱动不是真正的异步I/O。 第15章描述的非阻塞I/O同样不是异步I/O。在非阻塞I/O中&#xff0c;启动I/O操作后内核并不像真正的异步I/O那样立即返回&#xff0c;它只有在进程非…

php strpos与strrpos,PHP开发之 strpos stripos strrpos strripos的区别

前言在日常PHP开发中strpos stripos strrpos strripos这四个函数是会经常用到的&#xff0c;但是你又掌握了多少呢&#xff1f;在这里将着中就这4个函数做一个详细的解析。正文stripos — 查找字符串首次出现的位置(不区分大小写),应使用 运算符来测试此函数的返回值&#xff…

南京php基础学习,南京玄武区php培训有哪些(学习PHP的优点有哪些)

南京玄武区php培训有哪些&#xff0c;进行选择南京php培训的时候&#xff0c;肯定要知道php培训的学习周期&#xff0c;php乱码怎么解决&#xff0c;学习PHP的优点有哪些&#xff0c;php的性质有哪些。php培训的学习周期一般都是四到五个月和Java培训周期差不多&#xff0c;不过…

php额拍戏,像这种会演戏的演员,给我焊在剧组365天拍戏可以吗?

最近芭姐疯狂 get 到董子健的演技&#xff0c;每晚换台一边《大江大河 2》一边《流金岁月》交叉着看&#xff0c;太直观了&#xff01;《大江大河》中&#xff0c;董子健饰演的杨巡虽然戏份不及宋运辉多&#xff0c;但在有限的笔墨中&#xff0c;董子健凭借到位的演技&#xff…

照相机滤镜使用,优化解码和滤镜导致的预览卡屏现象

这几天看到亚瑟boy的技术连载&#xff0c;也试着做了下带滤镜特效的照相机&#xff0c;效果也出来了&#xff0c;但是发现添加滤镜特效后的预览窗口卡屏现象很严重&#xff0c;于是自己索性试着尝试修改&#xff0c;在亚瑟和其他网友的代码中基本上都是对于照相机data视频流先进…

oracle linux6 u盘安装,U盘安装RHEL6

1)烧录ISO镜像用软碟通写入硬盘镜像rhel-server-6.5-x86_64-boot.iso&#xff0c;然后将rhel-server-6.2-x86_64-dvd.iso复制到U盘根目录备注&#xff1a;如果是烧录DVD那么就直接烧rhel-server-6.2-x86_64-dvd.iso即可&#xff0c;U盘安装linux不注意此处会发生找不到image错误…

网页设计师的最佳设计工具名单出炉

一个网站的基本设计是为了吸引大多数人。因此&#xff0c;要吸引更多的客户&#xff0c;他们需要运用所有可能的图案和花纹&#xff0c;创造出惊人的效果&#xff0c;体现网站自身的美感。这样&#xff0c;设计师就需要使用一些设计工具&#xff0c;以确保有更高的效率。创建3D…