Spring可以帮助我们管理软件开发过程中的对象,以及如何创建和维护对象之间的关系。 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,可以将组建的耦合度降至最低,即实现解耦,便于系统以后的维护和升级。

1.spring 开发

  eclipse开发工具

    maven搭建项目-添加spring-context依赖包

    引入applicationContext.xml配置文件

2.IOC (Inversion of Control) :控制反转,通过容器来控制对象的创建及维护,对象中成员变量的创建及维护。反转就是将对象的控制权转移给容器处理,目的是获得更好的扩展性和可维护性。

3.Spring Core Container(即Spring核心容器)——Spring框架的核心

4.Spring管理Bean的原理

  Spring的核心容器可以管理任何java类,容器可以初始化该类,并返回该类的实例。

xml配置方式:

    <!-- spring中进行控制反转的标记通过配置bean  可以指定某个class由spring来管理spring在读取主配置文件的时候会将当前标记读取,并且根据当前标记的class的值,通过反射来创建该bean的对象  id是用来给某个创建的对象设置一个唯一标识lazy-init:懒加载设置    默认为立即加载,即值为false设置成true,会在用到该bean的时候才创建该bean的对象-->

测试:

  添加Junit依赖包

  新建Javabean类(完整的),添加init、destroy方法(略。。。)

  配置xml文件:

    <bean id="animal" class="com.rong.entity.Animal" lazy-init="false" init-method="init" destroy-method="destroy"></bean>

  方法测试:

 1 public class MyTest {
 2     //ApplicationContext context=null;
 3     ClassPathXmlApplicationContext context=null;
 4     @Before
 5     public void before(){
 6         context=new ClassPathXmlApplicationContext("application.xml");
 7     }
 8     //测试destroy需要关闭容器,关闭容器的时候会自动销毁容器中的对象
 9     @Test
10     public void test1(){
11         Animal animal = context.getBean("animal", Animal.class);
12         System.out.println(animal);
13         context.close();//容器关闭,对象销毁  destroy调用只在单例模式下有效 (默认单例)
14     }
15 }

单例与多例

    <!-- bean的作用域scope:默认是单例singletonpototype 表示多实例  每次getBean都会创建一个新的对象--><bean name="animal1" class="com.rong.entity.Animal" scope="prototype"></bean>

1     @Test
2     public void test2(){
3         //修改了作用域后,每次getBean都会创建一个对象
4         Animal animal1 = context.getBean("animal1", Animal.class);
5         Animal animal2 = context.getBean("animal1", Animal.class);
6     }

5.Bean对象的实例化

A.用构造器来实例化

  如果不指定调用哪个构造器,spring默认会调用无参构造方法。

  例:<bean name="animal1" class="com.rong.entity.Animal" scope="prototype"></bean>

1     <!--
2         constructor-arg:设置构造方法注入,通过该标签来设置构造方法中 的  index的位置上的参数,
3         赋于value属性的值
4         index:构造方法中的参数的索引位置,从0开始计算
5         value:设置属性值,只有String和基本数据类型可以直接用value指定值
6         ref:如果需要引用其他的bean作为属性值,用ref(用其他bean的id或name)
7         type:设置当前参数的类型,可以省略
8       -->

    <bean id="animal" class="com.rong.entity.Animal" lazy-init="false" init-method="init" destroy-method="destroy"><constructor-arg index="0" type="java.lang.String" value="小花"></constructor-arg><constructor-arg index="1" value="18"></constructor-arg></bean>

B.使用静态工厂实例化

  类中声明静态工厂方法

    public Animal() {super();System.out.println("无参Animal");}public static Animal getInstance(){System.out.println("静态工厂创建实例");return new Animal();}

<!-- factory-method:使用对象静态工厂的方式创建对象--><bean id="animal2" class="com.rong.entity.Animal" factory-method="getInstance"></bean>

C.使用实例工厂实例化

    <!-- 通过对象工厂创建对象1.创建工厂对象2.设置bean使用工厂对象的方法来创建-->

1 public class AnimalFactory {
2     public Animal getInstance(){
3         System.out.println("工厂方法调用");
4         return new Animal();
5     }
6 }

    <bean id="animalFactory" class="com.rong.entity.AnimalFactory"></bean><bean id="animal3" class="com.rong.entity.Animal" factory-bean="animalFactory" factory-method="getInstance"></bean>

1     @Test
2     public void test4(){
3         Animal animal = context.getBean("animal3", Animal.class);
4         System.out.println(animal);
5     }

