Java Spring IOC用法

Java Spring IOC用法

Spring IoC

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

1.简介

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

2.用法

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

  • 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里加入以下依赖便可spring

    <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方法,而后调用express

    //声明属性
    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配置以下app

    <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元素,由框架经过反射自动寻找对象实现。

相关文章
相关标签/搜索