spring ioc注入
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring ioc注入内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring ioc注入相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring ioc注入相关知识
-
最详细的 Spring IOC 注入 (xml 注入 + 注解注入)@[toc](Spring IOC 容器的基本使用) 一、为什么要使用 Spring? 1.1 传统的 MVC 架构的程序 1.2 程序耦合性过高? 1.3 如何解耦? 1.4 Spring IOC 的依赖注入 二、Spring IOC 的依赖注入 2.1 使用构造函数完成依赖注入 2.1.1 标签的使用讲解 2.1.2 构造函数依赖注入的优缺点 2.1.3 使用构造函数完成依赖注入的实例 2.2 使用 setter 完成注入 2.2.1 使用 setter 完成依赖注入的功能 2.2.2 基于 setter 完成依赖注入的分析 2.3 复杂数据类型注入 2.3.1
-
Spring IoC是如何进行依赖注入的依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码。而Spring IoC这个思想的作用体现在两个方面,一是如何将Bean装配到容器中去以及如何从容器中获取Bean,二是如何解决Bean之间的依赖关系,换句话说,就是如果由IoC容器来管理依赖关系,当一个Bean需要依赖另外一个Bean时,IoC容器如何实现这样的依赖关系。 解决Spring中Bean之间的依赖的实现方式,在Spring的概念中就被称之为依赖注入(Dependency
-
Spring IOC的核心机制:实例化与注入上文我们介绍了IOC和DI,IOC是一种设计模式,DI是它的具体实现,有很多的框架都有这样的实现,本文主要以spring框架的实现,来看具体的注入实现逻辑。 spring是如何将对象加入容器的 spring将对象加入容器的方式有很多种,最主要的是xml和注解的形式,而当下注解的形式应用更加的广泛,所以这里我们也主要介绍注解注入模式下的相关知识点。 spring下的注解也是有很多种的,其中应用最为广泛的就是模式注解。 模式注解 stereotype annotations 咋一看,这是啥,说实话我也不太清楚,官方说
-
【死磕 Spring】----- IOC 之深入理解 Spring IoC在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为【死磕 Spring】系列博客的第一篇博文,主要介绍 IoC 基本概念和各个组件。IOC 理论IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。如何理解“控制反转”好呢?理解好它的关键在于我们需要回答如下四个问题:谁控制谁控制什么为何是反转哪些方面反转了在回答这四个问题之前,我们先看 IOC 的定义:所谓 IOC ,就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系上面这句话是整个 IoC 理论的核心。如何来理解这句话?我们引用一个例子来走阐述(看完该例子上面四个问题也就不是问题了)。已找女朋友为例(对于程序猿来说这个值得探究的问题)。一般情况下我们是如何来找女朋友的呢?首先我们需要根据自己的需求(漂亮、身材好、性格好)找一个妹子
spring ioc注入相关课程
spring ioc注入相关教程
- 1.1 控制反转 类似于 Spring 框架的 Ioc 容器,Maven 也沿用了这种做法,将其中与生命周期进行绑定的 Mojo Bean 进行托管,将对象的创建和控制权交与 Ioc 容器来进行管理。在 Ioc 容器中比较重要的一个概念就是依赖注入,在 Maven 编程的时候,会使用到两种依赖注入方式:构造器注入: 即在对象被创建的时候,通过构造器参数,将对象的值传入并赋值;set 方法注入: 即通过对象属性的 set 方法来为对象的属性赋值。总的来讲,在 Maven 中实现的 Ioc 容器和 Spring 中的 Ioc 容器是非常类似的。
- 2. 什么是 IoC? 来自百度百科的解释 —— 控制反转(IoC):(Inversion of Control,缩写为 IoC),是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称 DI),还有一种方式叫 “依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。慕课解释如何理解好 IoC 呢?上一个小节中,我们使用简单的语言对它做了一个描述 —— IoC 是一种设计模式。将实例化对象的控制权,由手动的 new 变成了 Spring 框架通过反射机制实例化。那我们来深入分析一下为什么使用 IoC 做控制反转,它到底能帮助我们做什么。我们假设一个场景:我们在学习 Web 阶段的过程中,一定实现过数据的查询功能,那么这里我就举一个实例:我们有这样几个类:UserServletUserService 接口 UserServiceImpl 接口的实现类 UserDao代码如下:/*UserServlet 作为控制器 接收浏览器的请求*/public class UserServlet extends HttpServletRequest { //用户的业务类 提供逻辑处理 用户相关的方法实现 private UserService userService; public void service(HttpServletRequest request,HttpServletResponse response){ //手动实例化UserService接口的实现类 userService = new UserServiceImpl(); List<User> list = userService.findAll(); //省略结果的跳转代码 } }/*用户的业务接口UserService*/public interface UserService{ public List<User> findAll(); }/*UserServiceImpl 作为用户的业务实现类 实现类UserService的接口*/public class UserServiceImpl implements UserService{ //用户的Dao private UserDao userDao; public List<User> findAll(){ //手动实例化Dao userDao = new UserDao(); return userDao.findAll(); }}问题分析:上面的代码有什么问题吗? 按照我们学习过的知识… 答案是没有。因为 Dao 只要数据源编写代码正确, 完全可以实现数据的增删改查 ,对吗?但是分析分析它我们发现:代码耦合性太强 不利于程序的测试:因为 userServlet 依赖于 userService ,而 userService 依赖于 userDao , 那么只要是被依赖的对象,一定要实例化才行。所以我们采取在程序中硬编码,使用 new 关键字对对象做实例化。 不利于测试,因为你不能确保所有使用的依赖对象都被成功地初始化了。有的朋友很奇怪,对象实例化有什么问题吗? 如果构造参数不满足要求,或者你的构造进行了逻辑处理,那么就有可能实例化失败;代码也不利于扩展:假设一下,我们花了九牛二虎外加一只鸡的力气,整理好了所有的类使用的依赖,确保不会产生问题,那么一旦后续我们的方法进行扩充,改造了构造函数,或者判断逻辑,那么是不是所有手动 new 对象的地方都需要更改? 很明显这就不是一个优雅的设计。解决方式:Spring 的 IoC 完美的解决了这一点, 对象的实例化由 Spring 框架加载实现,放到 Spring 的容器中管理,避免了我们手动的 new 对象,有需要用到对象实例依赖,直接向 Spring 容器要即可,而一旦涉及到对象的实例修改,那么 只需更改 Spring 加载实例化对象的地方,程序代码无需改动,降低了耦合,提升了扩展性。
- 3.3 Spring 的核心功能 大家对于使用 Spring 框架开发项目已经司空见惯了… 但是对于它的功能或者作用,描述出来总是差点什么,那么现在咱们详细聊一聊它的核心功能。核心功能:控制反转(IoC): 简单理解 IoC 是一种设计模式,将实例化对象的控制权 由手动的 new 变成了 Spring 框架通过反射机制实例化;依赖注入(DI): 首先理解依赖,程序运行的需要可以称之为依赖。由于 Spring 框架通过反射技术实例化了对象,并将对象的实例存入在容器进行管理。那么如果一个类中的属性为某个其余的类,属性无需手动赋值,通过 spring 的配置文件,或者 Spring 提供的注解,通过 spring 框架可以实现直接注入属性;面向切面编程 (AOP): 何谓切面,切面是数学中的一个概念,表示只有一个点接触到球体的一个平面称呼为切面,而接触点称呼为切点。那么在 Spring 中,切面编程指的就是在程序运行某个方法的时候,不修改原始执行代码逻辑,由程序动态地执行某些额外的功能,对原有的方法做增强,这就叫做面向切面编程,那个被监测的执行方法,称呼为切入点。知识小结:Spring 是分层的 Java SE/EE 应用 轻量级开源框架,以 IoC(Inverse of Control:控制反转)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多 著名的第三方框架和类库, 是使用最多的 Java EE 企业应用开源框架。使用 Spring 的意义在于:对于 bean 对象的实例管理更加方便,代码编写更加优雅,降低代码的耦合性,提升代码的扩展性。
- 2. 依赖注入案例 2.1概念介绍知识回顾对于依赖注入,我们在第一章第一节已经介绍过,我们回顾一下概念解释上面是我们之前对于依赖注入的一个通俗解释。那么这里再着重强调一下 IOC 控制反转与 DI 依赖注入的关系:IOC 控制反转是将对象实例化的动作交由了 Spring 框架, 它的作用是降低了程序的耦合,不需要我们手动的创建对象,但是程序的耦合性还是存在。对象中肯定会有一些其余对象的引用,那么这种引用就称呼为对象的依赖,而 DI 依赖注入其实 是 IOC 设计思想的一种表现形式。对于 这种属性依赖,我们无需手动赋予,也是讲赋值的动作交给 Spring ,那么这种操作就是 依赖注入。依赖注入方式:第一种方式是通过 xml 配置的方式实现;第二种方式是在属性或者方法上使用注解的方式实现。那么,本章节先带大家体验下 xml 方式实现依赖注入。2.2 工程实现:搭建动作介绍创建一个 maven 工程导入Spring 使用的依赖编写业务层的 Service 和持久层的 Dao java 类编写 Spring 的配置文件创建工程 导入依赖 省略可以参考之前创建过的IOC工程java 代码创建 Servcie 的接口和接口的实现类,代码如下://接口代码public interface UserService { public void deleteById(Integer id);}//实现类代码public class UserServiceImpl implements UserService { private UserDao userDao; public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void deleteById(Integer id) { System.out.println("删除的方法执行"); }}UserDao 接口和实现类代码://dao接口代码public interface UserDao {}//dao实现类代码public class UserDaoImpl implements UserDao {}代码解释: dao的接口和实现类中并没有方法,只是为了测试 作为service中的属性依赖,可以实现由 Spring 完成动态注入。重点来了:spring 的核心配置文件:配置解释:在上面的配置文件中:bean 标签是描述一个被实例化的类 而 property 则表示一类中的属性property 标签中的属性 name 一般我们写成类中的属性名称, 实际上,起决定作用的并不是属性名,下面示例再展示ref 表示当前的属性 是一个引用对象,而引用的是谁呢? ref 中的值 必须是在容器中已经实例化的一个引用对象的唯一标识。value 当前的属性可以直接赋值,所以通过 value 中,填写要赋予的数值即可测试结果代码解释可以看到 我们得到了 service 中的类属性 Userdao 的实例,并且也 得到了 字符串属性 userName的值 zs2.3 property注入属性的解释刚刚我们在上面的示例中 展示了xml依赖属性的注入,也是比较好理解。这里我们强调一下使用的注意事项:如果是 property 属性标签实现属性注入,那么类中必须由配置在 property 标签中 name 属性的 set 方法下面我们测试一下set方法的改变:先讲 service 中 dao 的 set 方法改造如下:public void setDao(UserDao userDao) { System.out.println("执行了set方法 给dao属性赋值"); this.userDao = userDao;}这时候代码中的set方法变成了 setDao 配置文件不变,依然是<property name="userDao" ref="userDao"></property>我们看看会产生什么问题Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'userDao' of bean class [com.wyan.service.UserServiceImpl]: Bean property 'userDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:247) at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:426) at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:278) at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:266) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:97) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:77) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1646)可以看到异常的堆栈信息 无效的 userDao 属性, userDao 不可以 或者 没有有效的 setter 方法提供。更改xml文件中的 property 标签的 name 属性 为 dao<property name="dao" ref="userDao"></property>测试结果如下:所以我们说 property 中的 name 属性不一定要跟 Java类中的属性名保持一致 而是必须跟 setter 方法的名称一致
- 2.2 @Autowired 注解 1. 为了测试效果,我们创建 Service 和 Dao 两个类, Dao 作为 Service 的依赖。代码如下://service实现类的代码@Servicepublic class UserServiceImpl implements UserService { @Autowired private UserDao userDao; public void saveUser() { System.out.println("执行service中的保存逻辑"); }}//dao实现类的代码@Repositorypublic class UserDaoImpl implements UserDao { public void saveUser() { System.out.println("执行dao的保存方法"); }}代码解释:上面代码可以看到,两个类的实例化方式都是通过注解注入到容器, 并且在 service 实现类中的 userDao 属性上面加了注解 @Autowired。我们首先测试下:能否通过这个注解,实现依赖注入,另外再测试下它是否是按照类型注入。2. 配置文件的内容为注解实现 IoC。配置文件解释: 注解实现 IoC 的章节说过,需要通过组件扫描来实例化容器。3. 编写测试代码public class SpringAnTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); UserService userService = context.getBean(UserService.class); userService.saveUser(); }}测试结果:结果解释可以看到 service 中的代码执行,并且通过 dao 的示例调用的方法也执行了,那么说明 @Autowired 注解实现了属性 userDao 的注入。当然这种操作是小儿科,没有一个同学觉得他有什么。 我们验证下它的特点:set 方法我们是省略了,那么它是否按照类型注入的呢?如果我们的实现类中有多个 userDao 接口的实现类呢,又该如何呢?4. 添加 UserDaoImpl2 一样实现 userDao 的接口,代码如下:@Repositorypublic class UserDaoImpl1 implements UserDao { public void saveUser() { System.out.println("执行dao1的保存方法"); }}测试结果结果解释:可以看到上面控制台打印的异常堆栈信息,清楚的提示错误原因,没有指定的 bean 实例 UserDao 类型的,期待单个 bean 匹配,但是找到了两个。一个是 userDaoImpl 一个是 userDaoImpl1。看到这可以证明: @Autowired 注解是按照类型注入,如果匹配的类型多了就会报错。疑问导出:难道使用了 Spring 框架以后,我们的接口只能有一个实现类吗? 当然不可能,毕竟我们看 Spring 的源码的时候 已经看到了,很多的接口对应一大堆的实现类。那么,针对这种多个接口实例的情况,怎么解决的呢?继续我们注解的学习。
- 4. Spring MVC 的特性 要了解 Spring MVC 的功能特性,就需要从 WEB 应用开发的源头说起。WEB 应用程序的主流开发技术有 3 种:servlet;php;.net。Servlet 是基于 Java 语言的动态 web开发技术,Servlet 指的是 J2EE 中所提出来的企业级服务器开发规范。原生 Servlet 构建的 MVC 开发模式有几个缺点:Servlet 本身采用单例设计模式,生命周期由服务器维护,存在线程安全隐患的问题;理论上讲,每一次不同的 http 请求需要一个 Servlet 组件来响应,当请求类型比较多时,Servlet 就会相应增加,也意味着每一个 Servlet 都可以成为进入服务器的入口。想想你家里对外开了好多扇门,小偷终能找到破绽;随着 Servlet 数量的增加,对服务器的存储空间也会产生压力;使用 Servlet 响应用户请求时,每一个响应逻辑都需要开发者不厌其烦地做些重复的事情,如,解析请求包中的数据、构建响应包、设置页面跳转等等。这些问题,在 Spring MVC 中都得到了很好的解决。使用 Spring MVC 时,就只有一个门可以进入应用程序,这个门叫前端(中央)控制器,所有请求统一经过这个前端控制器分流到具体的内部响应组件;Spring MVC 是 Spring 家族中的一员,有句话叫做“近水楼台先得月”。使用 Spring MVC 时所需要的 WEB 组件也好、其它的逻辑组件也好,都经由 Spring IOC 创建,Spring IOC 容器对组件的生命周期可进行伸缩性设置管理,可根据组件特性保证其线程安全性;Spring MVC 和 Spring 有直属血缘的关系,两者完美结合,使得程序的安全性和稳定性有一定的保证;Spring MVC 利用 Spring 的自动注入功能,能轻松地装配好各组件之间的依赖,开发者只需要关注编写自己的业务逻辑便可,和所有框架理念一样,解放双手,释放大脑。Spring MVC 设计的初衷,就是要做成一款轻量级框架,其内在的原力让我们一起在后续课程中慢慢释放。
spring ioc注入相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议