JAVA-Spring框架之IOC(DI)(1)

spring框架概述
  spring是一个service层的框架,可以整合许多其 他框架,进行工作
  spring的主要技术是IOC(DI)和AOP

  IOC(DI)-控制反转(依赖注入)AOP - 面向切面编程

1. IOC(DI)

  所谓的IOC称之为控制反转,简单来说,就是将创 建对象的权力和对象的生命周期都由spring框架 来管理,从此开放过程中便不再关心对象的创建 和生命周期的管理,从而在需要创建对象的时候 ,由spring框架提供,这个由spring框架管理对 象的创建和生命周期的机制就是IOC,创建对象的 过程中spring框架可以根据配置对对象的属性进 行设置,这个过程就是依赖注入(DI)。

2.set方法注入

  通常的javabean属性都会被私有化,而对外暴露set和get方法,此时spring可以通过这样的set方法将属性的值注入对象。

  spring内置的可以直接注入的类型:

 1 package cn.tedu.beans;
 2
 3 import java.util.List;
 4 import java.util.Map;
 5 import java.util.Properties;
 6 import java.util.Set;
 7
 8 public class Hero {
 9         private int id;
10         private String name;
11         private List<String> jobs;
12         private Set<String> set;
13         private Map<String,String> map;
14         private Properties prop;
15         
16         public void setId(int id) {
17                 this.id = id;
18         }
19
20         public void setName(String name) {
21                 this.name = name;
22         }
23
24         public void setJobs(List<String> jobs) {
25                 this.jobs = jobs;
26         }
27
28         public void setSet(Set<String> set) {
29                 this.set = set;
30         }
31
32         public void setMap(Map<String, String> map) {
33                 this.map = map;
34         }
35
36         public void setProp(Properties prop) {
37                 this.prop = prop;
38         }
39
40         @Override
41         public String toString() {
42                 return "Hero [id=" + id + ", name=" + name + ", jobs=" + jobs
43                                 + ", set=" + set + ", map=" + map + ", prop=" + prop + "]";
44         }
45 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
 6         >
 7         
 8         <bean id="hero" class="cn.tedu.beans.Hero">
 9                 <property name="id" value="123"></property>
10                 <property name="name" value="亚瑟 "></property>
11                 <property name="jobs">
12                         <list>
13                                 <value>上单</value>
14                                 <value>打野</value>
15                                 <value>辅助</value>
16                                 <value>中单</value>
17                         </list>
18                 </property>
19                 <property name="set">
20                         <set>
21                                 <value>aaa</value>
22                                 <value>bbb</value>
23                                 <value>ccc</value>
24                                 <value>aaa</value>
25                         </set>
26                 </property>
27                 <property name="map">
28                         <map>
29                                  <entry key="addr" value="王者荣耀"></entry>
30                                  <entry key="addr" value="英雄联盟"></entry>
31                                  <entry key="skill" value="风火轮"></entry>
32                                  <entry key="age" value="19"></entry>
33                         </map>
34                 </property>
35                 <property name="prop">
36                         <props>
37                                 <prop key="k1">v1</prop>
38                                 <prop key="k2">v2</prop>
39                                 <prop key="k3">v3</prop>
40                                 <prop key="k4">v4</prop>
41                         </props>
42                 </property>
43         </bean>
44
45 </beans>
1 @Test
2 /**
3  * SpringDI set方式属性注入 - Spring内置的可直接注入类型的注入
4  */
5 public void test1(){
6         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
7         Hero hero = (Hero) context.getBean("hero");
8         System.out.println(hero);
9 }

  非spring内置的可以直接如注入的类型:

 1 package cn.tedu.beans;
 2
 3 import java.util.List;
 4 import java.util.Map;
 5 import java.util.Properties;
 6 import java.util.Set;
 7
 8 public class Hero {
 9         private int id;
10         private String name;
11         private List<String> jobs;
12         private Set<String> set;
13         private Map<String,String> map;
14         private Properties prop;
15         private Dog dog;
16         private Cat cat;
17         
18         
19         public void setId(int id) {
20                 this.id = id;
21         }
22
23         public void setName(String name) {
24                 this.name = name;
25         }
26
27         public void setJobs(List<String> jobs) {
28                 this.jobs = jobs;
29         }
30
31         public void setSet(Set<String> set) {
32                 this.set = set;
33         }
34
35         public void setMap(Map<String, String> map) {
36                 this.map = map;
37         }
38
39         public void setProp(Properties prop) {
40                 this.prop = prop;
41         }
42
43         public void setDog(Dog dog) {
44                 this.dog = dog;
45         }
46
47         public void setCat(Cat cat) {
48                 this.cat = cat;
49         }
50
51         @Override
52         public String toString() {
53                 return "Hero [id=" + id + ", name=" + name + ", jobs=" + jobs
54                                 + ", set=" + set + ", map=" + map + ", prop=" + prop + ", dog="
55                                 + dog + ", cat=" + cat + "]";
56         }
57
58 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
 6         >
 7         
 8         <bean id="hero" class="cn.tedu.beans.Hero">
 9                 <property name="id" value="123"></property>
10                 <property name="name" value="亚瑟 "></property>
11                 <property name="jobs">
12                         <list>
13                                 <value>上单</value>
14                                 <value>打野</value>
15                                 <value>辅助</value>
16                                 <value>中单</value>
17                         </list>
18                 </property>
19                 <property name="set">
20                         <set>
21                                 <value>aaa</value>
22                                 <value>bbb</value>
23                                 <value>ccc</value>
24                                 <value>aaa</value>
25                         </set>
26                 </property>
27                 <property name="map">
28                         <map>
29                                  <entry key="addr" value="王者荣耀"></entry>
30                                  <entry key="addr" value="英雄联盟"></entry>
31                                  <entry key="skill" value="风火轮"></entry>
32                                  <entry key="age" value="19"></entry>
33                         </map>
34                 </property>
35                 <property name="prop">
36                         <props>
37                                 <prop key="k1">v1</prop>
38                                 <prop key="k2">v2</prop>
39                                 <prop key="k3">v3</prop>
40                                 <prop key="k4">v4</prop>
41                         </props>
42                 </property>
43                 <property name="dog" ref="dog"></property>
44                 <property name="cat" ref="cat"></property>
45         </bean>
46
47         <bean id="dog" class="cn.tedu.beans.Dog"></bean>
48         <bean id="cat" class="cn.tedu.beans.Cat"></bean>
49         
50 </beans>

1 @Test
2 /**
3  * SpringDI set方式属性注入 - 非Spring内置的可以直接注入类型的注入
4  */
5 public void test2(){
6         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
7         Hero hero = (Hero) context.getBean("hero");
8         System.out.println(hero);
9 }

  3.自动装配

    在spring的set方式实现的注入过程中,支持自动装配机制,所谓自动装配机制,会根据要设置的javabean属性的名字或者类型到spring中自动寻找对应id或类型的<bean>进行设置,从而省去一次配置的过程,简化了配置。

  为指定的<bean>开启自动装配:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
 6         >
 7         
 8         <!--
 9                 autowire设定自动装配:
10                         byName:根据javabean中需要注入的属性的名字 ,在spring容器中找对应id的<bean>将该<bean>的对象复制给 当前的属性
11                         byType:根据javabean中需要注入的属性的类型,在spring容器中找对应class类型的<bean>将该<bean>的对象复制给 当前的属性
12                         **byType方式 根据类型进行匹配,可能匹配到多个<bean>,此时会抛出异常。而byName是通过id来寻找<bean>,id没有重复,不会有这方面的问题,所以推荐使用byName方式
13          -->
14         <bean id="teacher" class="cn.tedu.beans.Teacher" autowire="byName"></bean>
15         <bean id="dog" class="cn.tedu.beans.Dog"></bean>
16         <bean id="cat" class="cn.tedu.beans.Cat"></bean>
17         
18 </beans>

  为全局配置自动装配:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
 6         default-autowire="byName"
 7         >
 8         
 9         <!--
10                 autowire设定自动装配:
11                         byName:根据javabean中需要注入的属性的名字 ,在spring容器中找对应id的<bean>将该<bean>的对象复制给 当前的属性
12                         byType:根据javabean中需要注入的属性的类型,在spring容器中找对应class类型的<bean>将该<bean>的对象复制给 当前的属性
13                         **byType方式 根据类型进行匹配,可能匹配到多个<bean>,此时会抛出异常。而byName是通过id来寻找<bean>,id没有重复,不会有这方面的问题,所以推荐使用byName方式
14          -->
15         <bean id="teacher" class="cn.tedu.beans.Teacher"></bean>
16         <bean id="dog" class="cn.tedu.beans.Dog"></bean>
17         <bean id="cat" class="cn.tedu.beans.Cat"></bean>
18         
19 </beans>
 1 package cn.tedu.beans;
 2
 3 public class Teacher {
 4         private Dog dog;
 5         private Cat cat;
 6         public void setDog(Dog dog) {
 7                 this.dog = dog;
 8         }
 9         public void setCat(Cat cat) {
10                 this.cat = cat;
11         }
12         
13         @Override
14         public String toString() {
15                 return "Teacher [dog=" + dog + ", cat=" + cat + "]";
16         }
17 }
1 @Test
2 /**
3  * SpringDI 自动装配
4  */
5 public void test4(){
6     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
7     Teacher teacher = (Teacher) context.getBean("teacher");
8     System.out.println(teacher);
9 }

  4.基于构造方法的注入:

    对象属性设置的另一种方式是在对象创建的过程中通过构造方法的传入并设置对象的属性的。spring也可以通过这样的构造方法实现属性的注入。

 1 package cn.tedu.beans;
 2
 3 public class Student {
 4         private int id;
 5         private String name;
 6         private Dog dog;
 7         
 8         public Student(int id, String name, Dog dog) {
 9                 this.id = id;
10                 this.name = name;
11                 this.dog = dog;
12         }
13
14         @Override
15         public String toString() {
16                 return "Student [id=" + id + ", name=" + name + ", dog=" + dog + "]";
17         }
18 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
 6         >
 7         
 8         <bean id="student" class="cn.tedu.beans.Student">
 9                 <!--
10                         index:为构造方法的第几个参数 进行配置
11                         name:为构造方法的哪个名字的参数进行配置
12                                  **index 和 name 可以配置任何一个或同时配置 但要求一旦配置必须正确
13                                  **推荐优先使用index方式配置 防止没有源码造成name无法匹配到对应参数
14                         type:该构造方法参数的类型
15                         value:该构造方法参数的值 ,用来指定基本值
16                         ref:该构造方法参数的值,用来指定引用其他bean的值
17                  -->
18                 <constructor-arg index="0" name="id" value="999"/>
19                 <constructor-arg index="1" type="java.lang.String" value="张无忌"/>
20                 <constructor-arg name="dog" ref="dog"/>
21         </bean>
22         
23         <bean id="dog" class="cn.tedu.beans.Dog"></bean>
24         
25 </beans>
1 @Test
2 /**
3  * SpringDI 构造方法方式属性注入
4  */
5 public void test3(){
6         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
7         Student student = (Student) context.getBean("student");
8         System.out.println(student);
9 }

原文地址:https://www.cnblogs.com/xiaoluohao/p/11247772.html

时间: 2024-11-05 13:06:44

JAVA-Spring框架之IOC(DI)(1)的相关文章

好程序员Java干货分享Spring框架之IOC原理

好程序员Java干货分享Spring框架之IOC原理,前言:Spring框架是我们进行企业级开发的最常用框架,本章我们将了解Spring框架,并学习Spring的IOC特性以及IOC的实现原理:注解和反射. Spring框架简介 Spring是一种轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架,能够为企业级开发提供一站式服务. Spring的优点有 1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度

初识Spring框架实现IOC和DI(依赖注入)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转

java架构解密——Spring框架的ioc自我实现

在java的开发中,经常使用的框架当属SSH,而在这张框架中,我们首先接触到的就是神奇的Spring,虽然有N多前辈说Spring就是N多公共代码的集合,是帮助我们实现了,我们很久之前就想实现或者已经实现的好的点子的集合,但是作为一名合格工程师,怎么能不懂spring的底层实现呢!在今天咱们就一起探索Spring是怎么完成IOC工作的,也自己做一个简单Spring框架! 1,Spring中Bean的定义 作用:在spring中使用的bean,都有某些公共属性,此类就是对公共属性的定义 <span

Spring框架的IoC和AOP

答: IoC:控制反转,在现在的开发中,如果想建 立对象并设置属性,是需要先new对象,再通过setter或构造方法设置属性.而使用Spring的IoC后,则是先通过配置声明属性的值或关系,再通过Spring框架建立对象,建立好的对象中就自动设置好了配置的属性.此功能可以替代工厂类.在IoC 中还提出了DI(依赖注入),表示将一个Spring中配置好的类,设置到另一个Spring配置的类中,作为属性使用.//实现的原理仍然是使用反射,仍然是先建立对象再设置属性.工厂类的缺点是写一个实现类就要加一

Spring框架中IoC(控制反转)的原理

一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所以才有了控制反转这个理论. 2.什么是控制反转(IoC): (1).IoC是Inversion of Control的缩写,有的翻译成"控制反转",还有翻译成为"控制反向"或者&

认识Java Spring 框架

谈起Java  开发总是离不开各种框架,当我们在使用Java初期就被各种框架的包围着,而.Net开发就比较简单了,从WinForm到Asp.Net再到APS.Net Mvc,一气呵成,开发起来那叫一个爽,但是也带来了一些问题,比如,.Net 开发者使用微软已经封装好的类库,程序员在日常的开发过程中,都不知道自己所使用的类库有多么精妙,但是Java就不一样了,它是完全开源的,可以按照自己的需求加载适合的类库,作为开发者就可以知道大牛们写的牛叉代码,也可以看到代码的重构的美妙之处.今天我们就来谈一谈

Spring框架学习[IoC容器高级特性]

1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取被管理的Bean时,IoC容器对Bean进行的初始化和依赖注入过程,这些是Spring IoC容器的基本功能特性.Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.FactoryBean产生或者修饰Bean对象的生成.IoC容器初始化Bean过程中使用Bean

spring中的IOC/DI的知识点

IOC(Inverse of control):控制反转;其实就是一个装对象的容器,以前我们在controller中调用service中的方法,都要先new 一个service对象,这样不符合模式设计的六大法则中的依赖倒置原则,为了处理这个问题,可以把各层创建对象的工作让spring来完成,spring创建对象都把它放在ioc中 DI:依赖注入:其实与IOC是一回事,只是从不同的角度来看待问题的 实现IOC/DI的技术有: 1.setter注入(最常用) 2.构造方法注入(使用它时,要注意空构造

基于java spring框架开发部标1078视频监控平台精华文章索引

部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面的协议有RTSP, RTMP, RTP, 音视频编码有H.264, AAC,  726,711等,消化这些协议和功能标准就已经是需要一个较长的周期了,而构建一个视频平台的架构,也是比较复杂的,后端不仅有网关,还要有流媒体服务器,转发服务器,播放器,RTSP或RTMP服务器等多个服务器模块,需要的技术

java spring框架的HelloWord

工作原因,需要了解java了.现在java开发好像基本都是spring这一套,而且初次了解的时候,实在是一头雾水. spring, spring-boot, spring-cloud, AOP,mybatis, zookeeper, Eureka, apollo, consul等等技术,涉及面太广. VS code作为编辑器可以,作为IDE用起来不太方便,我换了的eclipse学习的spring框架. 工程使用 项目使用start.spring.io中的脚手架搭建spring-boot的mave