1.什么是框架?

框架是一种重复使用的解决方案,针对某个软件开发的问题提出的。

Spring框架,它是一个大型的包含很多重复使用的某个领域的解决方案。

Spring的理念:不要重复发明轮子。

2.Spring的理解?

首先,Spring是一个容器。它是装对象的。主要就是通过搜索class的路径。找出bean对象,实际就是根据反射来获取这个bean对象的:

Class<?> classit=Class.forName("com.jinglin.model.Person");
Person p =(Person)classit.newInstance();

3.IOC的理解?

控制反转的容器。

把对象的获取的主动权交出去

4.DI:

依赖注入,通过在构建bean对象的时候,把数据加入到对象中,所谓的依赖的意思就是这里的数据有可能是通过其它的bean对象得到的。

5.对于Spring中的bean的注入方式

1)set方式注入,注入数据的前提是必须要有一个set方法,在bean的类里。是通过属性的注入方式:

java类:

public class Boy {
public String name;
public Girl girlfriend;
public List<String> habbies;
public Map<String,Float> subject;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Girl getGirlfriend() {
return girlfriend;
}
public void setGirlfriend(Girl girlfriend) {
this.girlfriend = girlfriend;
}
public List<String> getHabbies() {
return habbies;
}
public void setHabbies(List<String> habbies) {
this.habbies = habbies;
}
public Map<String, Float> getSubject() {
return subject;
}
public void setSubject(Map<String, Float> subject) {
this.subject = subject;
} }
public class Girl {
public String name;
public Boy boyfriend;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boy getBoyfriend() {
return boyfriend;
}
public void setBoyfriend(Boy boyfriend) {
this.boyfriend = boyfriend;
} }

配置文件:

<!-- 把所有的类都生成bean对象,scope默认作用域是共享模式(prototype为非共享模式,生成的对象的地址不一样 )-->
<bean id="boy" class="com.jinglin.model.Boy">
<!-- 属性注入值 -->
<property name="name" value="zhangsan"></property>
<!-- 关联到另外一个bean对象 -->
<property name="girlfriend" ref="girl"></property>
<!-- 集合属性注入 -->
<property name="habbies">
<!--注入的list的集合值 -->
<list>
<value>网球</value>
<value>乒乓球</value>
<value>网游</value>
</list>
</property>
<!-- 键值对的集合的数据注入 -->
<property name="subject">
<!-- 给map这种集合数据类型注入 -->
<map>
<entry>
<!-- 表示键 -->
<key><value>英语</value></key>
<!-- 表示值 -->
<value>98</value>
</entry>
<entry>
<key><value>数学</value></key>
<value>99</value>
</entry>
</map>
</property>
</bean>
<bean id="girl" class="com.jinglin.model.Girl">
<!-- 属性注入值 -->
<property name="name" value="lily"></property>
<!-- 关联到另外一个bean对象 -->
<property name="boyfriend" ref="boy"></property>
</bean>

2)构造函数的注入,初始化对象的时候通过构造函数传入数据:

有参构造:

public Person(String name, String age) {
this.name = name;
this.age = age;
}

配置文件:

<!-- bean相当于是一个装对象的容器 -->
<bean id="person" class="com.jinglin.model.Person">
<!--通过构造参数的方式注入值 -->
<constructor-arg value="zhangsan"></constructor-arg>
<constructor-arg value="14"></constructor-arg>
</bean>

6.那么由spring给我们提供的bean对象的作用域?

1)默认情况下,spring提供的bean对象是共享模式的。

在内存中只出现一个实例化对象。

默认的bean的作用域:scope="singleton"

2)如果更改bean的作用域,就是非共享模式,

scope="prototype"

7.自动装配+注解,简化spring中的bean对象的开发。

Spring中的bean对象自动从容器里搜索和自己的属性字段名一致的情况,如果有,就自动匹配。

开发步骤,首先明确,要将所有的包扫描的spring容器里。

1)在applicationContext.xml里做spring的beans的声明。

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

2)将各个包扫描到spring里。

<!-- 将包扫描到spring组件里 -->
<context:component-scan base-package="com.jinglin.dao">
</context:component-scan>
<context:component-scan base-package="com.jinglin.service">
</context:component-scan>

3)给每个类加入注解,告诉spring。将其加入到spring的容器里。

@Component("goodsInfoDao")
public class GoodsInfoDao {
public void insertitem(){
System.out.println("这是商品信息的数据插入");
}
}

4)为了简化配置,采取的自动装配。一般都是通过名字自动装配的:

在配置头文件末尾加上

default-autowire="byName"

5)在开发的时候,对于同spring中相同的bean的id,那么采取自动装配:

@Component("userInfoService")
public class UserInfoService { @Autowired
private UserInfoDao userInfoDao; public void additem(){
System.out.println("这是用户调用的业务层");
userInfoDao.insertitem();
}
}

8.Spring的延迟加载,当我们需要这个spring提供的bean对象的时候,这个时候spring才会去生成这个对象(默认情况下,当spring加载它的文件的时候,就全部将spring里配置的bean对象生成)。

1)在applicationContext配置头文件末尾加上

