zoukankan      html  css  js  c++  java
  • JavaWeb_(Spring框架)Spring配置文件

    一、什么是spring IOC

      IOC(Inversion of Control)即控制反转,在我们以往的编程中如果需要一个bean往往需要去手动去new一个出来。而spring帮我们解决了这个问题,在spring中我们只需要去定义bean,spring就会自动的帮我们实例化并管理Bean。而这些Bean就管理在spring容器中。

      所有的对象都被Spring所控制————这就是IOC(控制反转)

        ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。也就是说,甲方要达成某种目的不需要直接依赖乙方,它只需要达到的目的告诉第三方机构就可以了,比如甲方需要一双袜子,而乙方它卖一双袜子,它要把袜子卖出去,并不需要自己去直接找到一个卖家来完成袜子的卖出。它也只需要找第三方,告诉别人我要卖一双袜子。这下好了,甲乙双方进行交易活动,都不需要自己直接去找卖家,相当于程序内部开放接口,卖家由第三方作为参数传入。甲乙互相不依赖,而且只有在进行交易活动的时候,甲才和乙产生联系。反之亦然。这样做什么好处么呢,甲乙可以在对方不真实存在的情况下独立存在,而且保证不交易时候无联系,想交易的时候可以很容易的产生联系。甲乙交易活动不需要双方见面,避免了双方的互不信任造成交易失败的问题。因为交易由第三方来负责联系,而且甲乙都认为第三方可靠。那么交易就能很可靠很灵活的产生和进行了。这就是ioc的核心思想。生活中这种例子比比皆是,支付宝在整个淘宝体系里就是庞大的ioc容器,交易双方之外的第三方,提供可靠性可依赖可灵活变更交易方的资源管理中心。另外人事代理也是,雇佣机构和个人之外的第三方。
    
        所谓的依赖注入,则是,甲方开放接口,在它需要的时候,能够讲乙方传递进来(注入)
        所谓的控制反转,甲乙双方不相互依赖,交易活动的进行不依赖于甲乙任何一方,整个活动的进行由第三方负责管理。
    知乎:Eric对SpringIOC理解

    二、Spring DI 依赖注入

      利用spring IOC实例化了对象,而DI将实例化的对象注入到需要对象的地方,完成初始化任务。

      对象由spring创建,之后再由spring给属性赋值

      spring提供两种方式设置属性值:

      ① setter方法注入

      ②构造方法注入

    三、Spring配置文件

      web.xml中启动Spring和配置Spring配置文件位置

    <!-- 让spring随着web项目的启动而启动 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
        <!-- 配置spring配置文件的位置 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>

      applicationContext.xml中配置Spring

      引入bean头文件

    <?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"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    applicationContext.xml

      配置Action、Service、Dao三层的bean配置

      name:给bean元素起个名字,可以重复,可以使用特殊字符

      class:类的完整类名

      scope:singleton:单例(大多数)创建spring容器的时候,就会立即创建这个单利对象

           prototype:多例(极个别)每次获得这个对象的时候才会去创建,而且每次创建的都是新的

       init—method :负责初始化

       destroy—method:负责销毁

      property:set注入方式(注入的是什么name,注入到什么地方ref)

       用注解的方法代替xml

       applicationContext.xml中配置的action

      <!-- 配置Action 
        <bean name = "userAction" class="com.Gary.web.UserAction" scope="prototype">
            <property name="userService" ref="userService"></property>
        </bean>
        
        配置Service 
        <bean name="userService" class="com.Gary.service.UserService">
            <property name="userDao" ref="userDao"></property>
        </bean>
        
        配置Dao
        <bean name="userDao" class="com.Gary.dao.UserDao">
        </bean>
      -->

      Web层用@Controller

      Service层用@Service

      Dao层用@Repository

      用@Controller("userAction")或Component("userAction")和@Scope(scopeName="prototype")代替

    <bean name = "userAction" class="com.Gary.web.UserAction" scope="prototype">

      用@Component("UserService")代替

    <bean name="userService" class="com.Gary.service.UserService">

      用@Repository("userDao")代替

    <bean name="userDao" class="com.Gary.dao.UserDao">

      用@注解后,需要在applicationContext.xml下开启包下所有子包

    <context:component-scan base-package="com.Gary"></context:component-scan>

      第一种:用@Autowired()代替,缺点:问题:如果匹配到多个类型一致的对象,将无法注入到具体哪个对象

      为了解决这个确定

      第二种:用@Qualifier("userService")

      第三者@Resource(name="userService")

        //@Autowired()    //自动装配
        //问题:如果匹配到多个类型一致的对象,将无法注入
        //@Qualifier("userService")
        @Resource(name="userService")
        private UserService userService;
    <property name="userService" ref="userService"></property>

      总结:

        Web层

          @Controller("userAction")

          @Scope(scopeName = "prototype")

        service层

          @Service("userService")

        dao层

          @Repository("userDao")

        @Resource(name="userService")

      

  • 相关阅读:
    力扣leetcode 435. 无重叠区间
    C++中的快读和快写
    python安装wordcloud库报错
    python习题 随机密码生成 + 连续质数计算
    python 四位玫瑰数 + 100以内素数求和
    解决git add README.md 时报错 fatal: pathspec 'README.md' did not match any files
    洛谷P3817 小A的糖果 贪心思想
    多机部署之session共享解决方案-copy
    一点区块链资料-copy
    kafka集群搭建及结合springboot使用-copy
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/11956561.html
Copyright © 2011-2022 走看看