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元素,由框架經過反射自動尋找對象實現。

相關文章
相關標籤/搜索