D.延时实例化——lazy-init

6.依赖注入(DI全称是Dependency Injection)

<!-- DI  依赖注入配置   即通过spring去做  构造方法或set方法给属性赋值工作 -->

A.构造方法注入(示例如上)

B.set方法注入

1)类中提供set方法

2)在spring主配置文件中通过property属性来设置(value和ref属性不能同时使用)

<!-- setter注入 property  :调用setter方法设置属性值name:设置哪个属性赋值value:给该属性赋予什么值ref : 给引用类型属性赋值-->

1     <bean id="animal3" class="com.rong.entity.Animal" factory-bean="animalFactory" factory-method="getInstance">
2         <property name="age" value="60"></property>
3         <property name="type" value="www"></property>
4     </bean>

C.自动装配的方式

<!-- 自动装配 ,一般结合依赖注入使用 -->

 1     <!--
 2         autowire:使用自动装配的方式,给当前bean的属性赋值
 3         byType:spring自动检索容器中有哪些bean,并且找到符合当前bean的属性的类型的bean出来,如果找到了
 4         则自动给该属性赋值
 5         byName:spring自动根据当前bean的属性的名称,从容器中查找与该属性名一致的bean,注入到该属性上
 6      -->
 7
 8     <!-- <bean id="favourite" class="com.web.entity.Favourite">
 9         <property name="sport" value="游泳"></property>
10     </bean> -->
11     <bean id="favourite2" class="com.web.entity.Favourite">
12         <property name="sport" value="打篮球"></property>
13     </bean>
14     <!-- <bean id="myAnimal" class="com.web.entity.Animal" autowire="byName"></bean> -->
15     <bean id="myAnimal2" class="com.web.entity.Animal" autowire="byType"></bean>

list、set、map、property的注入方式

 1 package com.web.entity;
 2
 3 import java.util.Iterator;
 4 import java.util.List;
 5 import java.util.Map;
 6 import java.util.Map.Entry;
 7 import java.util.Properties;
 8 import java.util.Set;
 9
10 public class MyBean {
11     private List<String> cities;
12     private Set<String> names;
13     private Map<String,Integer> map;
14     private Properties props;
15     public List<String> getCities() {
16         return cities;
17     }
18     public void setCities(List<String> cities) {
19         this.cities = cities;
20     }
21     public Set<String> getNames() {
22         return names;
23     }
24     public void setNames(Set<String> names) {
25         this.names = names;
26     }
27     public Map<String, Integer> getMap() {
28         return map;
29     }
30     public void setMap(Map<String, Integer> map) {
31         this.map = map;
32     }
33     public Properties getProps() {
34         return props;
35     }
36     public void setProps(Properties props) {
37         this.props = props;
38     }
39
40     public void show(){
41         System.out.println("list==========");
42         for (String string : cities) {
43             System.out.println(string);
44         }
45         System.out.println("set==========");
46         for (String name : names) {
47             System.out.println(name);
48         }
49         System.out.println("map==========");
50         Set<Entry<String, Integer>> entrySet = map.entrySet();
51         Iterator<Entry<String, Integer>> iterator = entrySet.iterator();
52         while(iterator.hasNext()){
53             Entry<String, Integer> entry = iterator.next();
54             String key = entry.getKey();
55             Integer value = entry.getValue();
56             System.out.println(key+":"+value);
57         }
58         System.out.println("property==========");
59         Set<Object> Set = props.keySet();
60         for (Object object : Set) {
61             String key=(String)object;
62             String value = props.getProperty(key);
63             System.out.println(key+":"+value);
64         }
65
66
67     }
68
69 }

    <bean id="myBean" class="com.web.entity.MyBean"><property name="cities"><list><value>北京</value><value>上海</value><value>广州</value><value>深圳</value></list></property><property name="names"><set><value>胡歌</value><value>杨幂</value><value>霍建华</value><value>叶剑英</value></set></property><property name="map"><map><entry><key><value>Java</value></key><value>100</value></entry><entry><key><value>C++</value></key><value>98</value></entry><entry><key><value>Android</value></key><value>96</value></entry></map></property><!-- ref引用方式 -->
<!--         <property name="props" ref="dbProps"></property> --><!-- 直接赋值方式 --><property name="props"><props><prop key="username">#{dbProps.username}</prop><prop key="password">#{dbProps.password}</prop><prop key="driver">com.mysql.jdbc.Driver</prop></props></property></bean><!-- 读取配置文件转成Properties对象 id:唯一标识location:从哪里读取文件classpath:    通过类路径开始读取--><util:properties id="dbProps" location="classpath:db.properties"></util:properties>

