SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较
1、IOC概念理解
IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖,由spring来负责控制对象的生命周期和对象间的关系。
DI(Dependency Injection)即“依赖注入”:由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
例如:你将需要寻找的理想中的对象(胸大、屁股大、年轻、有文化)交给婚姻中介来控制,而不是你主动去找去控制寻找,由中介为你寻找(过程你毫不知情),你选择是否接受中介为你匹配到的对象。这个过程中主动找理想对象的控制权从你到中介为:控制反转;中介输出给你的对象为:依赖注入;
(2)spring的两种Ioc容器
BeanFactory:
BeanFactory是基础类型IOC容器。顾名思义,就是生产Bean的工厂。能够提供完整的IOC服务。没有特殊指定的话,其默认采用延迟初始化策略。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该对象进行初始化和依赖注入操作。因此,相对来说,容器启动初期的时候速度是比较快的。所需要的资源有限。所以,对资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的IOC容器。
ApplicationContext:
• 资源访问,如URL和文件
• 事件传播
• 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的 web层
BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。
而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。在容器启动时,我们就可以发现Spring中存在的配置错误。
(3)Spring IOC 注入方式
3.1 setter注入:
<bean id="helloSpring" class="com.one.ssm.impl.HelloSpring">
<!--此处的value的注入是通过set方法-->
<property name="who" value="spring"></property>
<property name="you" value="123456789"></property>
</bean>
xml书写
代码书写:
public class HelloSpring {
//定义who属性,值通过spring框架进行设置
private String who;
private String you;
public void setYou(String you) {
this.you = you;
}
public void print(){
System.out.println("Hello:"+this.getWho()+"!"+you);
}
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
}
测试类:
@Test
public void print() throws Exception {
ApplicationContext context=new ClassPathXmlApplicationContext("classpath:spring/spring-impl.xml");
HelloSpring helloSpring= (HelloSpring) context.getBean("helloSpring");
helloSpring.print();
}
结果:Hello:spring!123456789
代码
3.2 构造器注入
<!--构造注入实例-->
<bean id="math" class="com.one.ssm.impl.structorInjectionTest.MathDemo"></bean>
<bean id="english" class="com.one.ssm.impl.structorInjectionTest.EnglishDemo"></bean>
<bean id="StudyDemo" class="com.one.ssm.impl.structorInjectionTest.StudyDemo">
<constructor-arg ref="math"/>
<constructor-arg ref="english"/>
</bean>
构造注入xml书写
代码书写:
public class EnglishDemo {
public void StudyEnglish(){
System.out.println("学习英语。。。。");
}
} public class MathDemo {
public void StudyMath(){
System.out.println("学习数学。。。。");
}
} public class StudyDemo {
private MathDemo mathDemo;
private EnglishDemo englishDemo; //无参构造方法
public StudyDemo() {
} public StudyDemo(MathDemo mathDemo, EnglishDemo englishDemo) {
this.mathDemo = mathDemo;
this.englishDemo = englishDemo;
} public void study() {
mathDemo.StudyMath();
englishDemo.StudyEnglish();
}
}
构造注入代码
备注:Spring通过JavaBean的无参构造函数实例化对象,当编写了带参的构造方法后,虚拟机不会再提供无参构造方法,为了保证使用,需要自行添加无参构造方法
3.3p命名空间注入
使用前添加声明:xmlns:p="http://www.springframework.org/schema/p"
xml写法:
<bean id="IocTest" class="com.one.ssm.impl.setterInjectionTest.IocTest"
p:zhangGa="三天不打鬼子,手都痒痒"
p:rod="世界上有2种人,认识2进制和不认识2进制的人"/>
语法:p:属性名="属性值"
引用:p:属性名-ref="bean的Id"
(4)注入过程子标签的使用
public class User {
private String string;
private List<String> list;
private Set<String> listString;
private Map<String,String> map;
子标签注入:
<bean id="user" class="com.one.ssm.impl.collectionPropertyInjection.User">
<!--list或者数组类型的属性可以用<list>标签注入-->
<property name="list">
<list>
<!--定义list数组中的元素-->
<value>足球</value>
<value>篮球</value>
</list>
</property> <property name="listString">
<!--set类型的集合属性可以用<set>-->
<set>
<value>足球</value>
<value>篮球</value>
</set>
</property> <property name="map">
<map>
<!--定义map中的键值对,如果键值对是bean对象,把value换成ref-->
<entry>
<key>
<value>football</value>
</key>
<value>足球</value>
</entry>
</map>
</property> <property name="mapString">
<!--Properties类型的属性用<props>,是简化了的 <map> 只能指定 String 类型的键和值-->
<props>
<prop key="football">足球</prop>
</props>
</property> <!--注入空字符串-->
<!--<property name="string"><value></value></property>-->
<!--注入空值-->
<property name="string"><null/></property>
</bean>
xml书写
(5)备注:
5.1 在子标签中有特殊符号需要转换为实体:
<:<
>:>
&:&
':&aops;
":"
例如:P&G应该写成: P&G 或者使用<![CDATA[]]>形式: <![CDATA[P&G]]>
例如:错误:<value>P&G</value>,正确:<value><![CDATA[P&G]]></value>或<value>P&G</value>
加载注解定义的bean组件:<context:component-scan base-package="service,dao"> 在使用注解之后,需要使用component-scan标签扫描注解标注的类,base-package指定需要扫描的基准包,多个包可以使用逗号(,)分开
5.2 使用注解实现IOC:
@Autowired:采用按照类型匹配的方式自动注入,可以省略setter方法,eg: @Autowired private UserDao dao;@Qualifier:如果有多个类型相匹配时,加入,eg: @Autowired @Qualifier("UserDao") private UserDao dao;
@Autowired:
-->对方法或者构造方法的入参就行标注
@Autowired public void setDao(@Qualifier UserDao dao){this.dao=dao}
-->对类中集合类型的成员变量进行标注
@component public class TaskQeue{@Autowired private List<Job> toDoList}:Spring会将Job类型的组件注入到toDoList
@Resource:有一个name属性值,spring解释为要注入的Bean的名称,eg:@Resource(name="userDao")private UserDao dao;
如果没有指定名称,@Resource将根据字段名或者setter方法名产生默认的名称。
5.3 spring中Bean的五个作用域:
singleton:默认值,容器中该Bean的实例只有一个
prototype:每次从容器中获取Bean时,都会创建一个新的实例,存在线程安全的组件使用
request:用于Web应用环境,针对每次HTTP请求都会创建一个实例
session:用于Web应用环境,同一个会话共享一个实例
global session:仅在porlet的Web应用中使用,同一个全局会话共享一个实例,非porlet环境,等同于session
xml配置为:
<bean id="..." class="..." scope="..."> .... </bean>
-->使用注解指定Bean的作用域
@scope("prototype")
@Service
public class UserService(){}
5.4 基于xml配置spring的自动装配
传统:
<bean id="dao" class="com.one.ssm.dao.impl.UserDaoImpl"/>
<bean id="service" class="com.one.ssm.impl.aopTest.UserServiceImpl">
<property name="userDao" ref="dao"></property></bean>
自动装配:
代替了通过property标签显示的指定Bean的依赖关系
<bean id="userMapper" class="com.one.ssm.dao.impl.UserDaoImpl"/>
<bean id="service" class="com.one.ssm.impl.aopTest.UserServiceImpl" autowire="byName"/>
备注:一般都会通过注解@Autowire来实现
以上为个人理解,仅供参考!!!
SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较的更多相关文章
- spring框架--IOC容器,依赖注入
思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action 多个 [维护成员变量] service 一个 [不需要维护公共变量] dao 一个 [不需要维护 ...
- C#中的依赖注入和IoC容器
在本文中,我们将通过用C#重构一个非常简单的代码示例来解释依赖注入和IoC容器. 简介: 依赖注入和IoC乍一看可能相当复杂,但它们非常容易学习和理解. 在本文中,我们将通过在C#中重构一个非常简单的 ...
- IOC容器的依赖注入
1.依赖注入发生的时间 当Spring IoC容器完成了Bean定义资源的定位.载入和解析注册以后,IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入 ...
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- 理解Spring(一):Spring 与 IoC
目录 什么是 Spring Spring 的整体架构 什么是 IoC Bean 的概念 Spring 的基本使用 Spring 的两种 IoC 容器 Spring 容器的基本工作原理 Spring B ...
- Spring学习(一):理解IoC容器
序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...
- Spring使用 --- 基本概念(一):DI,依赖注入
Table of Contents 什么是依赖注入 怎样使用 什么时候使用 好处 本文讲述sprint基本概念之一: DI, 即依赖注入. 什么是依赖注入 说类A依赖于类B,最简单的例子是类A有一个类 ...
- Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入
本节主要内容: 1.实例化Spring容器示例 2.利用Spring容器创建JavaBean对象 3.如何控制Bean实例化 4.利用Spring实现bean属性sett ...
- 理解PHP 依赖注入|Laravel IoC容器
看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了, ...
随机推荐
- 爬虫下载校花网美女信息-lxml
# coding=utf-8 # !/usr/bin/env python ''' author: dangxusheng desc : 下载校花网上的个人信息:名字-学校-图片地址-点赞数 date ...
- oracle储存过程学习笔记
转载至: https://www.2cto.com/database/201610/559389.htm 1.什么是oracle存储过程 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQ ...
- angular开发手机网页小记
禁用滑动事件,阻止触发浏览器翻页行为 <html lang="en" style="height:100%" ontouchmove="(f ...
- 黑苹果,Win7,Win10,Xp 各个系统镜像文件下载地址(备用)
windows Mac Xp(系统镜像下载装系统专区)百度系统世家也可 http://www.xp933.com/download/ 黑苹果系统(各种驱动型号下载专区) http://www.it36 ...
- Qt QComBox 文本框输入itemText && 文本框查找item && 本文框添加Item &&设置显示Item数量
comBox的几种状态图如下: 图1:ui->comboBox->setEditable(true); 图2:ui->comboBox->setEditable(false ...
- 对int类型的数据,如何让获取长度
下面为大家写一个列子 int a = 124;<br> Integer a1 = a;//转换为包装类Integer<br> System.out.println(a1.t ...
- 001-ADO.NET
Web.config <connectionStrings> <add name="connStr" connectionString="server= ...
- 利用RALL机制来事项String类的赋值操作
class String{ public: char *str; String(const char *ptr=NULL){ if(ptr==NULL) { str=NULL; }else{ str= ...
- mongodb细讲
一. 关系型数据库(sql) 1.建表 二.非关系型数据库(nosql 98提出的概念) 1.不用建库建表数据直接存入就可 优缺点: 关系型:节约资源(学生姓名和课程名不重复出现),开发不方便(需先 ...
- PHP 程序员危机(转载)
感谢有这样的机会,能和大家一起来聊聊开发者的那些事儿. 其实程序员危机是一个真实存在的问题.也有人说是互联网行业的下滑或者互联网行业已过了风口等等.我在这儿主要谈的是 PHP 程序员的危机,而这种危机 ...