IOC与DI(xml 配置)
Spring可以帮助我们管理软件开发过程中的对象,以及如何创建和维护对象之间的关系。 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,可以将组建的耦合度降至最低,即实现解耦,便于系统以后的维护和升级。
1.spring 开发
eclipse开发工具
maven搭建项目-添加spring-context依赖包
引入applicationContext.xml配置文件
2.IOC (Inversion of Control) :控制反转,通过容器来控制对象的创建及维护,对象中成员变量的创建及维护。反转就是将对象的控制权转移给容器处理,目的是获得更好的扩展性和可维护性。
3.Spring Core Container(即Spring核心容器)——Spring框架的核心
4.Spring管理Bean的原理
Spring的核心容器可以管理任何java类,容器可以初始化该类,并返回该类的实例。
xml配置方式:
<!-- spring中进行控制反转的标记
通过配置bean 可以指定某个class由spring来管理
spring在读取主配置文件的时候会将当前标记读取,并且根据当前标记的class
的值,通过反射来创建该bean的对象 id是用来给某个创建的对象设置一个唯一
标识
lazy-init:懒加载设置 默认为立即加载,即值为false
设置成true,会在用到该bean的时候才创建该bean的对象
-->
测试:
添加Junit依赖包
新建Javabean类(完整的),添加init、destroy方法(略。。。)
配置xml文件:
<bean id="animal" class="com.rong.entity.Animal" lazy-init="false" init-method="init" destroy-method="destroy"></bean>
方法测试:
public class MyTest {
//ApplicationContext context=null;
ClassPathXmlApplicationContext context=null;
@Before
public void before(){
context=new ClassPathXmlApplicationContext("application.xml");
}
//测试destroy需要关闭容器,关闭容器的时候会自动销毁容器中的对象
@Test
public void test1(){
Animal animal = context.getBean("animal", Animal.class);
System.out.println(animal);
context.close();//容器关闭,对象销毁 destroy调用只在单例模式下有效 (默认单例)
}
}
单例与多例
<!--
bean的作用域
scope:默认是单例singleton
pototype 表示多实例 每次getBean都会创建一个新的对象
-->
<bean name="animal1" class="com.rong.entity.Animal" scope="prototype"></bean>
@Test
public void test2(){
//修改了作用域后,每次getBean都会创建一个对象
Animal animal1 = context.getBean("animal1", Animal.class);
Animal animal2 = context.getBean("animal1", Animal.class);
}
5.Bean对象的实例化
A.用构造器来实例化
如果不指定调用哪个构造器,spring默认会调用无参构造方法。
例:<bean name="animal1" class="com.rong.entity.Animal" scope="prototype"></bean>
<!--
constructor-arg:设置构造方法注入,通过该标签来设置构造方法中 的 index的位置上的参数,
赋于value属性的值
index:构造方法中的参数的索引位置,从0开始计算
value:设置属性值,只有String和基本数据类型可以直接用value指定值
ref:如果需要引用其他的bean作为属性值,用ref(用其他bean的id或name)
type:设置当前参数的类型,可以省略
-->
<bean id="animal" class="com.rong.entity.Animal" lazy-init="false" init-method="init" destroy-method="destroy">
<constructor-arg index="0" type="java.lang.String" value="小花"></constructor-arg>
<constructor-arg index="1" value="18"></constructor-arg>
</bean>
B.使用静态工厂实例化
类中声明静态工厂方法
public Animal() {
super();
System.out.println("无参Animal");
}
public static Animal getInstance(){
System.out.println("静态工厂创建实例");
return new Animal();
}
<!--
factory-method:使用对象静态工厂的方式创建对象
-->
<bean id="animal2" class="com.rong.entity.Animal" factory-method="getInstance"></bean>
C.使用实例工厂实例化
<!-- 通过对象工厂创建对象
1.创建工厂对象
2.设置bean使用工厂对象的方法来创建
-->
public class AnimalFactory {
public Animal getInstance(){
System.out.println("工厂方法调用");
return new Animal();
}
}
<bean id="animalFactory" class="com.rong.entity.AnimalFactory"></bean>
<bean id="animal3" class="com.rong.entity.Animal" factory-bean="animalFactory" factory-method="getInstance"></bean>
@Test
public void test4(){
Animal animal = context.getBean("animal3", Animal.class);
System.out.println(animal);
}
D.延时实例化——lazy-init
6.依赖注入(DI全称是Dependency Injection)
<!-- DI 依赖注入配置 即通过spring去做 构造方法或set方法给属性赋值工作 -->
A.构造方法注入(示例如上)
B.set方法注入
1)类中提供set方法
2)在spring主配置文件中通过property属性来设置(value和ref属性不能同时使用)
<!-- setter注入
property :调用setter方法设置属性值
name:设置哪个属性赋值
value:给该属性赋予什么值
ref : 给引用类型属性赋值
-->
<bean id="animal3" class="com.rong.entity.Animal" factory-bean="animalFactory" factory-method="getInstance">
<property name="age" value="60"></property>
<property name="type" value="www"></property>
</bean>
C.自动装配的方式
<!-- 自动装配 ,一般结合依赖注入使用 -->
<!--
autowire:使用自动装配的方式,给当前bean的属性赋值
byType:spring自动检索容器中有哪些bean,并且找到符合当前bean的属性的类型的bean出来,如果找到了
则自动给该属性赋值
byName:spring自动根据当前bean的属性的名称,从容器中查找与该属性名一致的bean,注入到该属性上
--> <!-- <bean id="favourite" class="com.web.entity.Favourite">
<property name="sport" value="游泳"></property>
</bean> -->
<bean id="favourite2" class="com.web.entity.Favourite">
<property name="sport" value="打篮球"></property>
</bean>
<!-- <bean id="myAnimal" class="com.web.entity.Animal" autowire="byName"></bean> -->
<bean id="myAnimal2" class="com.web.entity.Animal" autowire="byType"></bean>
list、set、map、property的注入方式
package com.web.entity; import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set; public class MyBean {
private List<String> cities;
private Set<String> names;
private Map<String,Integer> map;
private Properties props;
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public Set<String> getNames() {
return names;
}
public void setNames(Set<String> names) {
this.names = names;
}
public Map<String, Integer> getMap() {
return map;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public Properties getProps() {
return props;
}
public void setProps(Properties props) {
this.props = props;
} public void show(){
System.out.println("list==========");
for (String string : cities) {
System.out.println(string);
}
System.out.println("set==========");
for (String name : names) {
System.out.println(name);
}
System.out.println("map==========");
Set<Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Entry<String, Integer>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+":"+value);
}
System.out.println("property==========");
Set<Object> Set = props.keySet();
for (Object object : Set) {
String key=(String)object;
String value = props.getProperty(key);
System.out.println(key+":"+value);
} } }
<bean id="myBean" class="com.web.entity.MyBean">
<property name="cities">
<list>
<value>北京</value>
<value>上海</value>
<value>广州</value>
<value>深圳</value>
</list>
</property>
<property name="names">
<set>
<value>胡歌</value>
<value>杨幂</value>
<value>霍建华</value>
<value>叶剑英</value>
</set>
</property>
<property name="map">
<map>
<entry>
<key>
<value>Java</value>
</key>
<value>100</value>
</entry>
<entry>
<key>
<value>C++</value>
</key>
<value>98</value>
</entry>
<entry>
<key>
<value>Android</value>
</key>
<value>96</value>
</entry>
</map>
</property>
<!-- ref引用方式 -->
<!-- <property name="props" ref="dbProps"> </property> -->
<!-- 直接赋值方式 -->
<property name="props">
<props>
<prop key="username">#{dbProps.username}</prop>
<prop key="password">#{dbProps.password}</prop>
<prop key="driver">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
<!-- 读取配置文件转成Properties对象
id:唯一标识
location:从哪里读取文件
classpath: 通过类路径开始读取
-->
<util:properties id="dbProps" location="classpath:db.properties"></util:properties>
url=jdbc:mysql://localhost:3306/utf8?useUnicode=true&characterEncoding=utf-8
username=root
password=123123
driver=com.mysql.jdbc.Driver
IOC与DI(xml 配置)的更多相关文章
- Spring 简单使用IoC与DI——XML配置
目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...
- Spring框架(2)---IOC装配Bean(xml配置方式)
IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...
- spring IOC注解与xml配置
转载自:https://blog.csdn.net/u014292162/article/details/52277756 IOC 1小案例 将对象的依赖交给配置文件来配置(配置文件的名字是可以任意的 ...
- Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域
Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...
- Spring详解(四)------注解配置IOC、DI
Annotation(注解)是JDK1.5及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的. 前面讲解 IOC 和 DI 都是通过 ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- JavaEE中的MVC(二)Xml配置实现IOC控制反转
毕竟我的经验有限,这篇文章要是有什么谬误,欢迎留言并指出,我们可以一起讨论讨论. 我要讲的是IOC控制反转,然后我要拿它做一件什么事?两个字:"解耦",形象点就是:表明当前类中需要 ...
- springmvc web.xml配置之 -- SpringMVC IOC容器初始化
SpringMVC IOC容器初始化 首先强调一下SpringMVC IOC容器初始化有些特别,在SpringMVC中除了生成一个全局的spring Ioc容器外,还会为DispatcherServl ...
- Spring Ioc容器xml配置
Spring Ioc容器xml配置基本结构: <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
随机推荐
- Qt界面编程基本操作
Qt界面编程基本操作 了解基本代码构成 类widget的头文件widget.h如下: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> ...
- HTML学习笔记--元素
1. 开始标签称为起始标签,结束标签称为闭合标签 openging tag closing tag HTML 元素以开始标签起始 HTML 元素以结束标签终止 元素的内容是开始标签与结束标签之间的内容 ...
- 【转载】值得推荐的C/C++框架和库
原文:值得推荐的C/C++框架和库 值得学习的C语言开源项目 Libevent libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施.其以高效出名,它可以将IO事件,定时 ...
- day1 ORM
ORM对象关系映射 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 class Customer( ...
- OpenStack入门篇(八)之镜像服务Glance
一.Glance的概述 Glance是为虚拟机的创建提供镜像的服务,我们基于Openstack是构建基本的IaaS平台对外提供虚拟机,而虚拟机在创建时必须为选择需要安装的操作系统,Glance服务就是 ...
- Maven学习(十)-----使用Maven创建Java项目
所需要的工具: Maven 3.3.3 Eclipse 4.2 JDK 8 注意:请确保 Maven 是正确安装和配置(在Windows,*nix,Mac OSX系统中),然后再开始本教程,避免 mv ...
- NTP(Network Time Protocol)
Linux NTP配置详解 (Network Time Protocol) http://www.ntp.org/ Meinberg NTP packages provide a GUI instal ...
- DataGridView滚动慢的解决方法
当DataGridView达到一定大小的时候,拖动滚动条就会非常慢,出现让人难以忍受的闪动. 即便只有100行,每行30列. 解决方法是启用DataGridView的双缓冲. 1 2 3 4 5 6 ...
- The specified value "2019-1-2" does not conform to the required format, "yyyy-MM-dd"
问题: 在cshtml中转换的日期格式错误,前端报错:The specified value "2019-1-2" does not conform to the required ...
- DataRow的RowState属性变化
DataRow的RowState属性(状态)取值有5种:Detached, Unchanged, Added, Deleted, Modified. 当我们用DataRow newRow = Data ...