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

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

 1   <!--注入集合-->
 2
 3         <bean id="all_list" class="org.hxzy.spring.pojo.All_list_demo">
 4                <!--List 赋值操作-->
 5                 <property name="list_demo" >
 6                         <list>
 7                                 <value>zs</value>
 8                                 <value>ls</value>
 9                         </list>
10                 </property>
11                 <!--Map 赋值操作-->
12                 <property name="map_demo">
13                         <map>
14                                 <entry>
15                                       <key>
16                                               <value>cy</value>
17                                       </key>
18                                         <value>男</value>
19                                 </entry>
20                         </map>
21                 </property>
22                 <!--数组赋值-->
23                 <property name="arr_demo">
24                         <array>
25                                 <value>小皮球</value>
26                                 <value>香蕉梨</value>
27                         </array>
28                 </property>
29                 <!--Set集合赋值-->
30                 <property name="set_demo">
31                         <set>
32                                 <value>gubin</value>
33                                 <value>hnb</value>
34                         </set>
35                 </property>
36         </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

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

转载于:https://www.cnblogs.com/gu-bin/p/10456647.html

Spring-初识Spring框架-IOC控制反转(DI依赖注入)相关推荐

  1. IOC控制反转(依赖注入思想)

    IOC控制反转(依赖注入思想) 获取map 类型的 request session application 的方法: 实现RequestAware,SessionAware,ApplicationAw ...

  2. java json injection_Java Web实现IOC控制反转之依赖注入

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

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

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

  4. Spring Ioc/DI 控制反转和依赖注入

    Ioc(Inversion of Control)和DI(Dependency Injection)的全称分别是控制反转和依赖注入. 如何理解这两个概念呢? Ioc Ioc(控制反转)实际上就说把对象 ...

  5. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

  6. Spring框架中的控制反转和依赖注入

    控制反转: 控制反转是用来降低代码之间的耦合度的,基本思想就是借助"第三方"实现具有依赖对象的解耦. 为什么需要控制反转,因为项目中对象或多或少存在耦合.控制反转的关键在于Ioc容 ...

  7. spring概念理解之IOC(控制反转)

    这是Spring中的有特点的一部份.IoC又被翻译成"控制反转",也不知道是谁翻译得这么别扭,感觉很深奥的词.其实,原理很简单,用一句通俗的话来说:就是用XML来定义生成的对象.I ...

  8. 轻松了解Spring中的控制反转和依赖注入

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天早上8点20分, 第一时间与你相约 每日英文 When you have something you really l ...

  9. Spring容器,控制反转,依赖注入

    Spring boot学习之旅,为更好督促自己学习以记之,仅供参考. spring容器 程序启动的时候会创建spring容器,扫描给spring容器一个清单,比如:@Controller, @Bean ...

  10. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

最新文章

  1. linux网络编程之用epoll实现io复用(基于tcp)
  2. CCNA-第十三篇-NAT-上
  3. Java高级基础--阿里云Java复习
  4. 华为ipd项目管理流程_开发一个产品,就是开发一门新的生意IPD落地直播问答精选...
  5. 小白用python处理excel文件-Python读、写Excel文件(三种模块三种方式,小白也可学会)...
  6. 【转】推荐:全面了解数据库设计中分类算法
  7. 攻击需要成本吗_光伏智能温室建设成本高吗?需要哪种钢结构?
  8. 一键安装iis php mysql环境_Windows Server服务器环境配置:一键安装IIS+PHP+MySQL环境...
  9. IE7、IE8、IE9、IE10后各版本的更新及差别
  10. vim编辑器删除空行
  11. 阿里3大营销模型:AIPL、FAST、GROW
  12. leetcode:Removenbsp;Elementnbsp;+nbsp;nbsp;Imple…
  13. 【新书推荐】【2020】电力系统优化问题的方法、算法及MATLAB程序
  14. 如何设计简单的网站Favicon图标?ICO图标制作
  15. VBox虚拟机在注册过程中可能报的错(一条龙服务) 打开虚拟文件失败、relaunching VirtualBox VM process 5 (Solved)等等
  16. CSS实现3D菜单效果【每日一题】
  17. “满五唯一”和“满二唯一”是什么?有什么不同?
  18. java cryptography_Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide...
  19. React Native微信分享
  20. 中学计算机教师薪资,中学教师

热门文章

  1. UltraISO使用和U盘安装原版系统指南
  2. 简单的Android程序多少钱,Android简单程序利息计算器
  3. 去除字符串中的重复字符,算法不使用额外缓冲。如abbc-abc
  4. Python实现元胞自动机——十字路口
  5. pdps修改服务器,Tecnomatix PDPS二次开发功能介绍
  6. 谈谈eve-ng仿真模器
  7. 作业二 20182325袁源
  8. 小猿圈python视频_小猿圈分享学习Python的最佳方式
  9. 如何用MD5加密数据库的敏感数据?
  10. 最新版项目部署到腾讯云超详细教学