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内置的可以直接注入的类型:

 package cn.tedu.beans;

 import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; public class Hero {
        private int id;
        private String name;
        private List<String> jobs;
        private Set<String> set;
        private Map<String,String> map;
        private Properties prop;
        
        public void setId(int id) {
                this.id = id;
        }         public void setName(String name) {
                this.name = name;
        }         public void setJobs(List<String> jobs) {
                this.jobs = jobs;
        }         public void setSet(Set<String> set) {
                this.set = set;
        }         public void setMap(Map<String, String> map) {
                this.map = map;
        }         public void setProp(Properties prop) {
                this.prop = prop;
        }         @Override
        public String toString() {
                return "Hero [id=" + id + ", name=" + name + ", jobs=" + jobs
                                + ", set=" + set + ", map=" + map + ", prop=" + prop + "]";
        }
}
 <?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/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
        >
        
        <bean id="hero" class="cn.tedu.beans.Hero">
                <property name="id" value="123"></property>
                <property name="name" value="亚瑟 "></property>
                <property name="jobs">
                        <list>
                                <value>上单</value>
                                <value>打野</value>
                                <value>辅助</value>
                                <value>中单</value>
                        </list>
                </property>
                <property name="set">
                        <set>
                                <value>aaa</value>
                                <value>bbb</value>
                                <value>ccc</value>
                                <value>aaa</value>
                        </set>
                </property>
                <property name="map">
                        <map>
                                <entry key="addr" value="王者荣耀"></entry>
                                <entry key="addr" value="英雄联盟"></entry>
                                <entry key="skill" value="风火轮"></entry>
                                <entry key="age" value="19"></entry>
                        </map>
                </property>
                <property name="prop">
                        <props>
                                <prop key="k1">v1</prop>
                                <prop key="k2">v2</prop>
                                <prop key="k3">v3</prop>
                                <prop key="k4">v4</prop>
                        </props>
                </property>
        </bean> </beans>
 @Test
/**
* SpringDI set方式属性注入 - Spring内置的可直接注入类型的注入
*/
public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Hero hero = (Hero) context.getBean("hero");
        System.out.println(hero);
}

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

 package cn.tedu.beans;

 import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; public class Hero {
        private int id;
        private String name;
        private List<String> jobs;
        private Set<String> set;
        private Map<String,String> map;
        private Properties prop;
        private Dog dog;
        private Cat cat;
        
        
        public void setId(int id) {
                this.id = id;
        }         public void setName(String name) {
                this.name = name;
        }         public void setJobs(List<String> jobs) {
                this.jobs = jobs;
        }         public void setSet(Set<String> set) {
                this.set = set;
        }         public void setMap(Map<String, String> map) {
                this.map = map;
        }         public void setProp(Properties prop) {
                this.prop = prop;
        }         public void setDog(Dog dog) {
                this.dog = dog;
        }         public void setCat(Cat cat) {
                this.cat = cat;
        }         @Override
        public String toString() {
                return "Hero [id=" + id + ", name=" + name + ", jobs=" + jobs
                                + ", set=" + set + ", map=" + map + ", prop=" + prop + ", dog="
                                + dog + ", cat=" + cat + "]";
        } }
 <?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/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
        >
        
        <bean id="hero" class="cn.tedu.beans.Hero">
                <property name="id" value="123"></property>
                <property name="name" value="亚瑟 "></property>
                <property name="jobs">
                        <list>
                                <value>上单</value>
                                <value>打野</value>
                                <value>辅助</value>
                                <value>中单</value>
                        </list>
                </property>
                <property name="set">
                        <set>
                                <value>aaa</value>
                                <value>bbb</value>
                                <value>ccc</value>
                                <value>aaa</value>
                        </set>
                </property>
                <property name="map">
                        <map>
                                <entry key="addr" value="王者荣耀"></entry>
                                <entry key="addr" value="英雄联盟"></entry>
                                <entry key="skill" value="风火轮"></entry>
                                <entry key="age" value="19"></entry>
                        </map>
                </property>
                <property name="prop">
                        <props>
                                <prop key="k1">v1</prop>
                                <prop key="k2">v2</prop>
                                <prop key="k3">v3</prop>
                                <prop key="k4">v4</prop>
                        </props>
                </property>
                <property name="dog" ref="dog"></property>
                <property name="cat" ref="cat"></property>
        </bean>         <bean id="dog" class="cn.tedu.beans.Dog"></bean>
        <bean id="cat" class="cn.tedu.beans.Cat"></bean>
        
</beans>

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

  3.自动装配

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

  为指定的<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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
        >
        
        <!--
                autowire设定自动装配:
                        byName:根据javabean中需要注入的属性的名字 ,在spring容器中找对应id的<bean>将该<bean>的对象复制给 当前的属性
                        byType:根据javabean中需要注入的属性的类型,在spring容器中找对应class类型的<bean>将该<bean>的对象复制给 当前的属性
                        **byType方式 根据类型进行匹配,可能匹配到多个<bean>,此时会抛出异常。而byName是通过id来寻找<bean>,id没有重复,不会有这方面的问题,所以推荐使用byName方式
         -->
        <bean id="teacher" class="cn.tedu.beans.Teacher" autowire="byName"></bean>
        <bean id="dog" class="cn.tedu.beans.Dog"></bean>
        <bean id="cat" class="cn.tedu.beans.Cat"></bean>
        
