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. 在本地创建angular-ui/bootstrap项目

    在本地创建完整的angular-ui/Bootstrap项目 git clone the repo, then switch to the tag you want,then use grunt bu ...

  2. 第八章 springboot + mybatis + 多数据源(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构 ...

  3. docke部署mysql

    #1    docker pull mysql #2    docker run -v /data/var/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=k ...

  4. 关于delphi点击webbrowser中任意一点的问题

    关于delphi点击webbrowser中任意一点的问题 有时候我们需要delphi载入webbrowser1打开网页的时候 需要点击某一个点的位置 可能是坐标 可能是按钮 可能是其他的控件应该如何来 ...

  5. 磊科NI360路由器绕过密码登录

    先分析正确登陆360路由器后cookies是怎么样的,发现只有一个值如下图: 可以看出登陆后只有一个netcore_login=guest:1 下面来模拟一下这个cookies看是否能登陆 增加好后直 ...

  6. [03]APUE:文件 I/O

    [a] open #include <fcntl.h> int open(const char *path, int oflag, ... ,mode_t mode) 成功返回文件描术符, ...

  7. LeetCode OJ-- 二战 Combinations

    在1 - 10 中,求出 7 个数的排列组合. 出现了超时,而超时的原因是有好多重复情况,复杂度上来说,和答案的复杂度是一样的,但是答案中重复了太多了,体会下. 超时1: class Solution ...

  8. yii打印sql

    想打印Sql的话,可以用把你要执行的命令例如queryAll(),queryOne(),execute()换成getRawSql(); 例如 : 要看$result = Yii::$app->d ...

  9. js时间处理函数

    Date 对象的方法简介: ·Date    | 返回当日的日期和时间 ·getDate | 从 Date 对象返回一个月中的某一天 (1 ~ 31) ·getDay | 从 Date 对象返回一周中 ...

  10. command not found,系统很多命令都用不了 ,修改环境变量

    bash: ***: command not found,系统很多命令都用不了,均提示没有此命令. 突然之间linux很多命令都用不了,均提示没有此命令. 这应该是系统环境变量出现了问题导致的. 解决 ...