1 url=jdbc:mysql://localhost:3306/utf8?useUnicode=true&characterEncoding=utf-8
2 username=root
3 password=123123
4 driver=com.mysql.jdbc.Driver

转载于:https://www.cnblogs.com/57rongjielong/p/7827769.html

IOC与DI(xml 配置)相关推荐

  1. Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面

    初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...

  2. java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)

    1.依赖注入的概念 依赖注入:Dependency Injection.它是spring框架核心ioc的具体实现. 我们的程序在编写时,通过控制反转,把对象的创建交给了spring,但是代码中不可能出 ...

  3. spring IOC基本配置(xml配置和注解配置)

    目录 Spring IOC IOC是什么 IOC可以做什么 依赖注入 IOC和DI IOC容器 Bean 配置IOC容器 spring ioc 依赖 XML配置 实例化容器 使用容器 xml配置详解 ...

  4. Spring详解(四)------注解配置IOC、DI

    Annotation(注解)是JDK1.5及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以'@注解名'在代码中存在的. 前面讲解 IOC 和 DI 都是通过 ...

  5. Spring框架IOC基础及XML的配置 第二章

    1 Spring概述 1.1 关于框架 框架的概念 框架:特指软件框架,它是我们在实际开发中解决项目需求的技术集合.运用框架可以大大简化代码的编写,缩短开发周期.同时,对后续负责项目维护的人员降低技术 ...

  6. xml配置javaBean的IOC实现示例

    xml配置javaBean的IOC实现 1.开发步骤介绍 创建java项目(项目可以是Maven项目), 加入spring相关架包, 创建javaBean 使用xml配置javaBean 管理/使用J ...

  7. 彻底理解Spring IOC和DI

    目录 前言 1. 分享Iteye的开涛对Ioc的精彩讲解 1.1 IoC是什么 1.2 IoC能做什么 1.3 IoC和DI 2. 分享Bromon的blog上对IoC与DI浅显易懂的讲解 2.1 I ...

  8. spring IOC和DI

    spring IOC and DI 1.IOC和DI的区别: IOC:对象的管理权由spring容器掌握(管理权限包括:对象的创建时间点.创建方式以及对象属性的管理): DI:spring操作对象属性 ...

  9. Spring 详解(二):IOC 和DI

    1 IOC 理解 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不 ...

最新文章

  1. R语言abs函数计算数值数据对象的绝对值实战
  2. Ansible之使用角色一键部署httpd并检查部署结果
  3. Ansible Playbook企业案例:利用 playbook 安装 nginx、安装和卸载 httpd、安装mysql
  4. 牛客网 栈的压入、弹出序列
  5. 主创仅2人,题材是大型3D战争,这款游戏竟然“超逼真”?
  6. 使用WebRTC开发Android Messenger:第1部分
  7. 学习笔记整理之模式化方法
  8. NOIP模拟测试6「那一天我们许下约定(背包dp)·那一天她离我而去」
  9. java gson fromjson,Gson的fromJson()方法
  10. 马斯克:全力支持狗狗币主要持有者出售货币 持仓太集中是问题
  11. java里正数和负数_Java程序检查数字是正数还是负数
  12. DAY102 - Rest Framework(七)- 手动编写配置文件、分页器和版本控制
  13. 自组织映射神经网络(SOM)
  14. 查看详细Windows VISTA 或Windows 7激活状态
  15. 读书感受 之 《如何说客户才会听,怎么听客户才肯说》
  16. 如何使用Flutter封装即时通讯IM框架开发插件
  17. 单号查询方法,怎么查快递物流到哪里了
  18. 2023年全国最新会计专业技术资格精选真题及答案18
  19. 教师节祝福短信:送给有个性的老师
  20. 形容谣言的四字词语_描写传递信息的四字词语

热门文章

  1. AndroidM 内核空间到用户空间接口类型
  2. LeetCode#53 Maximum Subarray
  3. JAVA:数组,排序,查找4
  4. SESSIONS.ser 的问题
  5. JavaScript中的Math方法演示
  6. Codewars-parseInt() reloaded(实现英文单词和数字的转换)
  7. 错误记录:自己创建activity时不能进行真机usb安装调试
  8. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
  9. 20140704笔试面试总结(java)
  10. [delphi]极域学生端解除键盘鼠标锁定退出全屏广播-强制窗口化-源代码