---恢复内容开始---

IOC :控制反转 (DI:依赖注入)
使用ioc模式开发 实体类必须有无参构造方法
1.搭建Spring环境
下载jar
http://maven.springframework.org/release/org/springframework/spring/
spring-framework-4.3.9.RELEASE-dist.zip
开发spring至少需要使用的jar(5个+1个):
spring-aop.jar        开发AOP特性时需要的JAR
spring-beans.jar    处理Bean的jar            <bean>
spring-context.jar    处理spring上下文的jar        <context>
spring-core.jar        spring核心jar
spring-expression.jar    spring表达式
三方提供的日志jar
commons-logging.jar    日志

2.编写配置文件

为了编写时有一些提示、自动生成一些配置信息:
方式一:增加sts插件
可以给eclipse增加 支持spring的插件:spring tool suite(https://spring.io/tools/sts/all)
下载springsource-tool-suite-3.9.4.RELEASE-e4.7.3a-updatesite.zip,然后在Eclipse中安装:Help-Install new SoftWare.. - Add

方式二:
    直接下载sts工具(相当于一个集合了Spring tool suite的Eclipse): https://spring.io/tools/sts/

新建:bean configuration .. - applicationContext.xml

3.开发Spring程序(IOC)

ApplicationContext conext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
        //执行从springIOC容器中获取一个 id为student的对象
        Student student = (Student)conext.getBean("student") ;
可以发现,springioc容器 帮我们new了对象,并且给对象赋了值

SpringIOC发展史:
1.
Student student = new Student();
student.setXxx();

2.
简单工厂

3.ioc (超级工厂)

IOC(控制反转)也可以称之为DI(依赖注入):
控制反转:将 创建对象、属性值 的方式 进行了翻转,从new、setXxx()  翻转为了 从springIOC容器getBean()
依赖注入:将属性值 注入给了属性,将属性 注入给了bean,将bean注入给了ioc容器;

总结:ioc/di ,无论要什么对象,都可以直接去springioc容器中获取,而不需要自己操作(new\setXxx())

因此之后的ioc分为2步:1 先给springioc中存放对象并赋值   2 拿

DI:依赖注入 ,
Teacher

Course  : cname  teacher

IOC容器赋值:如果是简单类型(8个基本+String),value;
    如果是对象类型,ref="需要引用的id值",因此实现了 对象与对象之间的依赖关系

conext.getBean(需要获取的bean的id值)

依赖注入3种方式:
1.set注入:通过setXxx()赋值

赋值,默认使用的是 set方法();
依赖注入底层是通过反射实现的。
<property...>

2.构造器注入:通过构造方法赋值
 <constructor-arg value="ls" type="String" index="0" name="name"></constructor-arg>
需要注意:如果  <constructor-arg>的顺序 与构造方法参数的顺序不一致,则需要通过type或者index或name指定。

3.p命名空间注入
引入p命名空间
    xmlns:p="http://www.springframework.org/schema/p"

<bean id="course" class="org.lanqiao.entity.Course" p:courseHour="300" p:courseName="hadoop" p:teacher-ref="teacher">

简单类型:
    p:属性名="属性值"
引用类型(除了String外):
    p:属性名-ref="引用的id"
注意多个 p赋值的时候 要有空格。

注意:
无论是String还是Int/short/long,在赋值时都是 value="值" ,
因此建议 此种情况 需要配合 name\type进行区分

示例:
    注入各种集合数据类型: List  Set map properties

   <!--注入集合-->

         <bean id="all_list" class="org.hxzy.spring.pojo.All_list_demo">
<!--List 赋值操作-->
<property name="list_demo" >
<list>
<value>zs</value>
<value>ls</value>
</list>
</property>
<!--Map 赋值操作-->
<property name="map_demo">
<map>
<entry>
<key>
<value>cy</value>
</key>
<value>男</value>
</entry>
</map>
</property>
<!--数组赋值-->
<property name="arr_demo">
<array>
<value>小皮球</value>
<value>香蕉梨</value>
</array>
</property>
<!--Set集合赋值-->
<property name="set_demo">
<set>
<value>gubin</value>
<value>hnb</value>
</set>
</property>
</bean>

其他方式赋值:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置User 实体类
<bean id="user" class="com.hxzy.entity.User" scope="prototype"/>-->
<!--静态工厂 创建
<bean id="user1" class="com.hxzy.entity.User" factory-method="getUser"/>
-->
<!--使用Set方式 注入
<bean scope="prototype" id="person" class="com.hxzy.entity.Person">
<property name="p_name" value="古斌"></property>
</bean>-->
<!--使用构造方法进行注入
<bean id="per" scope="prototype" class="com.hxzy.entity.Person">
<constructor-arg name="name" value="张全蛋"></constructor-arg>
</bean>-->
<!--注入集合--> <bean id="all_list" class="org.hxzy.spring.pojo.All_list_demo">
<!--List 赋值操作-->
<property name="list_demo" >
<list>
<value>zs</value>
<value>ls</value>
</list>
</property>
<!--Map 赋值操作-->
<property name="map_demo">
<map>
<entry>
<key>
<value>cy</value>
</key>
<value>男</value>
</entry>
</map>
</property>
<!--数组赋值-->
<property name="arr_demo">
<array>
<value>小皮球</value>
<value>香蕉梨</value>
</array>
</property>
<!--Set集合赋值-->
<property name="set_demo">
<set>
<value>gubin</value>
<value>hnb</value>
</set>
</property>
</bean>
<!--注入对象-->
<bean id="usr" class="com.hxzy.dao.Userdao">
</bean>
<bean id="Service_" class="com.hxzy.dao.User_Service">
<property name="userdao" ref="usr"></property>
</bean>
<!--使用P命名空间-->
<bean id="person" class="com.hxzy.entity.Person" p:p_name="古斌" p:p_address="石家庄" p:p_age="18" scope="prototype"></bean> </beans>

给对象类型赋值null :
        <property name="name" >  
                <null/>       -->注意 没有<value>
        </property>
赋空值 ""  
        <property name="name" >  
                <value></value>  
        </property>

在ioc中定义bean的前提:该bean的类 必须提供了 无参构造

自动装配(只适用于 ref类型 ):
    约定优于配置

自动装配:
<bean ... class="org.lanqiao.entity.Course"  autowire="byName|byType|constructor|no" >  byName本质是byId
byName:  自动寻找:其他bean的id值=该Course类的属性名
byType:  其他bean的类型(class)  是否与 该Course类的ref属性类型一致  (注意,此种方式 必须满足:当前Ioc容器中 只能有一个Bean满足条件  )
constructor: 其他bean的类型(class)  是否与 该Course类的构造方法参数 的类型一致;此种方式的本质就是byType

可以在头文件中 一次性将该ioc容器的所有bean  统一设置成自动装配:
<beans xmlns="http://www.springframework.org/schema/beans"
...
default-autowire="byName">

自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要谨慎。

使用注解定义bean:通过注解的形式 将bean以及相应的属性值 放入ioc容器

<context:component-scan base-package="org.lanqiao.dao">
</context:component-scan>Spring在启动的时候,会根据base-package在 该包中扫描所有类,查找这些类是否有注解@Component("studentDao"),如果有,则将该类 加入spring Ioc容器。

@Component细化:

dao层注解:@Repository
service层注解:@Service
控制器层注解:@Controller

---恢复内容结束---

Spring-初识Spring框架-IOC控制反转(DI依赖注入)的更多相关文章

  1. laravel服务容器(IOC控制反转,DI依赖注入),服务提供者,门脸模式

    laravel的核心思想: 服务容器: 容器:就是装东西的,laravel就是一个个的对象 放入:叫绑定 拿出:解析 使用容器的目的:这里面讲到的是IOC控制反转,主要是靠第三方来处理具体依赖关系的解 ...

  2. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  3. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

  4. Spring框架之控制反转和依赖注入

    学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明控制反转和依赖注入. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权 ...

  5. Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  6. (转)Ioc控制反转和依赖注入

    转载地址:https://zhuanlan.zhihu.com/p/95869440 控制反转控制反转(Inversion of Control,简称IoC),是面向对象编程中的一种设计思想,其作用是 ...

  7. Spring的IOC控制反转和依赖注入-重点-spring核心之一

    IoC:Inverse of Control(控制反转): 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,好比于MVC.就是将原本在程序中手动创建对象的控制权,交由S ...

  8. spring IOC --- 控制反转(依赖注入)----简单的实例

    IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的 ...

  9. 搞定.NET MVC IOC控制反转,依赖注入

    一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记! 1.首先创建MVC项目 2.然后新建 ...

  10. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

随机推荐

  1. MySQL备份恢复全实战

    一. 简介 1. 增量备份 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味着,第一次增量 备份的对象是进行全备后所产生的增加和修改的文件; ...

  2. 【转】跨DLLnew delete问题

    转两篇文章来说这个问题的 链接1:https://blog.csdn.net/notebook2001a/article/details/6647850 链接2:https://blog.csdn.n ...

  3. out.println(session.getLastAccessedTime());的返回值到底是毛线意思???

    out.println(session.getLastAccessedTime());这个语句是输出最后一次成功获取session对象Attribute值的一个指令, 他的返回值是一个long型数据, ...

  4. Python any() 函数

    Python any() 函数  Python 内置函数 描述 any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 ...

  5. Python slice() 函数

    Python slice() 函数  Python 内置函数 描述 slice() 函数实现切片对象,主要用在切片操作函数里的参数传递. 语法 slice 语法: class slice(stop) ...

  6. 在Action中获取表单提交数据

    -----------------siwuxie095 在 Action 中获取表单提交数据 1.之前的 Web 阶段是提交表单到 Servlet,在其中使用 Request 对象 的方法获取数据 2 ...

  7. Emacs及扩展配置

    Emacs及扩展配置 Table of Contents 1. 动机之反思 2. 它山之石 3. 扩展的管理 4. 我额外安装的通用扩展(在purcell基础上) 5. LaTex相关的问题和配置 6 ...

  8. sqlserver 必须声明标量变量 "***"。

    发现在navicat premium上执行报这个异常,在sqlserver上不报,想到我之前的文章用存储过程时mysql里有个分割符,去掉“:”果然执行成功. DECLARE @countlmc IN ...

  9. Qt Application Menu In Window and Mac

    Application Menu Application menu in different operator systems has different designed style. like W ...

  10. zookeeper的ZAB协议

    ZAB协议概述 ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeeper Atomic Broadcast(ZAB,zookeeper原子消息广播协议)的协议作为其数据一致 ...