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内置的可以直接注入的类型:
- 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)的更多相关文章
- 十七、Spring框架(IOC/DI)
一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
- (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)
Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1) IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Spring框架之IOC(控制反转)
[TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...
- Spring框架的IOC核心功能快速入门
2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring JDK动态代理
JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring DI(依赖注入)的实现方式属性注入和构造注入
依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念. 当某个 Java 实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring IoC容器BeanFactory和ApplicationContext
IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建.Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring ...
随机推荐
- SAP TABLECONTROL 自定义SEARCH HELP
项目上需要开发一个界面如下的应用程序.这是一个MB1A发料的辅助程序,限制住移动类型和在特定字段写入产品号. 这个应用程序的主要功能毫无疑问是通过BAPI实现的.但在TABLECONTROL中需要对填 ...
- 【spring boot】application.properties官方完整文档
官方地址: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ 进入搜索: Appendice ...
- Hadoop集群(第2期)虚拟机网卡的介绍和配置
很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmware有三种网络模式,对初学者来说也比较眼花聊乱,今天我就来基于虚拟机3种网络模式,帮大家普及下虚拟机上网的背景知识 虚拟机网络模式 无论是vm ...
- Windows服务器下的IIS和Apache性能比较
目前最流行的建立网站的服务工具就要属Apache与IIS了.那么他们之间到底哪个性能更好呢?到底哪个工具才是最适合我们的呢?最近我也对这方面的问题进行了一番研究. 如果是基于Linux平台的话,那不必 ...
- c++用参数返回堆上的空间
<高质量c++和c编程>7.4 指针参数是如何传递内存的一节中写道 void GetMemory(char *p, int num) { p = (char *)malloc(sizeof ...
- java集合的方法及使用详解
一.java集合的分类及相互之间的关系 Collection接口:向下提供了List和Set两个子接口 |------List接口:存储有序的,存储元素可以重复 |------ArrayList(主要 ...
- Java中常用的url签名防篡改方法
实现方式:Md5(url+key) 的方式进行的. 1.key可以是任意的字符串,然后“客户端”和“服务器端”各自保留一份,千万不能外泄. 2.请求的URL 例如: name=lxl&age ...
- netty服务端启动--ServerBootstrap源码解析
netty服务端启动--ServerBootstrap源码解析 前面的第一篇文章中,我以spark中的netty客户端的创建为切入点,分析了netty的客户端引导类Bootstrap的参数设置以及启动 ...
- Django ORM基础篇【转载】
ORM( Object relational mapping 对象关系映射)D:把面向对象中的类和数据库表一一对应起来,在django项目与数据库之间起着桥梁的 ...
- php中使用trait设计单例
trait Singleton { private static $instace = null; private function __construct() { } private functio ...