文章目录

    • 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学习相关推荐

  1. 关于spring IoC 学习

    What is IoC 简单来说: 控制:当前对象对其内部成员对象的控制权/获取组装对象的过程 反转:上述的过程/控制权,交由专门的第三方组件(容器或者说平台)来管理 这种从具体对象手中,交出控制的做 ...

  2. Spring IOC学习心得之Bean对IOC容器的感知

    容器管理的Bean一般不需要了解容器的状态和直接使用Bean,但是在某些情况下,是需要在Bean中直接对IOC容器进行操作的,这时候,就需要在Bean中设定对容器的感知.Spring IOC也提供了该 ...

  3. Spring IOC 学习总结

    1 什么是IOC.DI IoC-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制 ...

  4. 【Spring】Spring IOC学习笔记

    Spring IOC Spring简介 Spring理念 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架 Spring优点 Spring是一个轻量级的 控制反转(IOC) 和 面向切 ...

  5. Spring IoC 学习(3)

    前言 前面因为总结的累了,把IoC的两个步骤,只写了一半,就仅仅把容器启动的方面说了说,对于实例化的阶段,我前面并没有说,在这节中,准备讲一讲,实例化阶段. 生命周期 基础生命周期简图 这个部分,其实 ...

  6. Spring IOC学习心得之源码级分析ContextLoaderListener的作用(IOC容器初始化入口)

    ContextLoaderListener类是负责初始化IOC容器,即在我们的web项目中,这里就是IOC容器初始化的入口,由这个类启动IOC容器的初始化. 它配置在web.xml中,比如如下配置: ...

  7. Spring IOC学习心得之IOC容器的初始化过程

    注:本文大多数内容都是摘自<Spring技术内幕>这本书 简单来说,Ioc容器的初始化过程是在refresh()方法中启动的,包括BeanDefinition的Resource定位,载入和 ...

  8. Spring IOC学习心得之BeanPostProcessor,BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口是如何起作用的

    1. 首先说下BeanPostProcessor接口中的两个方法,如下: package org.springframework.beans.factory.config;import org.spr ...

  9. hello word 程序 ——简单的spring ioc 学习

    转载于:https://www.cnblogs.com/yangweiguo123/p/10297758.html

  10. Spring IOC学习心得之注册bean的依赖关系

    registerDependentBean方法的解析(注册bean的依赖关系) 源码如下: public void registerDependentBean(String beanName, Str ...

最新文章

  1. R语言bioconductor包—maftools的使用
  2. python3基础语法-Python3入门(三)——Python基础语法
  3. 2020 华工 数据结构-平时作业_【激光】从上海工博会看华工激光的差异化路线...
  4. Sum of Consecutive Prime Numbers POJ - 2739(线性欧拉筛+尺取法)
  5. mongodb for java_【MongoDB for Java】Java操作MongoDB
  6. LeetCode 49 - Group Anagram 归类同构字
  7. 指派问题的遗传算法求解 Java实现
  8. matlab求组合数不想求组合数矩阵,【潘德的预言】用关系模型与组合数计算NPC最大相容人数和所有组合...
  9. 大家说说有必要免费建网站吗?
  10. 计算机毕业设计指导 教师 评语,毕业设计指导教师评语【集锦】
  11. 13.ActiveMQ 优缺点
  12. Android 字体库的使用-引入外部字体
  13. linux vi回到末行模式,Linux vi/vim 的命令模式,,编辑模式,末行模式
  14. 安规之电气间隙和爬电距离
  15. DB2使用db2advis工具调优SQL
  16. JZ2440挂载nfs
  17. lut预设安装:LUTs预设如何导入pr?lut预设导入Premiere Pro教程
  18. C++ Primer:vector删除元素时迭代器失效问题
  19. 使用Biopython比较基因组相似度:新冠(COVID19)与非典(SARS)、中东呼吸综合征(MERS)
  20. sitemap java_Java动态生成SiteMap.xml,无需插件

热门文章

  1. chrome设置socket5代理
  2. excel表格如何转换成word表格_Word表格如何转为Excel表格?这2个小技巧轻松搞定!
  3. 卡耐基梅隆大学计算机科学课本,美国卡耐基梅隆大学计算机科学硕士.pdf
  4. 《java程序设计基础》使用Reader和Writer流类
  5. netbeans开发php项目,NetBeans PHP 项目创建
  6. 当在浏览器中输入 Google.com 并按下回车之后发生了什么?
  7. H3CNE 综合实验,全网最全教程
  8. NoSQL数据库Redis--1
  9. 2020年精选网络性能监控系统
  10. 如何将PDF转换成word文档