初识SpringIOC

简介

IOC(Inversion of Control)控制反转.指的是获取对象方式由原来主动获取,到被动接收的转变.在Spring中,IOC就是工厂模式解耦,是Srping框架用于创建对象和管理对象的容器.

Maven配置

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>XXXX</groupId>
<artifactId>XXXX</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <!--依赖版本-->
<properties>
<!-- spring版本 -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties> <!--依赖包-->
<dependencies>
<!--spring ioc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency> </dependencies> </project>

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置service,说明:
标签:
bean:配置javaBean对象
属性:
id:bean的唯一标识名称
class:类的全路径信息
细节:
默认使用无参数构造方法,创建对象
-->
<bean id="service" class="XXXX.serivce"></bean> <!--配置dao-->
<bean id="dao" class="XXXX.dao"></bean> </beans>

Bean标签的作用

配置JavaBean对象

属性

id: Bean的唯一标识名称
class: 类的全限定名称
scope: 设置Bean的作用范围
singleton: 单例(默认值)
prototype: 多例
request: web项目中,将对象存入request域中
session: web项目中,将对象存入session域中
globalsession: web项目中,应用在集群环境,如果没有集群环境,相当于session
init-method: 指定类中初始化方法的名称:,在构造方法执行完毕后立即执行
destroy-method: 指定类中销毁方法名称,在销毁Spring容器前执行

作用范围和生命周期

单例对象: 一个应用中只有一个对象实例
出生: 加载配置文件,容器创建,对象出生
或者: 只要容器存在,对象一直活着
死亡: 容器销毁,对象死亡 多例对象: 在一次使用过程中
出生: 第一次获取对象,对象出生
或者: 在一次使用过程中,对象活着
死亡: 当对象不再使用或者没被引用,交由垃圾回收器回收

Controller获取bean对象

package XXXX.controller;

import com.itheima.service.CustomerService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Controller{
/**
* 使用Spring框架提供的IOC容器获取对象
* 1.Spring框架提供了一个大工厂接口:ApplicationContext
* 2.该工厂接口中提供了一个getBean()方法,用于根据bean的名称获取bean
* 3.该工厂接口提供了常见的实现类:
* 3.1 ClassPathXmlApplicationContext: 从类路径下加载bean.xml配置文件,创建Spring的IOC容器
* 3.2 FileSystemXmlApplicationContext: 从文件系统路径下加载bean.xml配置文件,创建Spring的IOC容器
*/
public static void main(String[] args){
// 1.加载Spring配置文件,创建Spring IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); // 2.从容器中获取客户service对象
Service service = (Service)context.getBean("service"); // 3.调用Service中的方法
service.method();
}
}

Spring工厂类结构

BeanFactory与ApplicationContext区别

1. beanFactory是顶层接口
2. ApplicationContext是子接口
3. 它们最大的区别是创建对象的时间不一样
- BeanFactory采用的是延迟加载思想(什么时候使用对象,什么时候创建)
- ApplicationContext采用立即创建思想(一加载配置文件,立即创建)

Spring实例化Bean

方式一

<!-- 无参构造方法实例化 -->
<bean id="dao" class="XXXX.dao.impl.daoImpl" scope="singleton" init-method="init" destroy-method="destroy"></bean>

方式二

/**
* 使用静态工厂方法实例化
*/
public class StaticFactoryBean{
/**
* 注意该方法为静态方法
*/
public static Dao createDao(){
return new daoImpl();
}
}
<!--
静态工厂方法实例化对象
id: 唯一标识名称
class: 类全路径
factory-method: 指定工厂方法
-->
<bean id="staticDao" class="XXXX.factory.StaticFactoryBean" factory-method="createDao"></bean>

方式三

/**
* 使用实例工厂方法实例化
*/
public class InstanceFactoryBean{
/**
* 注意该方法为普通方法
*/
public Dao createDao(){
return new daoImpl();
}
}
<!--
实例工厂方法实例化对象
配置静态工厂对象
factory-bean: 指定工厂对象
facotry-method: 指定工厂方法
-->
<bean id="instanceFactory" class="XXXX.factory.InstanceFactoryBean"></bean>
<bean id="instanceDao" factory-bean="instaceFactory" factory-method="createDao"></bean>

