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

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. How to unlock Sample HR database in oracle

    For working with tutorial of oracle Introduaction to oracle/sql you need to work on the tables which ...

  2. 每月IT摘录201806

    一.技术 1.架构师的技术升级要点:用两个字来描述:集群,用三个字:分布式,再用多点的文字:把海量的流量和数据合理分摊到数量合适的机器上. 想明白这点,后面就能知道该学哪些了,比如流量分摊时得负载均衡 ...

  3. sqlserver datetime的bug?

    sqlserver datetime 的毫秒的个位似乎存在bug,只有0.3.7这三个值,比如: 2018-01-20 23:59:59:999会变成2018-01-21 00:00:00.000 2 ...

  4. 解题报告-603. Consecutive Available Seats

    Several friends at a cinema ticket office would like to reserve consecutive available seats. Can you ...

  5. python动态捕获异常-乾颐堂

    在讨论动态捕获异常时让我大吃一惊的是,可以让我找到隐藏的Bug和乐趣... 有问题的代码 下面的代码来自一个产品中看起来是好的抽象代码 - slightly(!) .这是调用一些统计数据的函数,然后进 ...

  6. dedecms图片上传函数

    /** * 图片上传类 * @param $file上传图片信息 * @param $ty */ function upload_pic($file, $ty) { if (!is_uploaded_ ...

  7. Android 实现在Activity中操作刷新另外一个Activity数据列表

    做android项目中遇到这样一个问题:有两个acticity,一个显示好友列表,另外一个显示会话列表,现在问题是在会话界面增加一个添加好友功能,添加好友后要求实时的刷新好友列表. 想了想,找了两种方 ...

  8. web端跨域调用webapi(转)

    在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...

  9. Centos 7 手把手教你使用YUM方式安装并配置Nginx+php7-fpm+MySQL

    需要准备的内容 一台纯净系统的服务器 远程连接服务器的工具 (我这里使用Xshell) 安装nginx 链接上服务器后执行 yum install nginx  这里需要输入y 后回车,开始安装ngi ...

  10. WordPress 3.7.1-web截屏插件整合教程-Xproer.ScreenCapture

    插件下载(PHP):wordpress 3.7.1, 说明:由于许多插件可能使用相同钩子,导致冲突,所以提供手支方式整合. 1.上传插件目录. 说明:WordPress 3.7.1 使用的是TinyM ...