zoukankan      html  css  js  c++  java
  • 小记---------spring框架之IOC理解

    Spring是一个开源框架,是一个轻量级的Java开发框架。
    Spring的核心是控制发转(IOC)和面向切面(AOP)
     
    控制发转(IOC):指的是 对象的创建权反转(交给) Spring.
    作用是实现了程序的解耦合.(就是原本自己new实体的步骤由spring来做)
    面向切面(AOP):需要在哪里加入代码,就在哪里切开把代码放进去
     
    Spring也是一个粘合剂,可以集成其他框架
    Spring最基本的管理是一个
     
    EE 开发分成三层结构:
     
    • WEB 层:Spring MVC.(M:model(dao ,service entity) , v :view (html,jsp),c controller(controller))
     
    • 业务层:Bean 管理:(IOC)
     
    • 持久层:Spring 的 JDBC 模板.ORM 模板用于整合其他的持久层框架.(mybatis)
     
    Spring的本质就是:工厂模式+反射+配置文件
     
     
    1.2.2.3 步骤二:创建 web 项目,引入 Spring 的开发包:
     
    1.2.2.4 步骤三:引入相关配置文件:
    log4j.properties      日志文件
    applicationContext.xml        核心配置文件
    引入约束
    spring自己的标签
     
    log4j.properties
    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
     
    applicationContext.xml        核心配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <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
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/beans/spring-beans.xsd" >    <!--p命名空间约束的位置-->
    <!--属性注入-->
    <!-- 因id的值不能出现特殊字符,所以使用name -->
    <!-- 如果同时写两个bean标签 需要添加scope属性'多例prototype' -->
    <!--需要有参构造器-->
    <bean name="ud" scope="prototype"  class="cn.yzq.dao.impl.UserDaoImpl">
        <constructor-arg name="name" value="小米"></constructor-arg>    <!--name的值是属性(字段)、value是具体传的值-->
        <constructor-arg name="age"  value="6"></constructor-arg>
    </bean>
    <!-- 使用set赋值,需要无参构造器和set访问方式 -->
    <bean name="ud2" scope="prototype"  class="cn.yzq.dao.impl.UserDaoImpl">
        <property name="name" value="华为"></property>        <!--name的值是属性(字段)、value是具体传的值-->
        <property name="age" value="666"></property>
    </bean>
    <!-- 对象类型注入 -->
        <!-- 首先需要用bean标签创建出一个对象 -->
        <bean name="ud3" scope="prototype"  class="cn.yzq.dao.impl.UserDaoImpl">
            <property name="name"  value="iphone"></property>
            <property name="age"  value="000"></property       
            <!-- 需要创建一个被关联的实体 -->
            <property name="car"  ref="car"></property>     <!-- name的值是属性名(字段名)  ref值是要关联的实体 -->
        </bean>
        <!-- 被管理的实体创建 -->
        <bean name="car"  class="cn.yzq.dao.impl.Car"></bean>
     
    <!-- p命名空间的属性注入 -->
        <!-- 基本数据类型 格式        p:属性名="属性的值" -->
        <!-- 对象数据类型格式     p:属性名(对象)-ref="关联的实体"    -->
        <bean name="ud4"  class="cn.yzq.dao.impl.UserDaoImpl" p:name="红米" p:age="99" p:car-ref="car"></bean>
     
        <!-- 复杂类型的注入 -->
        <bean name="ud5" scope="prototype"  class="cn.yzq.dao.impl.UserDaoImpl">
            <!-- name值是属性名 -->
        <!--数组注入-->
            <property name="nums">
                <list>
                    <value>1</value>
                    <value>2</value>
                    <value>3</value>
                </list>
            </property>
            <!--list集合注入-->
            <!-- name值是属性名 -->
            <property name="lists">
                <list>
                    <value>a</value>
                    <value>b</value>
                    <value>c</value>
                </list>
            </property>
        </bean>
        <bean name="ud6" scope="prototype"  class="cn.yzq.dao.impl.UserDaoImpl">
            <!-- 注入 Map 集合 -->
            <property name="map">
                <map>
                    <entry key="aaa" value="111" />
                    <entry key="bbb" value="222" />
                    <entry key="ccc" value="333" />
                </map>
            </property>
        
        <!-- Properties 的注入 -->
        <!--用于给配置文件赋值和取值-->
            <property name="properties">
                <props>
                    <prop key="username">root</prop>
                    <prop key="password">123</prop>
                </props>
            </property>
        </bean>
     
    </beans>
    测试类方法
    @Test
        public void demo2() {
            // 创建 Spring 的工厂类:
            ApplicationContext applicationContext =  new
            ClassPathXmlApplicationContext("applicationContext.xml");
            // 通过工厂解析 XML 获取 Bean 的实例.
            UserDao userDao = (UserDao)  applicationContext.getBean("ud2");    //需要与核心配置文件中的id 或 name 相对应
            userDao.sayHello();
        }
     
    1.2.2.8 IOC  DI:
    IOC :控制反转,将对象的创建权交给了 Spring.
    DI :Dependency Injection  依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依
    赖的属性设置进去.
     
    spring工厂主类
    ApplicatioContext 接口有两个实现类:
     
    ClassPathXmlApplicationContext
    :加载类路径下 Spring 的配置文件.
    FileSystemXmlApplicationContext
    :加载本地磁盘下 Spring 的配置文件.
     
     
    1.2.3.3 BeanFactory  ApplicationContext 的区别:
        BeanFactory :是在 getBean 的时候才会生成类的实例.(懒加载)
    ApplicationContext :在加载 applicationContext.xml(容器启动)时候就会创建.
    BeanFactory  FactoryBean 的区别:
    BeanFactory:是一个底层工厂,作用:创建bean的工厂
    FactoryBean:指的是工厂下面的一个具体的实现类,通过类来创建对象
     
    1.2.5  Spring 的相关配置
    1.2.5.1 id 属性和 name 属性标签的配置
    id :Bean 起个名字在约束中采用 ID 的约束:唯一. 必须以字母开始,可以使用字母、数字、连字符、
    下划线、句话、冒号 id:不能出现特殊字符.
    <bean id=”bookAction”>
    name:Bean 起个名字没有采用 ID 的约束. name:出现特殊字符.如果<bean>没有 id 的话 , name 
    以当做 id 使用.
    整合 struts1 的时候:
    <bean name=”/loginAction” > 
    1.2.5.2 scope 属性:Bean 的作用范围.
    * singleton
    :默认值,单例的.
    * prototype
    :多例的.
     
    * request
    :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
       
    * session
    :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
       
     
     
      • globalSession :WEB 项目中,应用在 Porlet 环境.如果没有 Porlet 环境那么 globalSession 相当
     
    • session.
     
     
    1.2.5.3 Bean 的生命周期的配置:
    通过配置<bean>标签上的 init-method 作为 Bean 的初始化的时候执行的方法,配置 destroy-method
    作为 Bean 的销毁的时候执行的方法。
    销毁方法想要执行,需要是单例创建的 Bean 而且在工厂关闭的时候,Bean 才会被销毁.
    例:
        
    <bean name="ud" init-method="show" scope="prototype"  class="cn.yzq.dao.impl.UserDaoImpl">
        <constructor-arg name="name" value="小米"></constructor-arg>
        <constructor-arg name="age"  value="6"></constructor-arg>
    </bean>
    <!--show是实现类中的一个方法 ,在执行下面代码之前先执行show方法-->
    <!--destroy-method使用方法一致-->
     
    1.2.6.4 名称空间 p 的属性注入的方式:Spring2.x 版本后提供的方式.
    首先引入p命名空间的约束
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    设计模式(八): 策略模式
    设计模式(七): 迭代器模式
    设计模式(六): 建造者模式
    设计模式(五): 装饰者模式
    设计模式(四): 适配器模式
    设计模式(三): 抽象工厂模式
    设计模式(二): 工厂模式
    设计模式(一): 单例模式
    Hibernate三种状态,缓存,以及update更新问题
    Servlet 生命周期、工作原理
  • 原文地址:https://www.cnblogs.com/yzqyxq/p/11700497.html
Copyright © 2011-2022 走看看