Spring依赖注入

依赖注入(Dependency Injection),他是Spring框架核心IOC的具体实现,用于维护应用程序中,层与层之间,对象与对象之间的关系(依赖注入就是给类的成员变量赋值)

依赖输入的两种方式

构造方法注入

<!--
构造方法注入(通过构造方法,给类的成员变量赋值)
标签
constructor-arg: 指定通过构造方法给成员变量赋值
属性
index: 成员变量在构造方法参数列表中的索引
name: 成员变量的名称(与index使用一个即可)
type: 成员变量的类型(默认即可)
value: 给Java简单类型成员变量赋值(八种基本类型+String)
ref: 给其他Bean类型成员变量赋值
-->
<bean id="constructDao" class="XXXX.dao.impl.ConstructorDaoImpl">
<constructor-arg index="0" name="id" type="int" value="1"/>
<constructor-arg name="name" value="姓名"/>
<constructor-arg name="newDate" ref="now"/>
</bean>
<!-- ref: now -->
<bean id="now" class="java.util.Date"></bean>

c名称空间注入

<!--
c名称空间注入
导入c名称空间: xmlns:c="http://www.springframework.org/schema/c"
c:属性名称 ==> 给Java简单类型成员变量赋值
c:属性名称-ref ==> 给其他Bean类型成员变量赋值
-->
<bean id="cDao" class="XXXX.dao.impl.ConstructorDaoImpl" c:id="4" c:name="姓名" c:newDate-ref="now"></bean>

Set方法注入

<!--
set方法注入数据
标签
property: 指定通过set方法,给类的成员变量赋值
属性
name: 指定成员变量名称
value: 给Java简单类型成员变量赋值(八种基本类型+String)
ref: 给其他Bean类型成员变量赋值
-->
<bean id="setDao" class="XXXX.dao.impl.SetDaoImpl">
<property name="id" value="2"/>
<property name="name" value="姓名"/>
<property name="newDate" ref="now"/>
</bean>

p名称空间注入

<!--
p名称空间注入
导入p名称空间: xmlns:p="http://www.springframework.org/schema/p"
p:属性名称 ==> 给Java简单类型成员变量赋值
p:属性名称-ref ==> 给其他Bean类型成员变量赋值
-->
<bean id="pDao" class="XXXX.dao.impl.SetDaoImpl" p:id="3" p:name="姓名" p:newDate-ref="now"></bean>

集合属性注入

<!--
集合属性注入
List结构: array/list/set
Map结构: map/prop
数据结构一致,标签可以互换
-->
<bean id="collectionDao" class="XXXX.dao.impl.CollectionDaoImpl">
<!-- array -->
<property name="array">
<array>
<value>array</value>
</array>
</property>
<!-- list -->
<property name="list">
<list>
<value>list</value>
</list>
</property>
<!-- set -->
<property name="set">
<set>
<value>set</value>
</set>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="map-k" value="map-v"/>
</map>
</property>
<!-- prop -->
<property name="prop">
<props>
<entry key="prop-k">prop-v</entry>
</props>
</property>
</bean>

Spring基于注解配置IOC

常用注解

@Component

作用: 配置JavaBean对象,相当于xml配置方式中的Bean标签
属性: value(给Bean一个唯一标识名称)
细节: value属性可以省略,默认使用类的名称首字母小写作为Bean的名称 由@Component验货的三个注解
@Controller: 一般用于表现层
@Service: 一般用于业务层
@Repository: 一般用于持久层

@Scope

作用: 设置Bean的作用范围,相当于xml配置中Bean标签的scope属性
属性: value(指定作用范围取值)
属性取值
singleton: 单例(默认值)
prototype: 多例
request:web项目中,把bean对象存入request域中
session:web项目中,把bean对象存入session域中
globalsession:web项目中,把bean对象存入全局session域中

@Autowired

