Spring中的IoC(2)

依赖注入(Dependency Injection)

IOC的作用:

  • 降低程序间的耦合(依赖关系)

依赖关系的管理:

  • 以后都交给spring来维护在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
  • 依赖关系的维护:就称之为依赖注入。
    依赖注入:
  • 能注入的数据:有三类
    • 基本类型和String
    • 其他bean类型(在配置文件中或者注解配置过的bean)
    • 复杂类型/集合类型

注入的方式:有三种

  • 第一种:使用构造函数提供
  • 第二种:使用set方法提供
  • 第三种:使用注解提供

方式一(使用构造函数提供注入)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- spring中的依赖注入依赖注入:Dependency InjectionIOC的作用:降低程序间的耦合(依赖关系)依赖关系的管理:以后都交给spring来维护在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明依赖关系的维护:就称之为依赖注入。依赖注入:能注入的数据:有三类基本类型和String其他bean类型(在配置文件中或者注解配置过的bean)复杂类型/集合类型注入的方式:有三种第一种:使用构造函数提供第二种:使用set方法提供第三种:使用注解提供(明天的内容)--><!--构造函数注入:使用的标签:constructor-arg标签出现的位置:bean标签的内部标签中的属性type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始name:用于指定给构造函数中指定名称的参数赋值                                        常用的=============以上三个用于指定给构造函数中哪个参数赋值===============================value:用于提供基本类型和String类型的数据ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。弊端:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。--><bean id="accountService" class="service.impl.IAccountServiceImpl"><constructor-arg name="name" value="zhugedali" ></constructor-arg><constructor-arg name="age" value="20" ></constructor-arg><!--如果我们直接用下面这总方式,系统就会报错,错误为,非法的状态异常,不同将类型从String转换为Date所以我们需要用另外的一种方法nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' torequired type 'java.util.Date': no matching editors or conversion strategy found--><!--<constructor-arg name="date" value="2001-06-11" ></constructor-arg>--><!--这种方式我们依旧不能引入,不是思路不对,而是value属性不支持这样的写法,你写到里面的now会被系统认为是一个字符串,而不是我们指定的bean对象--><!--<constructor-arg name="date" value="now" ></constructor-arg>--><!--此方法支持引入其他的Bean对象,通过id引入--><constructor-arg name="date" ref="now"></constructor-arg></bean><bean id="now" class="java.util.Date"></bean>
</beans>
public interface IAccountService {void saveAccount();
}
public class IAccountServiceImpl implements IAccountService {private String name;private Integer age;private Date date;public IAccountServiceImpl(String name, Integer age, Date date) {this.name = name;this.age = age;this.date = date;}public void saveAccount() {System.out.println("service中的对象被创建了" + name + ":" + age + ":" + date);}
}
public class Client {/*** 获取Spring的IoC核心容器,并根据id值获取对象** @param args*/public static void main(String[] args) {//获取核心容器对象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");//根据id获取Bean对象IAccountService as = (IAccountService) ac.getBean("accountService");as.saveAccount();}
}

方式二(使用set方法提供)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="now" class="java.util.Date"></bean><!-- set方法注入                更常用的方式涉及的标签:property出现的位置:bean标签的内部标签的属性name:用于指定注入时所调用的set方法名称value:用于提供基本类型和String类型的数据ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象优势:创建对象时没有明确的限制,可以直接使用默认构造函数弊端:如果有某个成员必须有值,则获取对象是有可能set方法没有执行。set方法无法保证一定注入。--><bean id="accountService2" class="service.impl.IAccountServiceImpl2"><property name="name" value="TEST" ></property><property name="age" value="21"></property><property name="date" ref="now"></property></bean>
</beans>
public class IAccountServiceImpl2 implements IAccountService {private String name;private Integer age;private Date date;//set方法注入,给类中必须有set方法,且property中的name属性,只与setXxx中的Xxx有关,与private String name;无关public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void setDate(Date date) {this.date = date;}public void saveAccount() {System.out.println("service中的对象被创建了" + name + ":" + age + ":" + date);}
}
 public class Client {/*** 获取Spring的IoC核心容器,并根据id值获取对象** @param args*/public static void main(String[] args) {//获取核心容器对象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");//根据id获取Bean对象IAccountService as = (IAccountService) ac.getBean("accountService2");as.saveAccount();}
}

复杂类型的注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 复杂类型的注入/集合类型的注入用于给List结构集合注入的标签:list array set用于个Map结构集合注入的标签:map  props结构相同,标签可以互换--><bean id="accountService3" class="service.impl.AccountServiceImpl3"><property name="myStrs"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></property><property name="myList"><array><value>AAA</value><value>BBB</value><value>CCC</value></array></property><property name="mySet"><list><value>AAA</value><value>BBB</value><value>CCC</value></list></property><property name="myMap"><props><prop key="testC">ccc</prop><prop key="testD">ddd</prop></props></property><property name="myProps"><map><entry key="testA" value="aaa"></entry><entry key="testB"><value>BBB</value></entry></map></property></bean>
</beans>
public class AccountServiceImpl3 implements IAccountService {private String[] myStrs;private List<String> myList;private Set<String> mySet;private Map<String,String> myMap;private Properties myProps;public void setMyStrs(String[] myStrs) {this.myStrs = myStrs;}public void setMyList(List<String> myList) {this.myList = myList;}public void setMySet(Set<String> mySet) {this.mySet = mySet;}public void setMyMap(Map<String, String> myMap) {this.myMap = myMap;}public void setMyProps(Properties myProps) {this.myProps = myProps;}public void  saveAccount(){System.out.println(Arrays.toString(myStrs));System.out.println(myList);System.out.println(mySet);System.out.println(myMap);System.out.println(myProps);}
}
public class Client {/*** 获取Spring的IoC核心容器,并根据id值获取对象** @param args*/public static void main(String[] args) {//获取核心容器对象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");//根据id获取Bean对象IAccountService as = (IAccountService) ac.getBean("accountService3");as.saveAccount();}
}

Spring中的IoC(2)相关推荐