</beans>

  为全局配置自动装配:

 <?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/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
        default-autowire="byName"
        >
        
        <!--
                autowire设定自动装配:
                        byName:根据javabean中需要注入的属性的名字 ,在spring容器中找对应id的<bean>将该<bean>的对象复制给 当前的属性
                        byType:根据javabean中需要注入的属性的类型,在spring容器中找对应class类型的<bean>将该<bean>的对象复制给 当前的属性
                        **byType方式 根据类型进行匹配,可能匹配到多个<bean>,此时会抛出异常。而byName是通过id来寻找<bean>,id没有重复,不会有这方面的问题,所以推荐使用byName方式
         -->
        <bean id="teacher" class="cn.tedu.beans.Teacher"></bean>
        <bean id="dog" class="cn.tedu.beans.Dog"></bean>
        <bean id="cat" class="cn.tedu.beans.Cat"></bean>
        
</beans>
 package cn.tedu.beans;

 public class Teacher {
        private Dog dog;
        private Cat cat;
        public void setDog(Dog dog) {
                this.dog = dog;
        }
        public void setCat(Cat cat) {
                this.cat = cat;
        }
        
        @Override
        public String toString() {
                return "Teacher [dog=" + dog + ", cat=" + cat + "]";
        }
}
 @Test
/**
* SpringDI 自动装配
*/
public void test4(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Teacher teacher = (Teacher) context.getBean("teacher");
System.out.println(teacher);
}

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

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

 package cn.tedu.beans;

 public class Student {
        private int id;
        private String name;
        private Dog dog;
        
        public Student(int id, String name, Dog dog) {
                this.id = id;
                this.name = name;
                this.dog = dog;
        }         @Override
        public String toString() {
                return "Student [id=" + id + ", name=" + name + ", dog=" + dog + "]";
        }
}
 <?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/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
        >
        
        <bean id="student" class="cn.tedu.beans.Student">
                <!--
                        index:为构造方法的第几个参数 进行配置
                        name:为构造方法的哪个名字的参数进行配置
**index 和 name 可以配置任何一个或同时配置 但要求一旦配置必须正确
**推荐优先使用index方式配置 防止没有源码造成name无法匹配到对应参数
                        type:该构造方法参数的类型
                        value:该构造方法参数的值 ,用来指定基本值
                        ref:该构造方法参数的值,用来指定引用其他bean的值
                 -->
                <constructor-arg index="0" name="id" value="999"/>
                <constructor-arg index="1" type="java.lang.String" value="张无忌"/>
                <constructor-arg name="dog" ref="dog"/>
        </bean>
        
        <bean id="dog" class="cn.tedu.beans.Dog"></bean>
        
</beans>
 @Test
/**
* SpringDI 构造方法方式属性注入
*/
public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);
}

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

  1. 十七、Spring框架(IOC/DI)

    一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...

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

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  3. (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)

    Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1)  IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...

  4. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  5. Spring框架之IOC(控制反转)

    [TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...

  6. Spring框架的IOC核心功能快速入门

    2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...

  7. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring JDK动态代理

    JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...

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

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring DI(依赖注入)的实现方式属性注入和构造注入

    依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念. 当某个 Java 实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的 ...

  10. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring IoC容器BeanFactory和ApplicationContext

    IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建.Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring ...

随机推荐

  1. mybatis链接数据库

    DBTools类 public class DBTools { // 加载mybatis文件 public static SqlSession getSession() { //加载配置文件 Inpu ...

  2. 浅谈jpa、hibernate与spring data jpa三者之间的关系

    1.解释hibernate之前先了解下什么是orm,orm是object relation mapping,即对象关系映射,object可以理解成java实体类Entity,relation是关系型数 ...

  3. ThreadLocal使用原理、注意问题、使用场景

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  4. Java虚拟机详解(一)------简介

    本系列博客我们将以当前默认的主流虚拟机HotSpot 为例,详细介绍 Java虚拟机.以 JDK1.7 为主,同时介绍与 JDK1.8 的不同之处,通过Oracle官网以及各种文献进行整理,并加以验证 ...

  5. 常用的HTTP状态代码(4xx、5xx)详解

    HTTP状态代码常用的如下: 400 无法解析此请求. 401.1 未经授权:访问由于凭据无效被拒绝. 401.2 未经授权: 访问由于服务器配置倾向使用替代身份验证方法而被拒绝. 401.3 未经授 ...

  6. 【Linux杂记】screen命令

    screen命令: 解决的问题:有些进程启动后,一旦断开ssh容易断掉,所以新建一个screen(可以理解成窗口)并行运行 守护进程的方式:linux守护进程的方式实现开机启动某些特定的程序 屏幕命令 ...

  7. Spark2.4.0源码——DAGScheduler

    前言 Spark会将用户提交的作业看作一个job,在提交的时候首先将job转换为一系列的RDD,并按照RDD之间的依赖关系构建DAG(有向无环图),DAGScheduler会按照RDD依赖的不同将DA ...

  8. Linux命令分类汇总(1~6)

    Linux命令分类汇总 序号 命令 参数 英文释义 功能说明 (一)线上查询及帮助命令(2个) 1 man manual 查看命令帮助,命令的词典,还有info 2 help h 查看Linux内置命 ...

  9. spring源码深度解析— IOC 之 开启 bean 的加载

    概述 前面我们已经分析了spring对于xml配置文件的解析,将分析的信息组装成 BeanDefinition,并将其保存注册到相应的 BeanDefinitionRegistry 中.至此,Spri ...

  10. MAC iterm2 常用快捷键大全

    标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 / command + 左右方向键 切换全屏:command + enter 查找:com ...