Java Spring IOC用法

Spring IoC

在前两篇文章中,我们讲了java web环境搭建java web项目搭建,现在看下spring ioc在java中的运用,开发工具为Intellij Idea。

1.简介

IoC(Inversion of Control)通常称为控制反转,是Spring框架的核心。即通过Spring容器控制对象之间的依赖关系,而不是对象自己通过new的方式去创建依赖的对象,相对于主动去创建对象,这种失去对对象的控制便叫做控制反转,控制反转用另一种角度描述或者更好的一种理解方式来讲,便是DI(Dependency Injection)依赖注入,对象只需关注业务逻辑本身即可,而不需关注依赖的对象从哪里来,交给容器注入即可,从而降低程序之间的耦合度。

2.用法

依赖注入在spring中有两种配置方式,一是xml配置Bean的方式,二是自动装配检测Bean

  • 2.1 xml配置Bean

    • 2.1.1 创建Spring配置

      我们在web层,web-inf/dispatcher-servlet.xml中注入service层的实现类,加入如下代码
    <bean id="demoUserService" class="com.ganji.demo.service.user.DemoUserServiceImpl" />
    • 2.1.2 在web层controller下调用

      我们在类里声明对象,并在方法里调用,这里我们的service层接口类可以声明为私有属性,程序可通过@Inject自动搜索xml中的bean配置,注入依赖。
    //   声明对象 DemoUserServiceImpl实现DemoUserService接口
    @Inject
    private DemoUserService demoUserService; @RequestMapping(value="/index", method = {RequestMethod.GET})
    public ModelAndView index(){
    DemoUserEntity demoUser=demoUserService.GetDemoUser(1);
    modelAndView.addObject("demoUser", demoUser);
    modelAndView.setViewName("home");
    return modelAndView;
    }

    我们在属性前加了@Inject,这里依赖javax.inject.Inject包 ,在模块pom里加入如下依赖即可

        <dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    </dependency>
    • 2.1.3 属性的依赖注入

    如果我们想在service层依赖注入调用dao层对象操作数据库,则跟service层类似,我们在web层的web-inf/dispatcher-servlet.xml注入dao层的实现,加入如下代码

    <bean id="demoUserDao" class="com.ganji.demo.dao.gcrm.hibernate.DemoUserDaoHibernate"></bean>
    <bean id="demoUserService" class="com.ganji.demo.service.user.DemoUserServiceImpl" autowire="byType">
    <property name="demoUserDao" ref="demoUserDao"></property>
    </bean>

    ref指像bean的实现类,如果是值类型或String类型可以用value指定,设定值即可,如value=5

    service层,我们可以在DemoUserServiceImpl层里声明demoUserDao私有属性,并公开属性set方法,然后调用

    //声明属性
    private DemoUserDao demoUserDao; //通过属性的set方法,注入对象
    public void setDemoUserDao(DemoUserDao demoUserDao)
    {
    this.demoUserDao=demoUserDao;
    } public DemoUserEntity GetDemoUser(int id) {
    return demoUserDao.getDemoUser(id);
    }
    • 2.1.4 构造器注入

    构造器注入类似于属性注入,在xml中用constructor-arg来指定,这里我们在web层的web-inf/dispatcher-servlet.xml配置如下

    <bean id="demoUserService" class="com.ganji.demo.service.user.DemoUserServiceImpl" autowire="byType">
    <constructor-arg name="demoUserDao" ref="demoUserDao"></constructor-arg>
    <constructor-arg name="userName" value="张三"></constructor-arg>
    </bean>

    在service层,我们创建构造函数

    private DemoUserDao demoUserDao;
    private String userName; public DemoUserServiceImpl(DemoUserDao demoUserDao,String userName)
    {
    this.demoUserDao=demoUserDao;
    this.userName=userName;
    } //在方法里既可以调用了,如下代码 public DemoUserEntity GetDemoUser(int id) {
    System.out.println("execute service getdemouser "+userName);
    return demoUserDao.getDemoUser(id);
    }
    • 2.1.5 小结

      如果我们不想在xml中配置属性注入或者构造器注入,我们可以在声明的属性上,添加@Inject注解,类似2.1.2中demoUserService的实现,这样Spring框架会自动搜索bean对应的实现类,可以在bean处设置根据名称或类型,即autowire="byType" or autowire="byName" ,也可以全局设置,即在根目录beans下面声明default-autowire="byName",具体如下。
    <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"
    default-autowire="byName"
    >
  • 2.2自动装配检测Bean

    如果每个实现类都要配置bean元素的话,项目如果很大的情况下,太多的bean,xml文件的bean管理配置就成了一个问题,很庆幸的事,spring提供了自动装配检测bean注入依赖的功能。

    • 2.2.1 自动检测标注bean

    我们依赖<context:component-scan>查找使用注解所标注的类,这些注解如下

    @Component --通用的构造性注解,标识该类为Spring组件

    @Controller --标识将该类定义为Spring MVC Controller 这里我们用在web层

    @Service --标识将该类定义为服务,这里我们用在Service层

    @Repository --标识将该类定义为数据仓库,这里我们用在Dao层

    具体用法如下图示例

    web层调用

    @Controller

    public class HelloWorldController {

    service层调用

    @Service

    public class DemoUserServiceImpl implements DemoUserService {

    dao层调用

    @Repository

    public class DemoUserDaoHibernate implements DemoUserDao {

    注解后,我们需要在web层的web-inf/dispatcher-servlet.xml配置组件扫描<context:component-scan>,分别扫描web、service。dao层,具体如下

     <!-- 开启controller注解支持 -->
    <!-- use-default-filters="false" 只扫描指定的注解 -->
    <context:component-scan base-package="com.ganji.demo.web.controller" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan> <!--服务层自动依赖注入-->
    <context:component-scan base-package="com.ganji.demo.service">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan> <!--Dao层依赖注入-->
    <context:component-scan base-package="com.ganji.demo.dao">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
    </context:component-scan>

    同时,我们需要在xml命名空间里加入context支持,xmlns:context="http://www.springframework.org/schema/context"和相应的xsi具体如下

    <?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.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd"
    default-autowire="byName"
    >
    • 2.2.2 使用自动注入的bean

    上一步配置好后,我们只需要声明调用对象的属性即可,如下

    web层如下

    //   声明对象 DemoUserServiceImpl实现DemoUserService接口
    @Inject
    private DemoUserService demoUserService; @RequestMapping(value="/index", method = {RequestMethod.GET})
    public ModelAndView index(){
    DemoUserEntity demoUser=demoUserService.GetDemoUser(1);
    modelAndView.addObject("demoUser", demoUser);
    modelAndView.setViewName("home");
    return modelAndView;
    }

    service层如下

    @Inject
    private DemoUserDao demoUserDao; public DemoUserEntity GetDemoUser(int id) {
    return demoUserDao.getDemoUser(id);
    }
    • 2.2.3 总结

    按2.2.1和2.2.2配置操作后,即可实现自动检查依赖注入bean,不用在xml中配置繁琐的bean元素,由框架通过反射自动寻找对象实现。

Java Spring IOC用法的更多相关文章

  1. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

  2. [Java]Spring Ioc讲解,不怕你不懂

    原文地址 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义 ...

  3. Spring IOC 概述

    Spring IOC 概述 IOC(Inversion of Control) 控制反转,也叫 DI(D_ependency injection_) 依赖注入.是一种设计思想.不过我并不同意所谓反转的 ...

  4. Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式

    java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的 ...

  5. Spring IOC之基于JAVA的配置

    基础内容:@Bean 和 @Configuration 在Spring中新的支持java配置的核心组件是 @Configuration注解的类和@Bean注解的方法. @Bean注解被用于表明一个方法 ...

  6. J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP

    J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言   搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理.    ...

  7. Java Spring Boot VS .NetCore (三)Ioc容器处理

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  8. Spring IOC知识java反射

    [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...

  9. 【小家Spring】Spring IoC是如何使用BeanWrapper和Java内省结合起来给Bean属性赋值的

    #### 每篇一句 > 具备了技术深度,遇到问题可以快速定位并从根本上解决.有了技术深度之后,学习其它技术可以更快,再深入其它技术也就不会害怕 #### 相关阅读 [[小家Spring]聊聊Sp ...

随机推荐

  1. 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

    这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...

  2. mysql 锁优化

    一.myisam存储引擎锁优化 1.合理理由读写优先级MyISAM 的表锁,写互相阻塞的表锁,默认系统是写优先,可改为读有先:low_priority_updates=1如果我们的系统是一个以读为主, ...

  3. lphp输出控制output controll(header, ob_xxx)

    关于php的output controll参考文档: http://gywbd.github.io/posts/2015/1/php-output-buffer-in-deep.html http:/ ...

  4. 总结最近移动端遇到的坑(auto-size + zepto)

    问题一:移动端页面双击会放大,图片时大时正常,布局偶尔很丑..刷新多遍又乜有问题 解决:所有图片设置宽高100%,最外面的html,给个 <meta name="viewport&qu ...

  5. javascript:void(0)

    这是不是一个设计缺陷呢 void(0)这种用法巧妙利用void关键字的特性返回undefined(且没有副作用).因为不是关键字,比如直接使用undefined,内容可能被改写. 再来看为啥使用0,而 ...

  6. RHEL7关于时间的学习笔记

    当你发现时间是贼了,它早已偷光你的选择. 一,GMT.UTC.CST GMT:(Greenwich Mean Time)格林威治时间 ,太阳通过格林威治那一刻来作为计时标准. UTC:(Coordin ...

  7. easyui自定义标签 datagrid edit combobox 手动输入保存不上问题解决办法

    使用onEndEdit事件(该事件可以获取到editor对象,onAfterEdit事件获取不到Editor对象) 通过editor拿到输入数据并保存. int ci = 0; for(Column ...

  8. C#结构

    namespace STRUCT_TEST{ class Program { struct A { public int X;//不能直接对其进行赋值 public int Y; public sta ...

  9. spring+struts2的jar

  10. String、StringBuffer、StringBuilder的一些小经验……

    一说String.StringBuffer和StringBuilder,想必大家都很熟悉,这三者经常在我们的面试题中出现,我也是看到了关于这三个的经典面试题,才触动了我之前工作中的一些经历,故而根据我 ...