spring总结(01)
Spring 是企业级应用中的一个软件开发框架(Framework),一个半成品。最大优势是更好实现资源的整合。例如整合JDBC,MyBatis,Hibernate等框架资源以更好的简化应用软件开发,降低软件开发周期。
Spring 最初的目标就是要整合一切优秀资源,然后对外提供一个统一的服务,其具体架构(Spring 4.0)如下:
Spring 中的核心组件:
1) IOC 组件(控制反转容器):对象创建,对象存储,对象依赖管理。
2) DATA 组件(整合JDBC,MyBatis,JPA,....)
3) MVC 组件(重点解决与表示层通讯问题)
4) AOP 组件(重点解决对象功能扩展问题)
1.1. Spring IOC 概述
Spring 中有一个核心容器,这个容器我们通常称之为IOC(Inversion of Control)容器,这个容器最核心功能就是控制反转.这个容器负责对象的创建,
对象的存储(map),对象的管理(依赖查找,依赖注入)。
总结:
1) 核心服务(整合资源)
2) 核心特性 (IOC-面向对象,AOP-面向切面,Cloud-面向微服务)
3) 核心目的(更好的对系统进行粒度控制,对象管理,功能扩展)
1. Spring 框架中Bean对象基础应用
在软件应用中由Spring管理的所有对象都称之为Bean.我们自己创建的类假如需要由spring管理,首先对这个类进行配置,常用配置方式有两种,一种基于xml进行配置,一种基于注解进行配置.
a.基于xml方式对象Bean对象进行配置时,首先需要在spring的核心配置文件中
使用bean标签对bean类型进行声明,借助id或name属性指定的bean的一个
标识.通过class属性指定bean的具体类型(必须写全类名);
1.1. Bean 对象的构建
Spring 中Bean对象的构建,提供了如下两种方式:
1) 直接通过构造方法
2) 通过工厂的实例方法(调用FactoryBean的getObject方法)
代码实现: 直接通过构造函数
<!-- 直接通过类的构建方法构建对象(重点) -->
<bean id="helloService" class="beans.HelloService"/>
1.1. Bean 对象的作用域
在Spring容器中管理的Bean对象,可以在声明时通过scope属性或
相关注解指定其作用域,最常用是singleton,prototype.其含义如下
1) singleton (这个作用域标识的对象具备全局唯一性):系统默认
2) prototype(这个作用域标识的对象每次获取都会创建新的对象)
<bean id="helloService"
class="beans.HelloService"
scope="singleton"/>
1.1. Bean 对象的生命周期
在Spring框架应用中,所有的的Bean对象都有生命周期,所谓Bean对象的生命周期是指Bean对象的创建,初始化,服务,销毁的这个过程.
在spring配置文件中可以通过Init-method,destory-method属性指定bean的生命周期方法.例如:
<bean id="helloService"
class="beans.HelloService"
scope="prototype"
init-method="init"
destroy-method="destory"/>
在Spring应用由Spring创建的对象是否由spring销毁,还取决于Bean对象的作用域的配置.例如
1) singleton作用域的对象可以在容器关闭时销毁(会调用对象的销毁资源的方法)
2) prototype作用域的对象可以由容器创建对象,初始化对象,但不负责销毁.
一般是资源提供者对象,例如连接池对象可能会写生命周期方法
Bean 对象的延迟加载
在spring框架应用,容器初始化时候,默认会构建所有由spring管理的Bean对象.但假如这些对象长时间不使用还占用着内存就会造成一定的资源浪费.为了解决这个问题,spring中提供了一种延迟加载机制.通过这种机制来提高系统资源的有效使用.
Spring中的延迟加载需要通过bean元素中lazy-init属性或beans元素的default-lazy-init="true"属性进行设置.两者应用的不同点:
1) lazy-init: 应用在bean标签中用于指定这个bean的加载策略.
2) default-lazy-init:应用在beans标签中用于指定所有bean的加载策略.
例如:
<bean id="helloService" class="beans.HelloService" scope="singleton" lazy-init="true"/>
Spring 框架中依赖注(DI)基础应用
1.1. 直接量值的注入
Spring 直接量值的注入指的是通过Spring IOC为对象的8种封装类以及String类型的属性注入值。
配置OpenDataSource类并通过set方法为对象属性赋值。
<bean id="dataSource" class="beans.OpenDataSource">
<property name="driverClassName" value="com.jdbc.mysql.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
当然假如对象提供了对应的构造方法也可以通过构造方法为属性注入值,例如
<bean id="openDataSource02" class="beans.OpenDataSource">
<!-- 默认按照构造方法参数顺序注入值
说明:配置时有几个constructor-arg就是
要调用带及格参数的构造函数
-->
<constructor-arg value="com.mysql.jdbc.Driver"/>
<constructor-arg value="jdbc:mysql:///test"/>
<constructor-arg value="root"/>
<constructor-arg value="123456"/>
</bean>
说明:依赖注入时可以将配置信息提取到properties文件中,然后通过spring表达式#{id.key}的方式提取数据。
在类路径下定义一个configs.properties文件,内容如下
jdbcDriver= com.mysql.jdbc.Driver
jdbcUrl= jdbc:mysql:///test
jdbcUser= root
jdbcPassword=123456
在spring的配置文件中configs.properties文件
<util:properties id="cfg" location="classpath:configs.properties"/>
在bean中为属性注入值时使用spring 表达式
<bean id="dataSource" class="beans.OpenDataSource">
<property name="driverClassName" value="#{cfg.jdbcDriver}"/>
<property name="url" value="#{cfg.jdbcUrl}"/>
<property name="username" value="#{cfg.username}"/>
<property name="password" value="#{cfg.password}"/>
</bean>
其中#为spring表达式特殊标记,{}为表达式内容,cfg为util:properties 标签中定义的id. username、password为配置文件等号左边的key
Spring 配置文件中为对象属性注入值。
<bean id="collection" class="beans.CollectionObject">
<property name="list">
<list>
<value>A</value>
<value>B</value>
</list>
</property>
<property name="map">
<map>
<entry key="k1" value="100" />
<entry key="k2" value="300" />
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
类的设计
package com.jt.common.utils;
/**生产者对象(负责向容器放数据)*/
public class Producer {//IOC(工厂,容器)
/**生产者关联一个容器对象(目的是要向此容器放数据)*/
private Container container;
public void setContainer(Container container) {
this.container = container;
}
public Container getContainer() {
return container;
}
}
类的基本配置
…
<bean id="producer" class="com.jt.common.utils.Producer">
<!-- 借助ref属性从容器中获取一个id为container
的对象然后赋值给Producer的container属性 -->
<property name="Container" ref="container"/>
</bean>
…
单元测试
public class TestProducer01 extends TestBase{
@Test
public void testProducer(){
//1.获取生产者对象
Producer pro=ctx.getBean("producer",Producer.class);
Assert.assertNotEquals(null, pro);
//2.获取生产者关联的容器对象
Container container=pro.getContainer();
Assert.assertNotEquals(null, container);
//3.向容器放数据
container.getMap().put("mysql", 100);
container.getList().add("皮皮霞");
}
}
转载于:https://www.cnblogs.com/zj-xu/p/10830559.html
spring总结(01)相关推荐
- Spring-JdbcTemplate(注入到spring容器)-01
1.导入spring-jdbc和spring-tx坐标 <dependency><groupId>junit</groupId><artifactId> ...
- 【Java开发】Spring Cloud 01 :微服务前提精要
算是新开了一个 Spring Cloud 的坑,本文来源于姚半仙的<Spring Cloud 微服务项目实战>课程,大部分文字内容基于该课程,我的工作可能就是梳理归纳和拓展,希望尽快搞懂相 ...
- Spring 教程01
spring-1 1. Xml<!-- \src\beans-annotation.xml --> <?xml version="1.0" encoding=&q ...
- spring号外0-1 不能连接网络时,spring 配置解决办法
不能连接网络时,spring 配置解决办法 博客分类: SSH 由于spring的schema文件位于网络上,如果机器不能连接到网络,那么在编写配置信息时候就无法出现提示信息,解决方法有两种: 1.让 ...
- 【SSM - Spring篇01】spring详细概述,Spring体系结构,bean、property属性,Spring生命周期方法
文章目录 1. Spring介绍 2. Spring体系架构 2.1 Spring核心容器(Core Container) 2.2 数据访问/集成(Data Access/Integration) 2 ...
- 第四阶段--Spring学习-01
第四阶段--Spring学习 1.概述 2.Spring相关概念 2.1 初识Spring 2.2 Spring系统架构 2.2.1 系统架构图 2.2.3 Spring核心概念-IOC.IOC容器. ...
- Spring Webflux - 01 MVC的困境
文章目录 Spring MVC的困境 Servlet 异步请求缓解线程池压力 Servlet 3.0 异步请求处理 Code 演示 工程 pom 配置文件 启动类 同步servlet 演示 异步ser ...
- [spring boot] 01 环境搭建 - 配置java和mvn环境
主要内容: 一.IntelliJ IDEA 安装 二.maven 安装 三.设置IDEA和mvn的关系 一.IntelliJ IDEA 安装 1.1. 下载编辑器:前往下载 (Ultimate和Com ...
- Spring实战01——自动化装配bean
自动装配bean 的四种方式: 首先定义一个类,使用@Configuration 标注类成为配置类,然后有下面四种方式: 1.配置类使用@ComponentScan 注解扫描指定包下的类,默认是扫描同 ...
- 【Spring学习】01
Spring学习01 Spring概述 简介 优点 组成 Spring快速入门 Spring程序开发步骤 Spring概述 简介 ·Spring框架是由于软件开发的复杂性而创建的.Spring使用的是 ...
最新文章
- Oracle 索引 详解 - 索引分类
- 2017阿里云代码管理服务公测上线
- RestQL:现代化的 API 开发方式
- apache php显示成列表,centos中设置apache显示目录列表
- .NET 4.0新增命名空间:System.Collections.Concurrent
- MongoDB的默认用户名和密码是什么?
- pythonfor循环语句例子_简单的python循环知识
- Startup Error: Unable to detect graphics environment
- Spring Bean初始化的几种常规方式
- 31. Next Permutation
- php滑动门效果,JavaScript实现滑动门效果
- 路由器 AP、路由、中继、桥接模式的区别
- java基础 --- 求一元二次方程的根(分情况讨论)
- 什么是动态评分及规则
- 官场直升机 鸿蒙笔著,鸿蒙笔会征文一等奖作品 《啼笑缘》续集
- 计算机拼歌曲,粤语歌曲填词法 (电脑软件 lyricsAID)
- Spring boot带来的信息泄露
- python合并word表格单元格_Python实战009:读取Word文档中的表格数据及表格合并问题解决...
- Notification 加入本地的声音文件
- 公安部紧急预警!新型“美团短信”诈骗,目前已多人中招
热门文章
- 省选+NOI 第六部分 技巧与思想
- P1789 【Mc生存】插火把(python3实现)
- 2.3 基本算法之递归变递推 放苹果 python
- HbuilderX、Hbuilder编辑器如何使用手机调试app
- Python | threading02 - 互斥锁解决多个线程之间随机调度,造成“线程不安全”的问题。
- Keil | 解决Keil与VScode配合使用时,代码与注释位置不一样的问题。
- oracle rollup分组没有数据时为0_Hive 入门数据分析基础 5
- Qt文档阅读笔记-Qt Quick 3D - Simple Example解析
- Qt工作笔记-Qt5中中文编码方面的笔记
- Java笔记-多线程相关