default-lazy-init="true"

缺点:无法对单个的bean对象提供延迟加载配置。

2)针对单个的bean对象:

<bean id="person" lazy-init="true"  class="com.jinglin.model.Person">
<!-- 通过构造参数的方式注入值 -->
<constructor-arg value="zhangsan"></constructor-arg>
<constructor-arg value="14"></constructor-arg>
</bean>

3)直接在类中加注解,表示就是延迟加载。

@Component("goodsInfoService")
@Lazy
public class GoodsInfoService {
@Autowired
private GoodsInfoDao goodsInfoDao;
public void additem(){
System.out.println("这是商品信息的业务处理方法");
goodsInfoDao.insertitem();
} public GoodsInfoService(){
System.out.println("这是goodsInfoService的无参构造函数");
} }

default-lazy-init="true"

Spring框架IOC,DI概念理解的更多相关文章

  1. Spring框架-IOC/DI详细学习

    一.IOC/DI概念 参考博客:https://www.cnblogs.com/xdp-gacl/p/4249939.html IOC(inversion of control, 控制反转)是一种设计 ...

  2. Spring框架——IOC&DI

    Spring Spring 目标 内容 Spring与web整合的原理 Spring 中包含的关键特性 Spring架构图 企业级框架 企业级系统 IOCDI IOC DI IOC和DI 为什么使用依 ...

  3. Spring框架IOC容器和AOP解析 非常 有用

    Spring框架IOC容器和AOP解析   主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面 ...

  4. 6. Laravel5学习笔记:IOC/DI的理解

    介绍 IOC 控制反转 Inversion of Control 依赖关系的转移 依赖抽象而非实践 DI 依赖注入 Dependency Injection 不必自己在代码中维护对象的依赖 容器自己主 ...

  5. 自己动手写Spring框架--IOC、MVC

    对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...

  6. 关于对DI和IOC的概念理解

    在spring框架学习过程中,涉及到两个新名词:DI和IOC.开始总是混淆两者的概念,稀里糊涂,后来上网搜了一下又和同学讨论之后,基本上理解了二者的概念.实际上DI(依赖注入)和IOC(控制反转)就是 ...

  7. Spring系列(二):Spring IoC/DI的理解

    这几天重新学习了一下Spring,在网上找了相关的ppt来看,当看到Spring IoC这一章节的时候,先大致浏览了一下内容,有将近50页的内容,内心窃喜~QAQ~,看完这些内容能够对IoC有更深层次 ...

  8. Spring.Net---3、IoC/DI深入理解

    ------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...

  9. spring Ioc/DI的理解

    学习spring的童鞋都知道,spring中有两个非常重要的点,Ioc(控制反转)与DI(依赖注入),对于初级玩家来说,这两个概念可能有点模棱两可的感觉,今天就谈下自己的一点理解,不足请多多指教!!! ...

随机推荐

  1. Android-Bluetooth Low Energy(BLE)

    Android Bluetooth Low Energy Android 低功耗蓝牙简介 2016-4-18 Android4.3(API 18)介绍了平台支持的低功耗蓝牙,app可用于发现设备,检索 ...

  2. 玩玩微信公众号Java版之一:配置微信公众平台服务器信息

    在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦!   第一.准备好服务端接口   定义一个http服务接口,主要分为如下几步:   1.创建一个servlet类,用来接收请求: ...

  3. __main() 和 main() 【转】

    因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置,可 ...

  4. hdu_1907:John(Nim变形)

    题目链接 仍是取石子,不过取到最后一个的败 参考链接:http://www.voidcn.com/blog/liwen_7/article/p-3341825.html 简单一句话就是T2 S0必败 ...

  5. Linux 如何显示一个文件的某几行

    1. 从第1000行开始,显示2000行.即显示1000~2999行 cat input_file | tail -n +1000 | head -n 2000 2. 显示 1000行到3000行 c ...

  6. Serv-u Mysql数据库用户

    Serv-u 关联Mysql数据库用户需要用到ODBC数据源,windows不自带支持MySQL.所以要网上下载自己安装 官网下载地址:http://dev.mysql.com/downloads/c ...

  7. (转)Spring 的 init-method 和 destory-method

    背景:今天在项目中看到spring中bean在初始化和注销时候的方法定义,之前没有用过这种方式,在此记录下,方便后期查看! 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: ...

  8. Excel Countif函数用法

    公式:=COUNTIF(范围,条件) 例1: 统计A1:A11当中,等于数字3的单元格,结果是4个. 例2:还可以进行大于(>),大于等于(>=),小于(<),小于等于(<=) ...

  9. VM虚拟机中安装Linux操作系统

    本文操作步骤,笔者已实验成功 (前提:正确安装VM并激活) 1,点击新建虚拟机,在页面上选择"自定义",点击下一步 2,进入选择虚拟机硬件兼容页面,这里一般不用操作,直接点击下一步 ...

  10. python教程6-2:字符串标识符

    标识符合法性检查. 1.字母或者下划线开始. 2.后面是字母.下划线或者数字. 3.检查长度大于等于1. 4.可以识别关键字. python35 idcheck.py  idcheck.py impo ...