Spring IOC学习
文章目录
- SpringIOC
- 常用applicationContext实现类
- 一、ClassPathXmlApplicationContext
- 二、AnnotationConfigApplicationContext
- Spring中的Java类
- 三、XmlWebApplicationContext
- Application初始化路径
- 路径前缀
- 路径中的通配符
- applicationContext.xml配置文件
- 管理bean
- 1.在xml文件中配置开启注解
- 2.在一个类中直接添加注解使这个类成为一个配置文件也就是成为
- Bean的作用域
- Bean的生命周期
- 在xml中开启Spring注解配置支持
- 导入其他spring配置xml文件
- 引入外部的properties文件
- 将外部properties文件中的属性注入到bean中
- p,c命名空间
- 通过p命名空间来注入属性(通过setter方法)
- 通过c命名空间来注入构造参数
- 注入集合、Map类型参数
- 通过对象工厂方法实例化
- 在非web应用中优雅的关闭SpringIOC容器
- 懒加载
- 什么是懒加载
- 实现方式
- 懒加载的优缺点
- 默认懒加载
SpringIOC
SpringIOC(Inversion of Control)是一个容器,也就是我们通常所说的控制反转。 IOC容器将我们的javabean和一些用于描述这些bean应该如何初始化、组装的配置信息进行整合。提供给我们开发人员一个配置、组装完成的上下文给我们使用,我们可以方便的通过IOC容器将繁杂的对象创建、管理工作托管给IOC容器。所以称之为控制反转。(由原来的开发人员自己控制对象的创建、组装改为交由Spring IOC容器负责)
常用applicationContext实现类
ClassPathXmlApplicationContext:类路径加载
AnnotationConfigApplicationContext:用于基于注解的配置
XmlWebApplicationContext:用于在Web工程中初始化SpringIOC容器
一、ClassPathXmlApplicationContext
用于加载类路径下的spring配置文件,通常用于控制台程序
使用方法:
ApplicationContext ctx = new ClassPathXmlApplicationContext(“applicationContext.xml”);
StudentService ss = ctx.getBean(StudentService.class);
System.out.println(ss);
二、AnnotationConfigApplicationContext
用于初始化通过注解方式配置的ioc容器
Spring中的Java类
@Configuration
public class Student {
@Bean
@setter
@Getter
private String name;
}
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(Studebt.class);
}
三、XmlWebApplicationContext
XmlWebApplicatoinContext用于在Web工程中初始化SpringIOC容器,不过我们一般不会手动通过它来初始化IOC容器,Spring针对Web工程专门给我们提供了一个监听器来完成IOC容器的初始化工作,用法如下:
在项目的web.xml中配置
contextConfigLocation /WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml org.springframework.web.context.ContextLoaderListener
在ContextLoaderListener中Spring会优先判断用户是否在web.xml中配置了名为contextClass的参数,如果配置了优先使用用户制定的ApplicationContext实现类来初始化IOC,反之则使用默认的ApplicationContext实现类:org.springframework.web.context.support.XmlWebApplicationContext来完成IOC容器的初始化工作。
Application初始化路径
路径前缀
// 前缀classpath:表示的是项目的classpath下相对路径
ApplicationContext ctx = new ClassPathXmlApplicationContext(“classpath:applicationContext.xml”);
路径中的通配符
// 使用通配符加载所有符合要求的文件
ApplicationContext ctx = new ClassPathXmlApplicationContext(“classpath*:applicationContext.xml”);
applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
管理bean
一.通过xml配置来管理Bean 我们可以在xml文件中配置:
优点:对代码没有侵入性,改变了配置不用再重新编译与打包 我们可以通过bean的id或者name属性来获取此bean,class则是初始化这个路径的这个类
二.Annotation配置方式(注解方式) 使用注解的方式有两种:
1.在xml文件中配置开启注解
context:annotation-config/
2.在一个类中直接添加注解使这个类成为一个配置文件也就是成为
@Configuration
@ComponentScan(“com.john.spring”) @Configuration这个注解就是为了让这个类成为xml配置文件
@ComponentScan(“com.john.spring”)这个注解是开启扫描注解同时指定一个扫描的根 路径
优点:配置简单
缺点:对代码有侵入性,如果注解的配置改变了就得重新编译与打包
Bean的作用域
bean的作用域:
作用域属性:scope(主要讲解了单例与非单例的描述)
a.单例的定义就是默认的无需强调 b.非单例两种方式来定义,
一种在xml文件中的中将scope的属性定义为 prototype,
另一种就是在注解中添加@scope中定义prototype这两种方式来定义非单例
单例只能初始化一次,非单例是每实例化一次就创建一个新的对象
Bean的生命周期
通过xml中给bean配置init-method、destroy-method属性
在类中添加init与destroy方法,
在xml文件中通过bean绑定这个类
然后使用init-method、 destroy-method这两种属性获取类中的方法,
在xml中开启Spring注解配置支持
<context:annotation-config /> 开启Spring注解配置支持<context:component-scan base-package="com.lanou3g.spring" /> 配置注解扫描包路径 配置了扫描包路径后就无需再配置上面那行了
导入其他spring配置xml文件
<import resource="classpath:message_beans.xml" />
引入外部的properties文件
方式一:<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="文件名" /></bean>方式二:<context:property-placeholder location="文件名"/>
将外部properties文件中的属性注入到bean中
<bean id="" class="文件路径"> 例:com.lanou3g.spring.bean.JDBCConf<property name="" value="" /> 注入外部文件中的属性值</bean>
bean的name属性
name属性也是用于给bean起名,getBean的时候使用,与id属性不同的是,
name属性的值可以有多个且不能与其他id和name重复
p,c命名空间
要想使用p and c 命名空间,必须要在xml文件头部加相应的p、c schema, 还要有context
通过p命名空间来注入属性(通过setter方法)
在文件头加上 xmlns:p="http://www.springframework.org/schema/p"原始写法:<bean id="" class="文件路径" ="" ><property name="" value="" /></bean>-->p命名空间:<bean id="" class="文件路径" ="" p :name="value"> p相当于上面的<property />
通过c命名空间来注入构造参数
在文件头加上 xmlns:c="http://www.springframework.org/schema/c"原始写法:<bean id="" class="文件路径"><constructor-arg name="" value="" /></bean>c命名空间:<bean id="" class="文件路径" c: name="value"/>
注入集合、Map类型参数
<bean id="" class="文件路径"><property name="属性名"><list><value> 值 </value><value type=类型(例java.lang.Integer)">int类型数字</value> ***注入不同类型</list></property><property name="属性名"><map><entry key="" value=""></entry><entry key=""><null /> *******注入null空值</entry></map></property><property name="属性名"><null /> ******注入null 空集合</property><property name="属性名"><bean class="文件路径" /> ******注入一个匿名内部bean</property><property name="文件名" value="" />
## 通过静态工厂方法实例化
public class People{
private static People people = null;
private String pname;
private People() {}
private People(String pname) {
this.pname = pname;
}
public synchronized static People createInstance(String pname) {if(people == null) {people = new People(pname);}return people;
}public synchronized static People createInstance() {if(people == null) {people = new People();}return people;
}
这种方式适合需要让Spring管理自己实现的单例类,用的很少。因为通过Spring IOC容器我们只需配置一下scope="singleton"就可以实现单例了。
通过对象工厂方法实例化
<!-- 如果工厂方法需要参数,通过此标签传参 -->
<!-- <constructor-arg name="cname" value="TestService" /> -->
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();private static AccountService accountService = new AccountServiceImpl();public ClientService createClientServiceInstance() {return clientService;
}public AccountService createAccountServiceInstance() {return accountService;
}
}
这种方式用的也不多,只有特定场合才会用到
在非web应用中优雅的关闭SpringIOC容器
我们可以通过registerShutdownHook()实现在JVM停止的同时优雅的关闭IOC容器
ctx.registerShutdownHook();
懒加载
什么是懒加载
ioc中的bean默认在ioc容器启动时初始化加载配置文件时,而不是调用getBean()时)
我们在spring容器启动的时候先不把所有的bean都加载到spring容器中,而是在需要用的时候,才把这个对象实例化到容器中
实现方式
用lazy-init。告诉spring容器是否以懒加载的方式创造对象。用的时候才加载构造,不用的时候不加载
懒加载的优缺点
不用时不加载,用到才会加载,节省空间、内存。 init-lazy=“true”,
默认懒加载
在头部设置default-lazy-init="true"
非单例scope=“prototype”(因为调用一次创建一个实例,所以相当于懒加载)
Spring IOC学习相关推荐
- 关于spring IoC 学习
What is IoC 简单来说: 控制:当前对象对其内部成员对象的控制权/获取组装对象的过程 反转:上述的过程/控制权,交由专门的第三方组件(容器或者说平台)来管理 这种从具体对象手中,交出控制的做 ...
- Spring IOC学习心得之Bean对IOC容器的感知
容器管理的Bean一般不需要了解容器的状态和直接使用Bean,但是在某些情况下,是需要在Bean中直接对IOC容器进行操作的,这时候,就需要在Bean中设定对容器的感知.Spring IOC也提供了该 ...
- Spring IOC 学习总结
1 什么是IOC.DI IoC-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制 ...
- 【Spring】Spring IOC学习笔记
Spring IOC Spring简介 Spring理念 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架 Spring优点 Spring是一个轻量级的 控制反转(IOC) 和 面向切 ...
- Spring IoC 学习(3)
前言 前面因为总结的累了,把IoC的两个步骤,只写了一半,就仅仅把容器启动的方面说了说,对于实例化的阶段,我前面并没有说,在这节中,准备讲一讲,实例化阶段. 生命周期 基础生命周期简图 这个部分,其实 ...
- Spring IOC学习心得之源码级分析ContextLoaderListener的作用(IOC容器初始化入口)
ContextLoaderListener类是负责初始化IOC容器,即在我们的web项目中,这里就是IOC容器初始化的入口,由这个类启动IOC容器的初始化. 它配置在web.xml中,比如如下配置: ...
- Spring IOC学习心得之IOC容器的初始化过程
注:本文大多数内容都是摘自<Spring技术内幕>这本书 简单来说,Ioc容器的初始化过程是在refresh()方法中启动的,包括BeanDefinition的Resource定位,载入和 ...
- Spring IOC学习心得之BeanPostProcessor,BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口是如何起作用的
1. 首先说下BeanPostProcessor接口中的两个方法,如下: package org.springframework.beans.factory.config;import org.spr ...
- hello word 程序 ——简单的spring ioc 学习
转载于:https://www.cnblogs.com/yangweiguo123/p/10297758.html
- Spring IOC学习心得之注册bean的依赖关系
registerDependentBean方法的解析(注册bean的依赖关系) 源码如下: public void registerDependentBean(String beanName, Str ...
最新文章
- R语言bioconductor包—maftools的使用
- python3基础语法-Python3入门(三)——Python基础语法
- 2020 华工 数据结构-平时作业_【激光】从上海工博会看华工激光的差异化路线...
- Sum of Consecutive Prime Numbers POJ - 2739(线性欧拉筛+尺取法)
- mongodb for java_【MongoDB for Java】Java操作MongoDB
- LeetCode 49 - Group Anagram 归类同构字
- 指派问题的遗传算法求解 Java实现
- matlab求组合数不想求组合数矩阵,【潘德的预言】用关系模型与组合数计算NPC最大相容人数和所有组合...
- 大家说说有必要免费建网站吗?
- 计算机毕业设计指导 教师 评语,毕业设计指导教师评语【集锦】
- 13.ActiveMQ 优缺点
- Android 字体库的使用-引入外部字体
- linux vi回到末行模式,Linux vi/vim 的命令模式,,编辑模式,末行模式
- 安规之电气间隙和爬电距离
- DB2使用db2advis工具调优SQL
- JZ2440挂载nfs
- lut预设安装:LUTs预设如何导入pr?lut预设导入Premiere Pro教程
- C++ Primer:vector删除元素时迭代器失效问题
- 使用Biopython比较基因组相似度:新冠(COVID19)与非典(SARS)、中东呼吸综合征(MERS)
- sitemap java_Java动态生成SiteMap.xml,无需插件
热门文章
- chrome设置socket5代理
- excel表格如何转换成word表格_Word表格如何转为Excel表格?这2个小技巧轻松搞定!
- 卡耐基梅隆大学计算机科学课本,美国卡耐基梅隆大学计算机科学硕士.pdf
- 《java程序设计基础》使用Reader和Writer流类
- netbeans开发php项目,NetBeans PHP 项目创建
- 当在浏览器中输入 Google.com 并按下回车之后发生了什么?
- H3CNE 综合实验,全网最全教程
- NoSQL数据库Redis--1
- 2020年精选网络性能监控系统
- 如何将PDF转换成word文档