作用: 默认按照Bean的类型注入数据
属性: required(指定目标Bean是否必须存在于Spring的IOC容器,true为必须存在(默认值),false为不存在)
细节: 在Spring容器中,如果同一个类型存在多个Bean实例对象,则先按照Bean的类型进行注入,再按照Bean的名称进行匹配,匹配上注入成功,匹配不上注入失败

@Qualifier

作用: 与@Autowired注解一起使用,指定在按照Bean类型注入的基础上,再按照Bean的名称注入
属性: value(指定Bean的名称)
细节
1. 在类的成员变量上,不能单独属于,需要与@Autowired注解一起使用
2. 在方法的成员变量上,可以单独使用

@Resource

作用: 默认按照Bean的名称注入数据
属性
name: 指定Bean的名称注入数据
type: 指定Bean的类型注入数据
细节: 默认按照Bean的名称注入数据,如果注入失败,再按照Bean的类型注入

@Value

作用: 给Java简单类型成员变量注入数据

与Bean生命周期相关的注解

@PostConstruct

初始化操作,相当于xml配置方式中Bean标签的init-method属性

@PreDestroy

销毁操作,相当于xml配置方式中Bean标签的destroy-method属性

初识SpringIOC的更多相关文章

  1. 1.springIOC初识

    IOC,控制反转,从最浅显的角度来讲就是通过Spring容器来负责创建对象 大体的实现结构 1.首先有一个我们需要运行的类 2.在spring专属的xml配置文件中配置该类 3.启动容器 4.从该容器 ...

  2. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  3. 深入理解Spring--动手实现一个简单的SpringIOC容器

    接触Spring快半年了,前段时间刚用Spring4+S2H4做完了自己的毕设,但是很明显感觉对Spring尤其是IOC容器的实现原理理解的不到位,说白了,就是仅仅停留在会用的阶段,有一颗想读源码的心 ...

  4. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  5. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  6. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  7. UI篇(初识君面)

    我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...

  8. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  9. 初识SpringMvc

    初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...

随机推荐

  1. 统计学中比较重要的分布及python中使用方法

    比较重要的四种分布:正态分布.卡方分布.F分布.t分布 卡方分布概率密度曲线 t分布概率密度曲线 F分布概率密度曲线 参考资料: 统计学中四个概率分布 重要抽样分布

  2. zabbix数据库占用磁盘空间较大的处理方法

    du -h /* |sort -nr  使用此命令一步步排查发现/var/lib/mysql/zabbix/这个目录占用磁盘空间较大 发现history_log.ibd这个文件最大,达到了38G,此文 ...

  3. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-2

    1 MATLAB并行计算-从个人桌面到远程集群和云(陈伟/魏奋)视频摘录笔记 https://cn.mathworks.com/videos/parallel-computing-with-matla ...

  4. Q_Go1

    Go语言的特点及优势 一.Go语言设计初衷(为什么设计Go语言?) 1.1.设计Go源是为了解决当时Google开发遇到的困难: 大量的C++代码,同时有引入了Java和Python 成千上万的工程师 ...

  5. Java--面向对象三大特征-->封装、继承、多态

    简介 在面向过程当中只有存在封装(对功能的封装 例如c语言中的函数),而在面向对象中才存在这三大特性. 继承 -->inheritance 1.子类可以从父类继承属性和方法(除去父类私有化的方法 ...

  6. javascript正则表达式和php匹配 获取文章的 图片集

    1.脚本javascript: var str="<a href='05.html'><img src='img/4.jpg' alt='单击查看下一张' />< ...

  7. [LC] 150. Evaluate Reverse Polish Notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  8. servlet简单概括总结

    最近在看java web的相关内容,不管是整体还是细节,要学习的知识有很多,所以有一个好的学习体系非常重要.在阅读学习一些博客和教程中关于servlet的内容后,现将知识体系和自己的总结体会进行梳理, ...

  9. 赫夫曼解码(day17)

    思路: 传入map(字节与对应字节出现的次数)和最后生成的要传送的字节.将他们先转换成对应的二进制字节,再转换成原来的字符串. 代码: 12345678910111213141516171819202 ...

  10. java的自增和自减

    class Untitled { public static void main(String[] args) { int a = 3; int b = a++; //a先赋值给b,然后a再自己加1 ...