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 配置)的更多相关文章

  1. Spring 简单使用IoC与DI——XML配置

    目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...

  2. Spring框架(2)---IOC装配Bean(xml配置方式)

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...

  3. spring IOC注解与xml配置

    转载自:https://blog.csdn.net/u014292162/article/details/52277756 IOC 1小案例 将对象的依赖交给配置文件来配置(配置文件的名字是可以任意的 ...

  4. Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域

    Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...

  5. Spring详解(四)------注解配置IOC、DI

    Annotation(注解)是JDK1.5及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的. 前面讲解 IOC 和 DI 都是通过 ...

  6. 一个由正则表达式引发的血案 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. 一些特殊字符,如“&”,“- ...

  7. JavaEE中的MVC(二)Xml配置实现IOC控制反转

    毕竟我的经验有限,这篇文章要是有什么谬误,欢迎留言并指出,我们可以一起讨论讨论. 我要讲的是IOC控制反转,然后我要拿它做一件什么事?两个字:"解耦",形象点就是:表明当前类中需要 ...

  8. springmvc web.xml配置之 -- SpringMVC IOC容器初始化

    SpringMVC IOC容器初始化 首先强调一下SpringMVC IOC容器初始化有些特别,在SpringMVC中除了生成一个全局的spring Ioc容器外,还会为DispatcherServl ...

  9. Spring Ioc容器xml配置

    Spring Ioc容器xml配置基本结构: <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

随机推荐

  1. Centos7.5搭建Hadoop2.8.5完全分布式集群部署

    一.基础环境设置 1. 准备4台客户机(VMware虚拟机) 系统版本:Centos7.5 节点配置: 192.168.208.128 --Master 192.168.208.129 --Slave ...

  2. 05.kafka提前准备工作:搭建zookeeper集群环境

    总体参考:http://www.cnblogs.com/zhangs1986/p/6564839.html 搭建之间同步下spark01.02.03的环境 复制/opt/flume这个文件夹到 spa ...

  3. hadoop生态搭建(3节点)

    软件:CentOS-7    VMware12    SSHSecureShellClient shell工具:Xshell 规划 vm网络配置 01.基础配置 02.ssh配置 03.zookeep ...

  4. bmob关联表

    var DDB_User = Bmob.Object.createWithoutData("DDB_User", "b2fd2fe68f"); // var T ...

  5. 搜索引擎的选择与在chrome上的设置

    1  优缺点分析 百度:广告多,但是电脑端可以用Adblock Plus屏蔽:搜索内容有很多百度自家内容,如百家号.百度知道.百度文库.百度贴吧等,在搜索教程的时候很实用,但是不适合偏专业性搜索,很多 ...

  6. combotree -下拉框树异步加载

    问题: 下拉树数据比较多时,全加载会产生页面延迟,需要实现异步加载 方案: 点击事件加载:先加载部分,点击节点时再展开并追加子节点 onBeforeExpand事件:在展开树前加载,感觉这种方式比较优 ...

  7. Oracle下如何用rman备份到特定的sequence

    本文为摘抄,目的为方便日后阅读: http://docs.oracle.com/cd/B12037_01/server.101/b10734/rcmbackp.htm To determine the ...

  8. tkinter界面卡死的解决办法

    0.如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死 import tkinter as tk import time def onclick(text, i): time.sleep(3) t ...

  9. 【LG3244】[HNOI2015]落忆枫音

    题面 洛谷 题解 20pts 枚举每一条边是否在树中即可. 另10pts 我们考虑一张\(DAG\)中构成树的方法数,每个点选一个父亲即可,那么有 \[Ans=\prod_{i=1}^{n} deg_ ...

  10. hive bug

    SHELL$ hive -S -e “set” | grep warehouse hive.metastore.warehouse.dir=/user/hive/warehouse hive.ware ...