十七、Spring框架(IOC/DI)
一、Spring框架
Spring是一个基于IOC和AOP的结构J2EE系统的框架。
1、IOC反转控制是Spring的基础(Inversion Of Control)。也就是说创建对象由以前的程序员自己new构造方法来调用,变成了交给Spring创建对象。
2、DI依赖注入(Dependency Inject):就是拿到的对象的属性,已经被注入好相关值了,可以直接使用。
3、将lib.jar导入到新建的Spring项目的lib目录(类库)中。

导入jar包方法:右键project->properties->java build path->libaries->add external jars就行。
4、在src目录下,建立两个文件夹,一个pojo(放实体类),一个test(测试用)
准备pojo Product,用来测试IOC和DI
package com.demo.pojo;
public class Product{
private int id;
private String name;
//属性的getter和setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
5、在src目录下新建一个applicationContext.xml文件
applicationContext.xml是Spring的核心配置文件,通过配置bean的属性,根据关键字product来获取Product对象,该对象获取的时候,被注入了字符串"Apple"到属性中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema.context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean name="product" class="com.demo.pojo.Product">
<property name="name" value="Apple"/>
</bean>
</beans>
6、测试TestSpring
在test文件夹下,建立TestSpring
package com.demo.test; import org.springframework.context.ApplicationContext;
import org.springframework.support.ClassPathXmlApplicationContext; import com.demo.pojo.Product; public class TestSpring{
public static void main(String[] args){
//加载applicationContext.xml配置文件
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
//根据ApplicationContext对象提供的getBean()方法,获取配置bean的name属性值。
Product product=(Product)context.getBean("product");
System.out.println(product.getName());
}
}
7、工作原理:
IOC方式获取对象方式:对象的生命周期交给Spring来管理,直接从Spring那里获取一个对象。
传统方式:通过new关键字主动创建一个对象。

二、注入对象
之前直接对Product的name属性注入"Apple"字符串,这一次我们注入一个Category分类对象。
1、首先修改Product.java实体类,新增一个Category属性。
package com.demo.pojo;
public class Product{
private int id;
private String name;
private Category category;//类别属性
//属性的getter和setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public Category getCategory(){
return category;
}
pulic vodi setCategory(Category category){
this.category=category;
}
}
2、修改applicationContext.xml配置文件
在创建Product的时候注入一个Category对象,这里要使用ref来注入另一个对象。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema.context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean name="product" class="com.demo.pojo.Product">
<property name="name" value="Apple"/>
<property name="category" ref="Category"/><!--将category对象注入到product-->
</bean>
<!--配置Category的bean-->
<bean name="category" class="com.demo.pojo.Category">
<property name="name" value="Fruit"/>
</bean>
</beans>
3、TestSpring测试
通过Spring获取Product对象被注入的Category对象
package com.demo.test; import org.springframework.context.ApplicationContext;
import org.springframework.support.ClassPathXmlApplicationContext; import com.demo.pojo.Product; public class TestSpring{
public static void main(String[] args){
//加载applicationContext.xml配置文件
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
//根据ApplicationContext对象提供的getBean()方法,获取配置bean的name属性值。
Product product=(Product)context.getBean("product");
System.out.println(product.getName());//Apple
System.out.pringln(product.getCategory().getName());//Fruit
}
}
三、采用注解的方式进行IOC/DI
1、修改applicationContext.xml
添加配置:
<context:annotation-config/>
具体配置修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema.context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/
<bean name="product" class="com.demo.pojo.Product">
<property name="name" value="Apple"/>
<!--<property name="category" ref="Category"/><!--将category对象注入到product--><!--注释掉刚才给Product注入的category属性,后面采用注解完成该操作-->
</bean>
<!--配置Category的bean-->
<bean name="Category" class="com.demo.pojo.Category">
<property name="name" value="Fruit"/>
</bean>
2、采用注解@Autowired
2.1、在Product.java的Category属性上面加上@Autowired注解
package com.demo.pojo;
public class Product{
private int id;
private String name;
@Autowried//采用注解注入Category属性,不用在xml配置bean的Product引入Category
private Category category;//类别属性
//属性的getter和setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public Category getCategory(){
return category;
}
pulic vodi setCategory(Category category){
this.category=category;
}
}
2.2、也可以在setCategory方法上面加上@Autowired注解,达到同样效果
package com.demo.pojo;
public class Product{
private int id;
private String name;
//@Autowried//采用注解注入Category属性,不用在xml配置bean的Product引入Category
private Category category;//类别属性
//属性的getter和setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public Category getCategory(){
return category;
}
@Autowried
pulic void setCategory(Category category){
this.category=category;
}
}
2.3、还可以采用@Resource注解
package com.demo.pojo;
import javax.annotation.Resource;
public class Product{
private int id;
private String name;
//@Autowried//采用注解注入Category属性,不用在xml配置bean的Product引入Category
@Resource(name="category")
private Category category;//类别属性
//属性的getter和setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public Category getCategory(){
return category;
}
//@Autowried
pulic void setCategory(Category category){
this.category=category;
}
}
3、TestSpring测试
package com.demo.test; import org.springframework.context.ApplicationContext;
import org.springframework.support.ClassPathXmlApplicationContext; import com.demo.pojo.Product; public class TestSpring{
public static void main(String[] args){
//加载applicationContext.xml配置文件
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
//根据ApplicationContext对象提供的getBean()方法,获取配置bean的name属性值。
Product product=(Product)context.getBean("product");
System.out.println(product.getName());//Apple
System.out.pringln(product.getCategory().getName());//Fruit
}
}
4、也可以不用再applicationContext.xml中一个一个配置bean。
配置bean属性的都去掉,直接加上:
<context:component-scan base-package="com.demo.pojo"/>
作用:告诉Spring,bean都放在com.demo.pojo包下
applicationContext.xml修改为:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema.context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.demo.pojo"/> </beans>
4.1、使用@Component注解,为pojo加上注解,说明这个类是bean
Product.java:
package com.demo.pojo;
import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component("product")
public class Product{
private int id;
private String name="Apple";
//@Autowried//采用注解注入Category属性,不用在xml配置bean的Product引入Category
@Resource(name="category")
private Category category;//类别属性
//属性的getter和setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public Category getCategory(){
return category;
}
//@Autowried
pulic void setCategory(Category category){
this.category=category;
}
}
Category.java
package com.demo.pojo;
import org.springframework.stereotype.Component;
@Component("category")
public class Category {
private int id;
private String name="Fruit";
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4.2、TestSpring测试
package com.demo.test; import org.springframework.context.ApplicationContext;
import org.springframework.support.ClassPathXmlApplicationContext; import com.demo.pojo.Product; public class TestSpring{
public static void main(String[] args){
//加载applicationContext.xml配置文件
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
//根据ApplicationContext对象提供的getBean()方法,获取配置bean的name属性值。
Product product=(Product)context.getBean("product");
System.out.println(product.getName());//Apple
System.out.pringln(product.getCategory().getName());//Fruit
}
}
十七、Spring框架(IOC/DI)的更多相关文章
- Spring框架——IOC&DI
Spring Spring 目标 内容 Spring与web整合的原理 Spring 中包含的关键特性 Spring架构图 企业级框架 企业级系统 IOCDI IOC DI IOC和DI 为什么使用依 ...
- Spring框架-IOC/DI详细学习
一.IOC/DI概念 参考博客:https://www.cnblogs.com/xdp-gacl/p/4249939.html IOC(inversion of control, 控制反转)是一种设计 ...
- Spring框架IOC容器和AOP解析 非常 有用
Spring框架IOC容器和AOP解析 主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面 ...
- 自己动手写Spring框架--IOC、MVC
对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...
- Spring框架IOC,DI概念理解
1.什么是框架? 框架是一种重复使用的解决方案,针对某个软件开发的问题提出的. Spring框架,它是一个大型的包含很多重复使用的某个领域的解决方案. Spring的理念:不要重复发明轮子. 2.Sp ...
- Spring-初识Spring框架-IOC控制反转(DI依赖注入)
---恢复内容开始--- IOC :控制反转 (DI:依赖注入)使用ioc模式开发 实体类必须有无参构造方法1.搭建Spring环境下载jarhttp://maven.springframework. ...
- Spring框架IOC容器和AOP解析
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
- spring框架--IOC容器,依赖注入
思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action 多个 [维护成员变量] service 一个 [不需要维护公共变量] dao 一个 [不需要维护 ...
- Spring的IOC/DI使用到的技术
一.了解Spring IOC/DI 1:Spring有两大核心技术,控制反转(Inversion of Control, IOC)/依赖注入(Dependency Injection,DI)和面向切面 ...
- Spring框架ioc概括
什么是Spring且能做什么 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能由EJB完成 ...
随机推荐
- 用flvplayer.swf在网页中播放视频(网页中flash视频播放的实现)
原:http://blog.csdn.net/ricciozhang/article/details/46868201 由于公司项目的需求,需要在展示一些信息的时候能够播放视频,拿到这个要求,我就从最 ...
- 5、lvs使用进阶(01)
四层.七层负载均衡的区别 https://jaminzhang.github.io/lb/L4-L7-Load-Balancer-Difference/ netfilter/iptables简介 ...
- window7安装python的xgboost库方法
window7安装python的xgboost库方法 1.下载xgboost-master.zip文件,而不是xgboost-0.4a30.tar.gz,xgboost-0.4a30.tar.gz是更 ...
- python中常用的模块二
一.序列化 指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化, 不同的序列化结果不同,但目的是一样的,都是为了存储和传输. 一,pickle.可 ...
- jq ‘’操作‘’伪元素
1. 伪元素非 dom 元素,jq无法操作,但可以间接影响. 2. 操作方式 2.1 修改类 <!DOCTYPE html> <html lang="en"> ...
- 修改Anaconda中的Jupyter Notebook默认工作路径
这二天,安装了anaconda想更改jupyter的工作路径,在网上找了一下 方式1. 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如 ...
- 第 8 章 容器网络 - 058 - flannel 概述
flannel 概述 flannel 是 CoreOS 开发的容器网络解决方案. flannel 为每个 host 分配一个 subnet,容器从此 subnet 中分配 IP,这些 IP 可以在 h ...
- Axure 元件焦点的控制
讲解如何控制光标的位置,主要学习了以下三种场景: 1.点击邮箱或者密码时,光标分别自动定位到email.password的文本框处: 2.还有将密码对应的文本框的内容设置为密码的格式(····) 3. ...
- 启动node程序报错:event.js:183 throw er; // unhandled 'error' event
启动node程序时,报如下错误:
- ffmpeg 加 logo
How to add a watermark or logo to any corner or the center of a video with FFMPEG. ffmpeg –i video.m ...