  1. java spring server_Java server框架之(1):spring中的IoC

    为什么需要IoC? 一般的对象耦合是在编译时确定的,也就是说当我们写如下类: 1 public classStaticCoupling { 2 3 String s = new String(&quo ...

  2. java spring server_java server之spring中的IOC如何用java实现?

    ** 什么是IOC? 一般的对象耦合是在编译时确定的,也就是说当我们写如下类: public class StaticCoupling { String s = new String("hz ...

  3. Spring中的IOC介绍

    Spring中的IOC介绍 IOC(控制反转) IOC介绍 IOC是什么 IOC能做什么 Spring容器管理对象 1.maven管理依赖 2.给定容器的配置文件 3.IOC容器管理对象 4.通过容器 ...

  4. 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

    用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心. 依赖注入(DI) ...

  5. 请简述什么是spring的ioc和di_理解Spring中的IoC和DI

    什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...

  6. Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?

    这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析后端知识/技能,本篇分享的是: Spring中的 ...

  7. 手动实现Spring中的IOC容器

    注意:这就是一个用于学习理解Spring中IOC容器的简单例子!!!! 1.IOC容器实现的过程: 加载XML的配置文件,并且遍历文件中的标签 获取配置文件中单个Bean的ID和Class属性,然后根 ...

  8. python ioc框架_轻松理解 Spring 中的 IOC

    Spring 简介 Spring 是一个开源的轻量级的企业级框架,其核心是反转控制 (IoC) 和面向切面 (AOP) 的容器框架.我们可以把 Spring 看成是对象的容器,容器中可以包含很多对象, ...

  9. Spring中的IOC和AOP是什么意思?

    (1) Spring是什么? IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AO ...

最新文章

  1. 2018QBXT刷题游记(15)
  2. Transformer-LS霸榜ImageNet,输入长度提升三倍!极度压缩参数
  3. 2021年春季学期-信号与系统-第四次作业参考答案-第一小题
  4. POJ1466 最大点权独立集
  5. 【组合数学】递推方程 ( 递推方程示例 2 汉诺塔 | 递推方程示例 3 插入排序 )
  6. xpath IE 7
  7. [世界杯]世界杯的哲学思想
  8. 一个html表单赋给另一个表单,是否可以将表单输入到另一个html表单
  9. 事件冒泡及阻止事件冒泡 事件的触发 事件参数对象 获取用户按下键盘的键
  10. 什么是抽象类?抽象类的作用_揭秘!Java 泛型背后到底是什么?
  11. 具有Tron效果的JavaFX 2 Form
  12. oracle-扫盲贴:存储过程实现增删改查
  13. javascript学习系列(24):数组中的substring方法
  14. 【CodeForces - 1047B 】Cover Points (数学,构造,思维)
  15. linux python开发identifier,python程序设计 浙大版
  16. 骆驼游戏 c语言,语言骆驼教案
  17. jq动态拼接html页面及数据
  18. 移动硬盘上安装WIN7 WIN10 UBUNTU系统
  19. One Pixel Attack(对抗攻击) —— 使用差分进化算法寻找最优解
  20. 数学建模_统计回归模型的梳理与总结:逐步回归,残差检验,自相关

热门文章

  1. 闲鱼xianyu获得闲鱼商品详情 API接口
  2. intel汇编几种跳转的区别
  3. Java—重复调用的代码块—方法
  4. win键不可用 / win+r、win+e等组合键不可用
  5. 捷克大学计算机语言学,捷克语专业大学排名 2021最新排行榜
  6. 利用android手机摄像头智能测量物体距离,高度
  7. oracle 数据立方_关于在Oracle 数据库存储m³(立方米)
  8. uni 读取网络json_uniapp存放json格式的数据
  9. OM1、OM2、OM3和OM4光纤跳线介绍
  10. vs2010 MSDN文档安装方法(转自:http://www.ljf.cn/archives/91.aspx)