Spring_01_IoC初级总结

1.IoC简介 (转载)

(原文:http://jinnianshilongnian.iteye.com/blog/1413846)  via:@jinnianshilongnian

1.1、IoC是什么


  Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

  ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

  ●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

1.2、IoC能做什么

  IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

1.3、IoC和DI

  DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

  理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

  ●谁依赖于谁:当然是应用程序依赖于IoC容器;

  ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

  ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

  ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

  IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

2、代码实现(原创)

2.1准备工作

2.1.1jar包与项目目录结构

spring原项目下

spring\ 1.aopalliance-1.0.jar 2.aopalliance-alpha1.jar 3.aspectjrt.jar aspectjweaver.jar 4.commons-logging.jar

Spring\spring-framework-3.0.0.RELEASE\dist里的所有jar

2.1.2vo包,dao包,service包代码

public calss student{//voprivate String name;private Integer age;/** getter and setter */
}
public interface IStudentDao {//daopublic void add(Student student);
}
public interface IStudentDaoByMybatis {public void add(Student student);
}
public class StudentDaoImpl implements IStudentDao{//dao.impl@Overridepublic void add(Student student) {System.out.println(student.getName()+"成功通过JDBC添加");}
}
public class StudentDaoByMybatisImpl implements IStudentDaoByMybatis{//dao.impl@Overridepublic void add(Student student) {System.out.println(student.getName()+"成功通过Mybatis添加");}
}
public interface IStudentService {//service包public void add(Student student);
}

2.1.3 spring.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- xmlns:aop="http://www.springframework.org/schema/aop"  声明要用aop的标签xsi:schemaLocation= aop的标签地址"http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"  -->
</beans>

2.2注入IoC(通过spring.xml)

  2.2.1重点标签与属性解释


 (一)bean的生命周期,两个常用属性:lazy-init和scope
  1.懒加载属性lazy-init,每次启动IoC时,通常需要启动的大的数据库启动很耗时(比如数据库连接池),用再加载,通过这种方式提高速度,true是开启,false是关闭,default是默认,beans的全局没有设置时default默认是false关闭 
  2.scope,设置模式,singleton是单例,prototype是多例,每次用到IoC容器里的bean时,单例用的是一个,多例可用多个,singleton是单例的,整个项目共用一个对象,应用很多(锤子);prototype是多例的,项目会用多个对象,多用于Controller注入(钉子)
  3.init-method,bean初始化时调用的方法,参数里写bean对应的类里的方法名,多用于初始化字典值
4.destroy-method,bean销毁时用的方法 ,参数里写bean对应的类里的方法名,多用于数据库连接的关流(现在开始可以自动关了).注意:这个bean的scope用prototype的时候(也就是多例时),不调用该bean的destroy-method

(二)依赖注入, autowire自动装载可省略以下<property>,通过反射的方式,获取这个bean对应的类里的各种信息
1.byName通过set方法的名称注入(装载)(原理是反射),根据ServiceImpl里得到的set方法的名称
2.byType通过实现的接口类型注入(装载), 比如上面这个org.jsoft.dao.IStudentDao
3.no是不自动注入(装载)

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- default-autowire-candidates=""如果写在beans标签里的属性为默认的全局aotowire --><!-- default-lazy-init="" 如果写在beans标签里的属性为默认的全局aotowire -->
<!-- 名称必须规范,后缀的Dao必须和该类后缀一样(包括大小写) --><bean id="studentDao" class="org.jsoft.dao.impl.StudentDaoImpl"></bean><bean id="studentDaoByMybatis" lazy-init="true"  class="org.jsoft.dao.impl.StudentDaoByMybatisImpl"></bean><bean id="studentService" class="org.jsoft.service.impl.StudentServiceImpl" scope="singleton" init-method="a" destroy-method="b" autowire="byType"><!-- 包含了另一个bean“studentDAO” <property name="studentDao"><ref bean="studentDao"/></property> --></bean><!-- more bean definitions go here --></beans>

2.2.2 java代码

StudentServiceImpl里的代码

public class StudentServiceImpl implements IStudentService{private IStudentDao studentDao;private IStudentDaoByMybatis studentDaoByMybatis;//	public IStudentDao getStudentDaoByMybatis() {//对比ByName用法时用
//		return studentDao;
//	}
//	public void setStudentDaoByMybatis(IStudentDao studentDaoByMybatis) {
//		this.studentDao = studentDaoByMybatis;
//	}//需要写getset方法public IStudentDaoByMybatis getStudentDaoByMybatis() {return studentDaoByMybatis;}public void setStudentDaoByMybatis(IStudentDaoByMybatis studentDaoByMybatis) {this.studentDaoByMybatis = studentDaoByMybatis;}public IStudentDao getStudentDao() {return studentDao;}public void setStudentDao(IStudentDao studentDao) {this.studentDao = studentDao;}//	@Override
//	public void add(Student student) {
//		studentDao.add(student);
//		//System.out.println(student.getName());
//		
//	}@Overridepublic void add(Student student) {studentDaoByMybatis.add(student);//System.out.println(student.getName());}
//	@Override
//	public void add(Student student) {
//		studentDaoByMybatis.add(student);
//		//System.out.println(student.getName());
//		
//	}public void a(){//bean初始化时调用System.out.println("StudentServiceImpl.a(),初始化");}public void b(){//bean销毁时调用System.out.println("StudentServiceImpl.b(),销毁");}
}
//测试用的Main方法
//ApplicationContext 是接口,下面的ClassPathXmlApplicationContext也可以用,后者可以用.close()方法
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring/spring.xml"});
Student s = new Student();
s.setName("Joy");
IStudentService studentService = context.getBean("studentService",IStudentService.class);
IStudentService studentService2 = context.getBean("studentService",IStudentService.class);//scope的属性
//singleton是单例,只用一个,studentService和studentService2被赋予的是一个bean对象,内存地址一样,所以会返回true;
//而prototype是多例,会给studentService赋予来自一个bean的不同的对象
System.out.println(studentService == studentService2);//对比对象在内存里的地址,一样就返回true,studentService.add(s);
context.close();

2.3注入IoC(通过注解)

2.3.1spring.xml的配置

注意:

1.beans的xmlns:context="http://www.springframework.org/schema/context"这句话一定要有,声明要用注解

2.beans的xsi:schemaLocation属性里一定要有"http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd "注解的地址

3.下面的context标签,写上,注解才会生效

<?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: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.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd"><!-- --><context:annotation-config/><!-- 扫描组件 --><context:component-scan base-package="org.jsoft"/></beans>

2.3.2注解

1@Component("这个bean的id")都可以用,写在声明类名的上边

2.@Service("这个bean的id")用在serviceimpl里声明类名的上边

3@Repository("这个bean的id")dao持久层里声明类名的上边

4.@Autowired 写在serviceImpl里的声明过的dao的set方法上   @Qualifier("用到的dao层的bean的id")写在这个方法声明参量的括号里参量类型的前边           *不常用*

5.@Controller 用在C层里

6.@Resource("用到的bean的id"),声明的Service或者Dao上面,里面写对应的bean的id

2.3.3Demo(没有@Controller)

1.dao层,只需要写在实现类里,

@Repository("studentDaoImpl")//注入bean
public class StudentDaoImpl implements IStudentDao{//实现了IStudentDao@Overridepublic void add(Student student) {System.out.println(student.getName()+"成功通过JDBC添加");}
}
@Repository("studentDaoByHibernateImpl")
public class StudentDaoByHibernateImpl implements IStudentDao{//也实现了IStudentDao@Overridepublic void add(Student student) {System.out.println(student.getName()+"成功通过Hibernate添加");}
}
@Repository("studentDaoByMybatisImpl")
public class StudentDaoByMybatisImpl implements IStudentDaoByMybatis{//实现了另外一个@Overridepublic void addByMybatis(Student student) {System.out.println(student.getName()+"成功通过Mybatis添加");}
}

2.service层,同样地只需要写在实现类里

@Service(value="studentService")
public class StudentServiceImpl implements IStudentService{//@Resource(name="studentDaoImpl")private IStudentDao studentDao;private IStudentDao studentDaoByHibernate;@Resource(name="studentDaoByMybatisImpl")private IStudentDaoByMybatis studentDaoMyBatis;//@Resource会通过暴力反射找到的bean名字,没有用getset方法
//	public IStudentDao getStudentDao() {
//		return studentDao;
//	}
//	public void setStudentDao(IStudentDao studentDao) {
//		this.studentDao = studentDao;
//	}//	@Override
//	public void add(Student student) {
//		studentDao.add(student);
//		
//	}@Overridepublic void add(Student student) {studentDaoByHibernate.add(student);}@Overridepublic void addByMybatis(Student student) {studentDaoMyBatis.addByMybatis(student);}public IStudentDao getStudentDao() {return studentDao;}//也可以自动装载,无需写@Resourcepublic void setStudentDao(IStudentDao studentDao) {this.studentDao = studentDao;}public IStudentDao getStudentDaoByHibernate() {return studentDaoByHibernate;}@Autowiredpublic void setStudentDaoByHibernate(@Qualifier("studentDaoByHibernateImpl")IStudentDao studentDaoByHibernate) {this.studentDaoByHibernate = studentDaoByHibernate;}public IStudentDaoByMybatis getStudentDaoMyBatis() {return studentDaoMyBatis;}public void setStudentDaoMyBatis(IStudentDaoByMybatis studentDaoMyBatis) {this.studentDaoMyBatis = studentDaoMyBatis;}

3.main方法的测试与结果

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring/spring.xml"});
Student s = new Student();
s.setName("Joy");
IStudentService studentService = context.getBean("studentService",IStudentService.class);
studentService.add(s);
context.close();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习工具caffe详细安装指南

转载自 深度学习工具caffe详细安装指南前言&#xff1a; 在一台系统环境较好的linux机器上可以很容易的安装caffe&#xff0c;但是如果系统本身很旧&#xff0c;又没有GPU的话&#xff0c;安装就太麻烦了&#xff0c;所有都得从头做起&#xff0c;本文档旨在尽可能覆盖安装所要…

Spring_02_AOP初级总结

1.AOP简介 是对OOP编程方式的一种补充。翻译过来为“面向切面编程”。 可以理解为一个拦截器框架&#xff0c;但是这个拦截器会非常武断&#xff0c;如果它拦截一个类&#xff0c;那么它就会拦截这个类中的所有方法。如对一个目标列的代理&#xff0c;增强了目标类的所有方法…

spring(11)使用对象-关系映射持久化数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(11)使用对象-关系映射持久化数据” 的相关知识&#xff1b;【2】spring 与 java 持久化API1&#xff09;intro&#xff1a;…

漫画:什么是数据仓库

转载自 玻璃猫 算法与数据结构一个故事 在很久很久以前&#xff0c;世界上生活着许多种族&#xff0c;有人类&#xff0c;有矮人&#xff0c;有精灵......他们有着不同的信仰&#xff0c;不同的文化&#xff0c;彼此相安无事。可是&#xff0c;有一个猥琐男却偏偏想要统治整个世…

SpringMVC_初级总结

1.SpringMVC的工作原理 浏览器发出一个http请求给服务器&#xff0c;如果匹配DispatcherServlet的请求映射路径&#xff08;在web.xml中指定&#xff09;&#xff0c;服务器将请求转交给DispatcherServlet.DipatcherServlet接收到这个请求之后&#xff0c;根据请求的路径&#…

tomcat中配置jndi数据源以便spring获取

【0】README0&#xff09;intro to jndi&#xff0c; plase visit intro to jndi&#xff1b;1&#xff09;本文译自 Configuring Spring MVC JdbcTemplate with JNDI Data Source in Tomcat&#xff1b;2&#xff09;本文旨在分析如何通过springmvc 获取 JNDI 数据源 以连接到…

Machine Learning:十大机器学习算法

转载自 Machine Learning&#xff1a;十大机器学习算法摘要: - 机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 - 基本的机器学习算法&#xff1a;线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强 机…

Java的值传递解析

值传递与引用传递 最近学基础的时候&#xff0c;老师讲了值传递和引用传递&#xff0c;这个问题一直不太明白&#xff0c;上网查了很多资料&#xff0c;按照自己的理解整理了一遍&#xff0c;发现之前不太明白的地方基本上想明白了&#xff0c;如有不正确的地方&#xff0c;欢…

spring(13)缓存数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(13)缓存数据” 的相关知识&#xff1b;2&#xff09;缓存&#xff1a;缓存可以存储经常会用到的信息&#xff0c;这样每次需…

漫画:什么是分布式事务

转载自 漫画&#xff1a;什么是分布式事务&#xff1f;————— 第二天 —————————————————假如没有分布式事务 在一系列微服务系统当中&#xff0c;假如不存在分布式事务&#xff0c;会发生什么呢&#xff1f;让我们以互联网中常用的交易业务为例子&#…

Spring4.2.6+SpringMVC4.2.6+MyBatis3.4.0 整合

【0】README0&#xff09;本文旨在 review Spring4.2.6SpringMVC4.2.6MyBatis3.4.0 整合过程&#xff1b;1&#xff09;项目整合所涉及的源代码&#xff0c;please visit https://github.com/pacosonTang/MyBatis/tree/master/spring4mvc_mybatis32&#xff09;由于晚辈我还不…

ibatis(0)ibatis 与 mybatis 简述

【0】README:1&#xff09;本文旨在给出 ibatis 与 mybatis 简述&#xff0c;简述内容转自 如下链接&#xff1b;【1】main contents1&#xff09;apache offical declarationhttp://ibatis.apache.org/.apache ibatis is retired at the apache software foundation (2010/06/…

Java面试大纲

转载自 金三银四跳槽季&#xff0c;Java面试大纲跳槽时时刻刻都在发生&#xff0c;但是我建议大家跳槽之前&#xff0c;先想清楚为什么要跳槽。切不可跟风&#xff0c;看到同事一个个都走了&#xff0c;自己也盲目的面试起来&#xff08;期间也没有准备充分&#xff09;&#x…

ibatis(1)ibatis的理念

【0】README1&#xff09;本文部分内容转自 “ibatis in action”&#xff0c;旨在 review “ibatis的理念” 的相关知识&#xff1b;【1】结合所有优秀思想的混合型解决方案在现实世界中&#xff0c;混合型解决方案随处可见。将两个看上去相悖的思想在中间处巧妙结合&#xff…

究竟啥才是互联网架构“高并发”

转载自 究竟啥才是互联网架构“高并发”一、什么是高并发 高并发&#xff08;High Concurrency&#xff09;是互联网分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计保证系统能够同时并行处理很多请求。高并发相关常用的一些指标有响应时间…

ibatis(2)ibatis是什么

【0】README1&#xff09;本文部分内容转自 “ibatis in action”&#xff0c;旨在 review “ibatis是什么” 的相关知识&#xff1b;2&#xff09;intro to ibatis&#xff1a; ibatis 就是数据映射器&#xff0c;Martin Fowler在《企业应用架构模式》中&#xff0c;对 data m…

究竟啥才是互联网架构“高可用”

转载自 究竟啥才是互联网架构“高可用”一、什么是高可用 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务&#xff0c;我们说…

maven(3)maven3.3.9使用入门

【0】README1&#xff09;maven 安装step1&#xff09;检查 jdk 是否安装且 环境变量 JAVA_HOME 是否设置&#xff1b;step2&#xff09;download maven&#xff1a; https://maven.apache.org/download.cgi?Preferredftp://mirror.reverse.net/pub/apache/step3&#xff09;…

TCP接入层的负载均衡、高可用、扩展性架构

转载自 TCP接入层的负载均衡、高可用、扩展性架构 一、web-server的负载均衡 互联网架构中&#xff0c;web-server接入一般使用nginx来做反向代理&#xff0c;实施负载均衡。整个架构分三层&#xff1a; 上游调用层&#xff0c;一般是browser或者APP 中间反向代理层&#xff…

使用poi统计工作职责

1 创建一个新的sheet工作页 Sheet job workbook.createSheet("工作职责统计"); 2 查询工作职责问题选项列表&#xff0c;并设置第一行倒出时间 List<Syslistconfig> listconfigs syslistconfigDao.listConfig(29); //工作职责问题选项列表job.createRow(0)…