zoukankan      html  css  js  c++  java
  • Spring笔记(一)

    1. SPRING简介

    1.1. Spring作用

    Spring封装了创建对象的功能

    内部实现机制:框架写了自己的工厂类,读用户的配置文件,然后反射出配置文件中配置的各种对象

    Spring是分层的JavaSE/EE应用一站式的轻量级(重量级EJBSUN公司(Session Bean[控制层]Service Bean[业务层]Persistace Bean[DAO]))开源框架(官网: http://spring.io/ ),以IocInverse of control)控制反转和AopAspect Oriented Programming)面向切面编程为核心。

    轻量级:针对EJB来说,使用方便。

    一站式:spring针对各各层(表现层、业务层、持久层)提出解决方案。

    表现层:springmvc,Struts1, Struts2spring自己的mvc框架),提供和其它web框架整合方案。

    业务层:spring基于aop(面向切面编程)思想进行事务控制。

    持久层:spring自己提供JdbcTemplate,提供和其它持久层框架整合的方案。

    1.2. Spring核心功能

    Ioc(控制反转)aop(面向切面编程)。

    重点是:IOC(大容器Map, 放了很多对象)spring要管理各各层的bean

    2. SPRING工作机制模拟

    2.1. 控制反转IOC和依赖注入DI

    2.1.1. 什么是控制反转

    IoC (Inverse of Control)即控制反转。是指将原来程序中自己创建实现类对象的控制权反转到IOC容器中。只需要通过IOC获了对象的实例,将IOC当成一个黑盒子、工厂、容器。

    spring提供ioc容器,对 bean进行实例化。使用bean时候从容器中取。

    IOC控制反转,将对象的创建权反转到了spring容器中。

    2.1.2. 什么是依赖注入

    Spring在创建一个类的实例时,如果这个类的里面依类型赖其他的引用,那么会自动将其引用的类型的类先实例化再注入到该实例里面

    依赖注入的总结:

    在配置文件中加入<property name=”userDao” ref=”userdao1”>

    name=”userDao”,说明该bean有一个名字叫userDao的成员变量,并且该变量有setter方法。

    ref=”userdao1”,说明,在spring容器中,有一个idnameuserdao1bean

    3. SPRING入门示例程序

    3.1. 新建工程

    3.2. 导入JAR

    spring-beans-4.2.4.RELEASE.jar

    spring-context-4.2.4.RELEASE.jar

    spring-core-4.2.4.RELEASE.jar

    spring-expression-4.2.4.RELEASE.jar

    spring使用JCL日志体系(commons-logging-1.2.jar

    commons-logging:相当 于原来的slf4j,只有日志接口

    还需要加入日志实现:log4j

    3.3. 业务类准备

    3.4. SPRING配置文件

    springioc容器的配置文件:applicationContext.xml(默认名称)

    配置schema约束:

    http://www.springframework.org/schema/beans/spring-beans.xsd

     

    springioc容器的配置文件:applicationContext.xml(默认名称)

    配置schema约束:

    http://www.springframework.org/schema/beans/spring-beans.xsd

    3.5. 配置BEAN

    1、编写好接口及接口实现类

    2、需要在spring的容器的配置文件中配置spring要管理的bean

    3.6. 运行测试

        // 从spring的容器中获取bean实例
        @Test
        public void test1() {
            // 创建spring容器的实例
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
            // 通过容器实例对象获取bean实例
            // 通过 bean的名称来获取
            CustomerDao customerDao = (CustomerDao) applicationContext.getBean("customerDao");
            System.out.println(customerDao);
            CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
            System.out.println(customerService);
        }

    4. IOC更多配置

    4.1. BEAN的定义

     

    4.2. BEAN的初始化配置

    spring要对applicationContext.xml中配置的bean进行实例化(初始化)。

    包括:通过无参构造器实例化、通过有参构造器实例化、通过静态工厂方法

    <!-- 测试spring对bean的实例化方法 -->
        <!-- 默认通过无参构造器 -->
        <bean id="customer1" class="com.dohit.pojo.CstCustomer"></bean>
        <!-- 通过有参构造器
        构造器:public CstCustomer(Long custId,String custName)
         -->
        <bean id="customer2" class="com.dohit.pojo.CstCustomer">
            <!-- index:参数位置,第一个参数位置为0
            value:参数值
            type:参数类型
             -->
            <constructor-arg index="0" value="101" type="java.lang.Long"/>
            <constructor-arg index="1" value="牛牛" type="java.lang.String"/>
                
        </bean>
        <!-- 了解,通过静态工厂方法获取bean的实例
        class:配置工厂类的路径
        factory-method:调用工厂方法,获取对象
         -->
        <bean id="customer3" class="com.dohit.pojo.CustomerFactory" factory-method="getCustomer"></bean>

    4.3. BEAN的获取

    getBean(bean标识)

    // 通过类型去获取bean时,spring配置文件中,该类型的bean只能有一个

    getBean(bean类型.class)

    4.4. ApplicationContext加载配置文件

    ApplicationContext理解为spring容器的上下文,通过上下文操作容器中bean

    ClassPathXmlApplicationContext(“./文件夹名/spring.xml”):加载classpath下的配置文件创建一个容器实例

    FileSystemXmlApplicationContext(“d:\testspring.xml”):加载文件系统中任意目录下的配置文件,创建一个容器实例

    掌握:多文件的加载方法

            // ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-dao.xml","applicationContext-service.xml");
            // ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new
            // String[]{"applicationContext-dao.xml","applicationContext-service.xml"});
            //ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[] { "classpath:applicationContext-dao.xml", "applicationContext-service.xml" });
            // ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-*.xml");
            //ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[] { "classpath:applicationContext-*.xml", "beans.xml" });
            //ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:*.xml");
            // ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[] { "classpath:*.xml", "classpath:springmvc/beans.xml" });
            //ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:*.xml");

    5. DI依赖注入

    5.1. DI的概念

    依赖注入(Dependency Injection所谓依赖注入,就是由IOC容器在运行期间,动态地将对象的依赖关系注入到对象的属性

     

    service:依赖dao,如何实现依赖注入?

    1spring要管理service(前提)

    2spring要管理dao(前提)

    总结前提:依赖方(service)、被依赖方(dao)都需要被spring管理

    3、根据依赖关系,service依赖dao,将dao实例注入至service的属性中。

    底层原理:spring根据配置文件中配置依赖关系,首先获取被依赖的对象dao实例,调用service对象的构造函数或者set方法将dao实例设置(注入)service属性。

    5.2. DI测试

    目标:

    springservice依赖的dao注入。

    1、在spring的容器中配置daoservice

     

    2、配置依赖关系,service依赖dao

     

    5.3. 小结IocDi的区别

    ioc:控制反转,将对象的创建权反转到ioc容器。

    DI:依赖注入,将对象所依赖的对象注入到对象的属性中。 就是IOC的具体实现方法。

    1IOC就是一个容器

    2IOC容器中包括spring管理的所有bean

    3IOC容器负责对bean进行实例化

    4IOC容器对bean进行实例化时候,检查有哪些依赖的属性,将依赖的属性注入到实例化的bean的属性中。

    要实现依赖注入,需要spring管理依赖方和被依赖方(spring要对依赖方和被依赖方实例化)。

    5.4. 依赖注入方法

    5.4.1. 通过有参构造器注入属性值

     

    5.4.2. 通过 set方法注入(常用!!!)

     

    5.4.3. 测试set方法注入支持属性类型:

     

    <!-- 测试set方法依赖注入的属性类型 -->
        <bean id="queryVo" class="com.dohit.spring.pojo.QueryVo">
            <!-- 基本类型 -->
            <property name="page" value="1"></property>
            <property name="username" value="大牛"></property>
            <!-- pojo属性 -->
            <property name="customer" ref="customer1"></property>
            <!-- list List<String> -->
            <property name="listString">
                <list>
                    <value>小牛1</value>
                    <value>小牛2</value>
                </list>
            </property>
            <!-- list List<CstCustomer> -->
            <property name="customerList">
                <list>
                    <ref bean="customer3"/>
                    <ref bean="customer3"/>
                </list>
            </property>
            <!-- map -->
            <property name="map">
                <map>
                    <entry key="101" value="小牛"></entry>
                    <entry key="102" value="大牛"></entry>
                </map>
            </property>
            <!-- properties -->
            <property name="properties">
                <props>
                    <prop key="101" >小牛</prop>
                    <prop key="102" >大牛</prop>
                </props>
            </property>
        </bean>

    5.4.4. p命名空间和spEL表达式注入方式(了解)

     

    6. 基于注解方式进行IOC开发

    使用注解,spring通过注解方式完成bean的管理。

    bean的管理包括两部分:

    1、对 bean实例化

    2、对bean依赖注入

    6.1. 准备环境

    将applicationContext.xml文件置空

    加入spring-aop-4.2.4.RELEASE.jar

    6.2. 实例化的注解

    @Repository:标识此bean为一个dao

     

    spring中提供了@component标识就是一个bean

    @Component可以用在任何的bean上。

    6.3. 配置context:component-scan组件扫描

    引入context命名空间

    <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">
    
    <!-- 配置组件扫描
    component-scan可以扫描注解:@controller、@Service、@Repository、@Component
    指定扫描的包com.dohit.spring,可以扫描子包下的类
     -->
    <context:component-scan base-package="com.dohit.spring"></context:component-scan>
    
    </beans>

    原理:

    在加载spring容器时,根据上边配置的包路径,扫描包下的及子包下的类,如果标识了@controller@Service@Repository@Component进行实例化。

    了解,进行过虑配置:

    <context:component-scan base-package="com.dohit.spring">
                <!-- 扫描 org.springframework.stereotype.Service-->
                <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
                <!-- 扫描org.springframework.stereotype.Repository-->
                <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
                <!-- 不扫描org.springframework.stereotype.Controller -->
                <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
            </context:component-scan>

    6.4. 依赖注入的注解

    @Autowired

    按类型注入

    1、可以标识在属性上,根据属性类型去spring容器中找同类型的bean,找到则将bean注入到属性中。

    @Autowired//按类型注入

    private CustomerDao customerDao;

        注意:如果容器中同一个类型的bean如果有多个,使用Autowried报错,找到多个同类型的bean,使用@QualifierAutowired组合配置,Qualifier指定将哪个bean注入进来。

     

    2、可以用在set方法上。

    set方法中参数类型,根据参数类型从容器中找bean,注入。

     

    3、使用jdk的注解@Resource

    按名称注入

     

    autoWired区别:Resource注解是jdk下的,而autoWiredspring提供。

    7. spring整合springmvc

    7.1. applicationContext-service.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        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-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
        <context:component-scan base-package="com.dohit.springmvc.service"/>
    
    </beans>

    7.2. applicationContext-transaction.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        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-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
        <!-- 事务管理器 -->
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!-- 数据源 -->
            <property name="dataSource" ref="dataSource" />
        </bean>
        <!-- 通知 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!-- 传播行为 -->
                <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="insert*" propagation="REQUIRED" />
                <tx:method name="delete*" propagation="REQUIRED" />
                <tx:method name="update*" propagation="REQUIRED" />
                <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
            </tx:attributes>
        </tx:advice>
        <!-- 切面 -->
        <aop:config>
            <aop:advisor advice-ref="txAdvice"
                pointcut="execution(* cn.itcast.springmvc.service.*.*(..))" />
        </aop:config>
    </beans>

    7.3. springmvc.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" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
        <!-- 扫描带Controller注解的类 -->
        <context:component-scan base-package="com.dohit.springmvc.controller" />
        <!-- 加载注解驱动 -->
        <mvc:annotation-driven/>
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass"
                value="org.springframework.web.servlet.view.JstlView" />
            <!-- jsp前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/" />
            <!-- jsp后缀 -->
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>

    7.4. web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        id="WebApp_ID" version="2.5">
        <display-name>springmvc-web</display-name>
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
        </welcome-file-list>
        <!-- 加载spring容器 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/applicationContext-*.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring/springmvc.xml</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>*.action</url-pattern>
        </servlet-mapping>
    </web-app>
  • 相关阅读:
    C++设计模式-Bridge桥接模式
    解决VS2010打开Web页面时经常由于内存较低而导致VS2010自动关闭的问题
    Js继承小结
    MAC上的包管理利器
    Objective-C的hook方案(一): Method Swizzling
    OleContainer操作Excel以二进制方式读写数据库
    复制文件时,如何显示进度条(使用TFileStream一点一点读,或者使用BlockRead,并插入application.ProcessMessages)
    ADO异步查询显示进度条
    D2010 RTTI + Attribute 简单实现ORM
    Delphi默认窗体随想
  • 原文地址:https://www.cnblogs.com/aaron911/p/9272768.html
Copyright © 2011-2022 走看看