Java Spring IOC用法

时间:2021-12-08 03:21:01

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. &lbrack;Java&rsqb;Spring Ioc讲解&comma;不怕你不懂

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

  3. Spring IOC 概述

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

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

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

  5. Spring IOC之基于JAVA的配置

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

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

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

  7. Java Spring Boot VS &period;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. Android数据存储之Android 6&period;0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  2. HTTP访问错误大全

    400 - 错误的请求. ·401 - 访问被拒绝.IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因.这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: ·401.1 - ...

  3. 慢牛系列四:好玩的React Native

    在上次随笔(系列三)中,我试着用RN实现了一个Demo,感觉很不错,当时遇到的问题这篇文章里基本都解决了,比如导航动画问题,这篇文章里主要介绍RN的动画,学会动画以后,各种小创意都可以实现了^^ 下面 ...

  4. 获取url 参数

    epresssjs 里面请求参数,4.x 里面有3种方法 1.req.params app.get('user/:id',function(req,res){ res.send('user',req. ...

  5. C&num;-利用ZPL语言完毕条形码的生成和打印

     近期由于公司项目的须要,研究了一项对我来说算是新的技术-条形码的生成和打印.由于之前没有接触过这方面的知识,所以刚開始还有点小迷茫和小兴奋,只是一步一步来,问题总会解决的.如今来总结一下做条形码 ...

  6. &lbrack;code&rsqb;最长回文子串

    分析: 不能用scanf("%s"),因为碰到空格或者Tab就会停下来. 解决输入中有空格 方法一:使用fgetc(fin),读取一个打开的文件fin,读取一个字符,然后返回一个i ...

  7. textview自定义跳转链接

    设置方式 ,主要是遍历html中的url,然后加一个自定义的跳转 private void setTextLink(String rule) { if(TextUtils.isEmpty(rule)) ...

  8. PyCharm介绍与基础操作

    PyCharm是一种Python IDE(集成开发软件),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具. 1.1 PyCharm主界面 PyCharm包含4个主要区分,分别为菜单 ...

  9. 纯css实现网络图标

    <html> <head> <title>css图标</title> <meta charset="utf-8"> &l ...

  10. Mysql实现级联操作(级联更新、级联删除)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...