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 ...
随机推荐
- 剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染
一.概述 1.1 数字人类的概要 数字人类(Digital Human)是利用计算机模拟真实人类的一种综合性的渲染技术.也被称为虚拟人类.超真实人类.照片级人类. 它是一种技术和艺术相结合的综合性模拟 ...
- MySQL优化(一)
MySQL数据库优化一之引索详解 对于网站优化最注重的就是数据库的优化,而在数据库优化中首先考虑到的应该是数据库索引是否建立于是否建立的正确. 1.对于刚刚接触数据库的程序员,对于引索不是很理解.下面 ...
- JS的第一天,精彩内容
1.JS 介绍 js的全称是JavaScript,它是一门前台语言 Java是一门后台语言 ,它们两个之间毫无关系 JavaScript的作者是布兰登,艾奇 前台语言:运行在客户端 后台语言:与数据库 ...
- 最新ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)
最近做了一个应用,需要用邮件发通知,但是免费的邮箱每天发信数量是有限制的,所以呢就想着搭建一个自己的邮件服务器,能够实现邮件的发送和接收即可,其中大概花了一个星期找资料,测试,终于成功了,写个教程 ...
- Python生成word
Python生成word 使用python-docx-template库, 将html转为word. python-docx-template可以使用类似jinja2的模板语法. 依赖docx库, 安 ...
- 12 | 从0到1:你的第一个GUI自动化测试
- lower_bound 和 upper_bound 功能和用法
以前用这两个函数的时候,简单看了几句别人的博客,记住了大概,用的时候每用一次就弄混一次,相当难受,今天对照着这两个函数的源码和自己的尝试发现:其实这两个函数只能用于 "升序" 序列 ...
- GMap 自定义绘图
GMap自定义绘图 gmap自带的绘图只难绘制路径,多边形,固定大小的圆.在实际开发中可能这些并不能满足自己所需.这里就需要自定义绘图 原理:继承GMapRoute或者GMapMarker类,重写里面 ...
- 【POJ - 2386】Lake Counting (dfs+染色)
-->Lake Counting 直接上中文了 Descriptions: 由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= ...
- Ubuntu 16.4-desktop系统安装显卡CUDA具体步骤!
1.禁用nouveau驱动(切换至tty界面) sudo vim /etc/modprobe.d/blacklist.conf 在文本最后添加:blacklist nouveau options no ...