Spring框架之IOC(控制反转)

来源:互联网 发布:水仙花数java三位数 编辑:程序博客网 时间:2024/05/16 12:51

    • 第一章Spring框架简介
    • 第二章IOC控制反转和DI依赖注入
    • 第三章IOC控制反转实现的方式
      • 1XML配置方式
      • 2注解方式
      • 3自动装配方式

第一章Spring框架简介

IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合。所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

spring的基本框架主要包含六大模块:DAO、ORM、AOP、JEE、WEB、CORE

这里写图片描述

Spring DAO:Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。

Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中Spring还提供HibernateDaoSupport工具类,简化了Hibernate的操作 。

Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 。

Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事物控制 。

Spring JEE:J2EE开发规范的支持,例如EJB 。

Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。

第二章IOC(控制反转)和DI(依赖注入)

IOC:也即控制反转,DI即依赖注入,控制反转IOC和依赖注入DI其实就是同个概念的两个不同角度的解释。
控制反转可以理解为获取依赖对象的控制反转过来。有反转的概念自然就有正转的概念。

若有两个类,类A和类B,若类A依赖与类B,则类A要获取类B的方法,这时我们可以按照传统的JavaSE思想,在A类里,写代码B b = new B();,通过new关键字获取A类的依赖对象,或者通过工厂模式进行获取,当然还有等等其它方法。这些方法,就属于正转的方法,因为A类获取B类就是通过主动的方法进行获取的,统称为正转的方法。

然后,什么是反转呢?既然正转是主动的方式,那么反转就是被动的方式。也即我们要获取某个类的依赖对象,不需要类主动去获取。然后在Spring框架里是怎么实现的呢?在Spring框架里,实现IOC,是通过IOC容器实现的,由IOC容器负责创建和获取依赖对象,对象只是被动地接受依赖对象。

比如我们要在一个客户端类里获取用户信息类,下图给出正转的方式

这里写图片描述
有了IOC容器之后,获取依赖对象的方式就变成如图所示了

这里写图片描述

IOC是一种很好的解耦合思想,在软件开发中有很好的作用,不仅被应用在JavaEE里,在其它语言里同样适用。

这里写图片描述

第三章IOC控制反转实现的方式

在Spring框架中实现IOC主要有三种方法。

  • XML配置方式
  • 注解方式
  • 自动装配方式

    3.1XML配置方式

现在基于传统XML配置方式实现的例子

package com.test;public interface IUserDAO { ...}
package com.test;public class UserDAOImpl implements IUserDAO { ...}

Service类:

import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserService { IUserDAO userDAO; public UserService() {  //加载xml配置  ApplicationContext ctx=new   ClassPathXmlApplicationContext("application.xml");  //从容器中获得id为userdao的bean  userDAO=(IUserDAO)ctx.getBean("userdao"); }}

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" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userdao" class="com.test.UserDAO"></bean></beans>

3.2注解方式

package com.test;import org.springframework.stereotype.Component;import org.springframework.stereotype.Repository;@Component("userDao")public class UserDAO implements IUserDAO { ...}

Service类:

package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;//@Component@Servicepublic class UserService { IUserDAO userDAO; ...}

在Application.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.3.xsd">  <context:component-scan base-package="com.test"></context:component-scan></beans>

采用注解的方式,比起xml配置方式更加简洁,不然也要注意耦合方面

除了@Component外,Spring提供了3个功能基本和@Component等效的注解,分别对应于用于对DAO,Service,和Controller进行注解。
1:@Repository 用于对DAO实现类进行注解。
2:@Service 用于对业务层注解,但是目前该功能与 @Component 相同。
3:@Constroller用于对控制层注解,但是目前该功能与 @Component 相同。

3.3自动装配方式

下面介绍IOC实现的另外一种方式,自动装配方式,这种方式也是用的比较多的。也即注解方式和XML方式的混合使用。

实现自动转配需要两个步骤:
• 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean
• 自动装配(autowiring):Spring自动满足bean之间的依赖

在xml里配置:

<!-- 自动扫描的包名 --><context:component-scan base-package="com.test" /><!-- 默认的注解映射的支持 --><mvc:annotation-driven />

对于开启注解的方式, <context:componetn-scan><context:annotation-config>的异同,可以参考我的博客,http://blog.csdn.net/u014427391/article/details/72722797

public interface UserService {    ...}
@Service("userService")public class UserServiceImpl implements UserService{...}

控制类

@Controllerpublic class UserController{    @Autowired    UserService userService;}

@Autowired,该注解的作用是:可以对成员变量、方法和构造函数进行注解,来完成自动装配的工作,通俗来说就是会根据类型从容器中自动查到到一个Bean给bookDAO字段。@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier。另外可以使用其它注解,

@ Resource :等同于@Qualifier

@Inject:等同于@ Autowired。

@Service用于注解业务层组件(我们通常定义的service层就用这个)

@Controller用于注解控制层组件(如struts中的action)

@Repository用于注解数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行注解。

引用自:http://www.52codes.net/article/40150.html

装配注解主要有:@Autowired、@Qualifier、@Resource,它们的特点是:

1、@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

2、@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

3、@Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;如果Maven项目是1.5的JRE则需换成更高版本的。

4、@Resource和@Autowired都可以书写注解在字段或者该字段的setter方法之上

5、@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的注解对象是成员变量、方法入参、构造函数入参。

6、@Qualifier(“XXX”) 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

7、@Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个,通过属性required可以设置非必要。

8、@Resource装配顺序
  8.1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  8.2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  8.3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  8.4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 身份证收据丢了怎么办 违章罚单丢了怎么办 村里的房子怎么办房产证 驾驶员没有从业资格证怎么办 滴滴驾驶员从业资格证怎么办 驾驶员证丢了怎么办 车检过期两个月怎么办 车子一年未年检怎么办 银行年检过期了怎么办 个体工商年报过期怎么办 个体工商执照过期怎么办 决定书编号16位怎么办 挂招牌遇到城管怎么办 结业证书丢了怎么办 违章满12分怎么办 摩托车分扣完了怎么办 驾校故意卡学员怎么办 新疆网上办税怎么办? 科三考4次不过怎么办 科三挂了4次怎么办 征信进入黑名单怎么办 年检换标过期怎么办 滴滴叫不到车怎么办 学时卡丢了怎么办 驾校学员丢了怎么办 考驾照学时不够怎么办 车辆年审超时间怎么办 车辆过年检了怎么办 开公司货车违章怎么办 毕业证丢了怎么办居住证 贴吧回帖被秒删怎么办 群拉人失败了怎么办 安装解释包错误怎么办 皮皮麻将进不去怎么办 郑州集体户口怎么办准生证 广州集体户口准生证怎么办 学校寄档案丢失怎么办 深圳通儿童卡怎么办 集体户没有户口卡怎么办 北京滴滴跑长途怎么办 应届毕业生落户成都档案怎么办