Spring学习笔记

来源:互联网 发布:金融数据分析软件 编辑:程序博客网 时间:2024/06/06 04:23

Spring3

    基本概念
        是什么
            java/javaEE
            非侵入式
        能干什么
            概要
                能够把很多的技术集成到一起,形成一个整体
                体现了体系结构上的一些设计理念
            详细
                IoC/DI
                AOP
                对JDBC和ORM的支持
                事务
                集成其他技术,最典型的就是SSH
                SpringMVC
                其他技术:Spring Security/Web Flow等
        有什么
            Spring2.x
            Spring3.x
            比较
                Spring3较于Spring2.x多了EL、OXM等模块和Test大模块,主体内容差不多,只是划分的方式不一样。
        Spring3按照javaEE分层时的模块分布
    IoC/DI
        基本理论
            是什么
                IoC
                DI
                两者之间的关系
            能干什么
            有什么
                容器
                组件
                配置文件
            理解
                对IoC的理解
                    对"控制"的理解
                    对"反转"的理解
                    控制的什么东西被反转了
                对依赖的理解
                对DI的理解
                    依赖于容器注入依赖
                对外部资源的理解
                    本身不依靠外部不能得到的资源
                IoC思想中的几个原则的理解
                    被动化原则
                        概念
                        目的
                    最小知识原则
                        概念
                        目的
        HelloWorld
            写应用程序需要的对象,跟Java里面的写法完全一样
            为Spring写配置文件
                Bean元素,name和class
            客户端
                读取配置文件,创建ApplicationContext
                使用context来获取需要使用的bean
                再把这个bean赋值给对应的接口变量
                使用这个api来进行调用操作
            运行流程
        基本配置
            如何实例化容器
                3种方法
                读取多个配置文件的方式
                    方式1:传入配置文件相对于classpath的路径字符串数组
                    方式2:使用import元素
                    注意:开发中文件的命名习惯
                配置文件和容器的关系
                    对一个或多个配置文件的x次读取就会创建x个IoC容器,每个容器都会对应一片内存空间
                    所以对于相同的配置文件来说,尽量只读取一次,实际开发中:一次性读取所有配置文件
            配置
                要配些什么
                    1.bean的命名
                    2.全限定类名
                    3.bean的行为
                    4.参数和属性值
                    5.依赖关系
                如何初始化bean
                    1.构造器
                    2.静态工厂方法
                    3.实例工厂方法
                依赖注入的配置
                    配置形式
                        1.构造参数
                            顺序
                            类型
                            索引
                            名称
                        2.setter
                        注意
                            1.在程序中的写法
                            2.在配置文件中的写法
                            程序和配置文件之间的关系
                        选择
                            优先选择setter
                            如果要表达"初始化bean之前必须初始化某个参数"的含义时使用构造器方式
                    传值方式
                        idref
                            传递值:传递的是bean的id,是一个字符串,而不是bean
                            传递范围:需要在idref作为标签时,对其属性进行赋值:bean,local,parent
                        ref
                            传递的值:传递的是bean
                            传递范围:需要ref作为标签:bean,local,parent
                        基本量
                        内部bean
                        自动装配
                    集合的配置
                        list
                        set
                        properties
                        map
                        合并
                    null值
                    depends-on属性
                    lazy-init属性
                bean的作用域
                    singleton
                        含义:每一个IoC/DI容器中一个bean定义对应一个实例
                        范围:IoC/DI容器
                        创建时机:在容器创建时
                    prototype
                        每次操作的时候就新建一个实例
                        创建容器的时不会初始化,每次获取bean的时候才初始化
                    request
                    session
                    global session
                方法注入
                    程序中的写法:抽象类的抽象方法
                    配置:lookup-method
                    使用范围:单例中的不单例
                生命周期
                    认识:我们不能控制生命周期的运行,控制的只能是生命周期的回调方法
                    Spring中Bean的装配过程
                        1.实例化;
                        2.设置属性值;
                        3.如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
                        4.如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
                        5.如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
                        6.调用BeanPostProcessor的预先初始化方法;
                        7.调用InitializingBean的afterPropertiesSet()方法;
                        8.调用定制init-method方法;
                        9.调用BeanPostProcessor的后初始化方法;
                    Spring容器的关闭过程
                        1. 调用DisposableBean的destroy();
                        2. 调用定制的destroy-method方法;
                    生命周期的回调方法
                        init,destroy
                        写法
                            实现InitializingBean和DestroyingBean接口
                            在配置文件中写入属性:init-method(或default-init-method),destroy-method(或default-destroy-method)
        ApplicationContext的其他应用
            国际化
                方式1:资源文件(properties文件)+配置文件(xml文件)+context.getMessage方法
                    1.properties文件中写入中文是不允许的,需要写入中文相应的Unicode码
                    2.properties文件中允许写入动态的量{0},{1}等
                    配置文件中需要写入一个org.springframework.context.support.ResourceBundleMessageSource的bean,其id是messageSource(不可修改),并为其注入一个属性basenames:注入一个list集合,list集合中的元素值就是文件的名字(不包括文件后缀和文件后面的Locale信息)。
                    getMessage方法
                        被ApplicationContext的实例来调用其实间接调用的是messageSource的getMessage方法
                        第一个参数:properties文件中的key
                        第二个参数:对properties文件中{0},{1}等的实际传参
                        第三个参数:缺省值
                        第四个参数:查找properties文件时对应的Locale
                方式2:properties资源文件+注入xml配置文件+ms.getMessage方法
                    同上,仅仅只是需要将messageSource的bean ref到类的属性ms上
            读取资源
                通过context的Api来获取:context.getResource(String classpath:path).getInputStream().read(new byte[1024]);
                通过资源注入,然后使用Resource类的getInputStream()方法
            事件
                让bean实现ApplicationContextListener接口实现其onApplicationEvent()方法,onApplicationEvent()方法
            在web应用中的实例化
                Listener:org.springframework.web.context.ContextLoaderListener读取配置文件,真正创建ApplicationContext
                context-param:contextConfigLocation=/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml
                    注意点:
1.contextConfigLocation的value值可以是多个路径,用逗号,空格,分号分隔
2.contextConfigLocation的value值支持通配符*
    AOP
        基本概念
            是什么
                范式
                编程范式
                另一个角度
            有什么
                方面/关注点
            和OOP的关系
        思想的演变
            原始:具体功能具体实现,缺点是代码重复
            抽象方式1:提取公共功能+调用,缺点是在调用端过于主动(权利由调用端控制)
            使用模式:装饰模式,代理模式:覆盖+多态调用,缺点是在使用装饰类或代理类的时候仍然过于主动,且存在对相关API的依赖关系
                装饰模式
                静态代理
                动态代理
                    JDK动态代理
                    CGLIB动态代理
            AOP:CGLIB动态代理模式+容器+多态调用:既能减少重复代码,又能变功能组装的主动为被动,还没有暴露对相关代理API的依赖
        能干什么
            代码复用性
            降低功能上的耦合
        核心概念
            关注点
            通知
            连接点
            切入点
            切面
            目标对象
            AOP代理
            织入
            引入
        AOP的结构图
            aspect集合:①关注点+具体连接方式=advice ②连接点的集合=切入点两者组合起来
        AOP的运行流程
            1.形成advice:根据advice的具体配置找到关注点和通知类型形成advice
            2.形成切入点:根据切入点的配置找到所有的连接点形成切入点
            3.织入形成切面:根据配置中advice和切入点的对应关系,将两者组合形成多个切面
        helloworld
            Java代码
                写Target类
                写advice类(提供用来作为通知的方法)
            配置aspect
                在aop:config-aop:aspect中配置aspect的对应类:ref属性(仅仅只是为了后面在写关注点method属性的时候不用谢全限定名来图个方便而已)
                在aop:config-aop:aspect-aop:pointcut中配置切入点的连接表达式expression
                在aop:config-aop:aspect-aop:before(或其他通知类型如after,around等)中配置advice的关注点:method属性,以及配置advice和切入点的对应关系
            理解
                AOP在程序毫不知情的情况下织入了一些切面,体现了应用开发的组装式思维
        @AspectJ
            @Aspect
            @Before
            @Pointcut
            @After
            切入点表达式语法
                表达式关键字
                    execution
                        execution表达式的基本概念
                            其实就是一个方法的全定义名称,只不过可以使用通配符(*,..,+)而已
                            分级:表达式可以拆分成修饰符部分,返回值部分,包名部分,类名部分,方法名部分,参数部分,抛出异常部分
                                必填部分
                                    返回值部分,方法名部分,参数部分
                                可选部分
                            通配符的含义
                                *
                                    含义:不跨级别的单个数量的任意,例如出现在包名部分表示包名级别的任意名字的单个包
                                ..
                                    含义:不跨级别的多个数量的任意,例如出现在包名部分表示包名级别的任意名字的多个包
                                +
                                    加在类型后边表示匹配当前类型及其子类型
                    Within
                        概念:通过Within(包名部分+类名部分)来匹配某些类中的所有的方法
                        语法:Within(包名部分+类名部分)
                    This
                        通过指定代理对象对应的接口的全限定名来匹配对应的目标方法
                        语法:This(全限定类名)
                        注意:This表达式中不能使用通配符
                    Target
                        通过指定目标对象对应的接口或直接指定目标对象对应的类来匹配对应的目标方法
                        语法:Target(全限定类名)
                        注意:Target表达式中不能使用通配符
                    bean
                        Spring配置文件中配置的Bean的名字或id来匹配对应的类的所有方法
                        语法:bean(beanId or beanName)
                        注意:这是Spring中特有的语法,在@Aspect语法中没有
                    注解型关键字:限制注解从而来限制要匹配的目标方法
                        @Within
                        @This
                        @Target
                    注解来限制匹配范围的方式
                        可以使用与或非:如:@(A||B)
                        修饰类型时的"@A B"
                            表示匹配加有@A注解的B类型
                        在参数部分时的"@A(B)"
                            表示匹配参数被@A注解的目标方法
                如何看懂
                    先看必填部分,分析出各个部分在哪里,然后分析各个部分的含义
            Advice
                @Before
                @After
                @Around
                @AfterReturning
                @AfterThrowing
                如何传递参数
                    JoinPoint
                    args
                如何接收返回值
                    @Around的jb.proceed()方法执行得到返回
                    @AfterReturning中的returning属性
                调用顺序
                    多个同类型的通知之间顺序是不定的
                    多个Advice之间通过实现Ordered接口来指定它们的织入顺序
                返回情况
                    当多个AfterReturning类型的通知共同操作一个方法的返回值时只有第一个通知能够接受到返回,后面接受到的都是null值
        xml配置
            aspect
            pointcut
            advice
            advice和pointcut的关系
            advice的运行时机
            各种advice的配置方法
            传递参数
        AOP API
            Pointcut
            各种advice的API
            代理相关的API:ProxyFactoryBean
            advisor相关的API:RegexpMethodPointcutAdvisor
        总结配置AOP的各种方式
            1.@AspectJ+<aop:aspectj-autoproxy/>+自动代理
            2.<aop:before>+xml中使用expression表达的pointcut+自动代理
            3.使用Spring3风格的aop:advisor+xml中使用expression表达的pointcut+Spring1风格的advice的API+自动代理
            4.手动配置ProxyFactoryBean(手动代理)+Spring1风格的advisorBean(advisor的相关API,其中interceptorNames引用于advisorBean)+advisorBean的配置中的advice属性引用于adviceBean,patterns属性引用于pointcut对应的正则表达式
        AOP在设计上的考虑
            是否拦截字段?不用拦截字段,对字段的操作使用setter+依赖注入即可
            不要滥使用切面:切面影响性能
                什么情况下使用切面?符合切面的特点时
            正交性
            切面应该搜索范围小
    Spring对Jdbc支持
        概要
            好处
                我们只需要提供SQL和结果处理即可完成整个的jdbc的操作
            组成
                core包:提供JdbcTemplate和一些回调接口和类
                dataSource包:提供dataSource访问的工具
                object包:在core的基础上对jdbc进一步的封装,提供一些查询,修改和存储过程等相关的类
                support包:提供了一些SQLException的转换类以及相关的工具类
        JdbcTemplate
            Crud实现
                配置DataSource,把DataSource注入到实现类中,直接使用JdbcTemplate来execute sql
                如何传参?
                    直接执行一个拼接好的完整的sql
                    使用PreparedCallBack对sql中的占位符(?)进行赋值
                如何处理结果
                    PreparedCallBack
            创建
                new
                JdbcDaoSupport
        NamedJdbcTemplate
            crud实现
                增删改
                    配置DataSource,把DataSource注入到实现类中,增删改使用update(sql,new SqlParameterSource(queryObj))
                查询
                    配置DataSource,把DataSource注入到实现类中,查询使用query或者queryForXxx方法
                    如何传参?
                        SqlParameterSource
                        Map
                    如何处理结果
                        对每一行统一处理:RowMapper或RowCallBackHandler
                        对产生的结果集遍历后逐一处理:ResultSetExtractor<T>返回结果为T类型
                        使用queryForXxx方法可以自动处理结果
        DataSourceUtils
            用来管理DataSource,如果想要使用绑定Spring事务的connection对象,那么就可以使用DataSourceUtils类来获取连接,注意取得的连接不要手动关闭
        JdbcDaoSupport
            使用条件
                继承JdbcDaoSupport,提供dataSource的bean的注入
            好处
                实现类不用再写dataSource属性(已经通过继承获得)
                封装了获取JdbcTemplate,异常转换器,获取数据源等功能
    Spring对ORMapping的支持
        hibernateTemplate的使用
            增删改
                使用HibernateTemplate的save,persist,delete,update,merge等很多hibernate中可以使用的方法
            查询
                find(或findByXxx)
                    传递参数?
                        以?作为占位符则使用Object[]传递参数
                        以:name作为占位符则使用String[]和Object[]共同传递参数
            增删改查通用
                execute(hibernateCallback):其中hibernateCallback是实现了HibernateCallback接口的对象(在doInHibernate方法中直接使用参数session进行业务操作,不用关闭session不用去管事务)
                    子主题 1
            注意:在Spring和Hibernate集成的时候默认使用的是hibernate.sourceforge.net发布的dtd,所以在写一些hbm.xml配置文件的时候注意将相应的dtd声明改成hibernate.sourceforge.net发布的dtd
        HibernateDaoSupport
            使用条件
                继承HibernateDaoSupport,提供sessionFactory的bean的注入
            好处
                实现类不用再写sessionFactory属性(已经通过继承获得)
                封装了获取HibernateTemplate,异常转换器,获取数据源等功能
    Spring对事务的支持
        以PlatformTransactionManager为根的一致性的事务API体系
        Spring事务的优点
            一致性
            声明性事务
            提供了能够整合Spring中各种数据访问技术的API
        使用Spring的事务
            方案
                高层次方案:使用Spring的高层持久化集成API(最常用的方式)
                低层次方案:DataSourceUtils(针对JDBC),SessionFactoryUtils(针Hibernate),PersistenceManagerFactoryUtils(针对JDO)等等(极少使用)
                    在纯JDBC中,如果你需要使用Spring的事务,那么就需要使用上面的类来管理连接,如:Connection conn=DataSourceUtils.getConnection(dataSource);
            tx:advice中tx:method的属性
                name:指定方法名(可使用通配符,如get*等)
                propagation:事务传播属性,默认是required
                isolation:隔离级别
                read-only:该方法是否需要开启事务
                timeout:事务超时时间
                rollback-for:对于哪些exception采取回滚,如com.foo.MyBussinessException,ServletException
                no-rollback-for:对那些exception不回滚
            注意
                优先使用jdbc的transactionManager,Hibernate的transactionManager可以使用jdbc的transactionManager代替
                使用Spring AOP Transaction的前提是:被管理对象的被选中的且其中没有关闭或重新打开容器代码的动态方法
            种类
                声明性事务
                    两种配置方式
                        ①dataSourceBean+txManagerBean+tx:advice+aop:advisor+aop:pointcut
                        ②dataSourceBean+txManagerBean+贴在目标类上的@Transactional
                        比较
                            ①dataSourceBean+txManagerBean+tx:advice+aop:advisor+aop:pointcut②dataSourceBean+txManagerBean+贴在目标类上的@Transactional两种声明性事务的比较:在第二种方式中原本需要声明的aop:pointcut(也就是事务织入的大致位置)和tx:advice(事务织入的具体位置)随着@Transactional的贴上就随之确定了,若要设置propagation,isolation,rollbackfor等属性则直接设置@Transaction的相应的属性即可。
                        选择
                            实际开发中,对于较大的项目:采用xml配置的方式(在后期配置事务的时候不用改源代码,不用重新编译、打包、部署),对于较小的香米采用注解的方式
                编程性事务
                    使用TransactionManager
                    直接使用PlatformTransactionManager
                选择:声明性事务
    ssh的集成
        Spring3+Hibernate3
        Spring3+Struts2
        心得:集成其实就是管理其他技术的入口部分
    SpEL
        基本概念
        基本API
            ExpressionParser接口
                getValue(Expression,Class):解析expression返回Class指定的类型
            Expression接口
            EvaluationContext接口
                setVariable(variableName, value)
        基本运行流程
            1.词法语法分析(生成语法树),解析得到了Expression对象
            2.以context中的值作为参数,Expression对象运行getValue方法得到返回值
        运行原理
        基本表达式
            算数运算表达式
            关系表达式
             逻辑表达式
                注意:不支持 &&和||
            字符串连接及截取表达式
                语法:‘String’ [index]和'Hello ' + 'World!'
            三目运算及Elivis运算表达式
                语法:表达式1?:表达式2
                含义:当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2
                心得:其实就相当于JavaScript中的表达式1||表达式2
            正则表达式
                ‘123’ matches ‘\\d{3}’
        类类型表达式
            语法:T(Type)
            点(.)运算符的含义:与java中一样
            new运算符:和java中一样
            instanceof运算符:和java中一样
        Groovy语言中的安全导航运算符
            语法:(对象|属性)?.属性
            含义:用
来避免当“?.”前边的表达式为null时抛出空指针异常,而是返回null
        变量引用
            #variableName:引用自定义变量
            #root:引用根对象
            #this:一般表示引用当前上下文对象,在集合投影时又表示集合中每一个元素
            赋值表达式(=):和java中一样
        bean引用
            语法:@myBean
        集合
            定义List
                语法:{#variable1,#variable2}
                注意:{常量1,常量2,...}定义产生的List是final型的不可修改的
            定义数组
                语法:new Object[length]或者new Object[]{表达式1,表达式2}
                注意:定义多维数组只能动态定义不能立即初始化
            访问集合
                #collection[1]
                #map['key']
            集合投影
                语法:#collection.![#this.元素的属性]
                含义:#collection.![#this.xx]表示的含义是取出collection中每一个元素的xx重新组成一个新的Set或者List
            集合筛选
                语法:#collection.?[#this.xx(布尔表达式)]
                取出集合元素的所有属性中满足布尔表达式为true的属性组成List或者Set
        xml或注解中的Expresion
            语法:"#{SpEL表达式}"
基本概念
    是什么
        java/javaEE
        非侵入式
    能干什么
        概要
            能够把很多的技术集成到一起,形成一个整体
            体现了体系结构上的一些设计理念
        详细
            IoC/DI
            AOP
            对JDBC和ORM的支持
            事务
            集成其他技术,最典型的就是SSH
            SpringMVC
            其他技术:Spring Security/Web Flow等
    有什么
        Spring2.x
        Spring3.x
        比较
            Spring3较于Spring2.x多了EL、OXM等模块和Test大模块,主体内容差不多,只是划分的方式不一样。
    Spring3按照javaEE分层时的模块分布
IoC/DI
    基本理论
        是什么
            IoC
            DI
            两者之间的关系
        能干什么
        有什么
            容器
            组件
            配置文件
        理解
            对IoC的理解
                对"控制"的理解
                对"反转"的理解
                控制的什么东西被反转了
            对依赖的理解
            对DI的理解
                依赖于容器注入依赖
            对外部资源的理解
                本身不依靠外部不能得到的资源
            IoC思想中的几个原则的理解
                被动化原则
                    概念
                    目的
                最小知识原则
                    概念
                    目的
    HelloWorld
        写应用程序需要的对象,跟Java里面的写法完全一样
        为Spring写配置文件
            Bean元素,name和class
        客户端
            读取配置文件,创建ApplicationContext
            使用context来获取需要使用的bean
            再把这个bean赋值给对应的接口变量
            使用这个api来进行调用操作
        运行流程
    基本配置
        如何实例化容器
            3种方法
            读取多个配置文件的方式
                方式1:传入配置文件相对于classpath的路径字符串数组
                方式2:使用import元素
                注意:开发中文件的命名习惯
            配置文件和容器的关系
                对一个或多个配置文件的x次读取就会创建x个IoC容器,每个容器都会对应一片内存空间
                所以对于相同的配置文件来说,尽量只读取一次,实际开发中:一次性读取所有配置文件
        配置
            要配些什么
                1.bean的命名
                2.全限定类名
                3.bean的行为
                4.参数和属性值
                5.依赖关系
            如何初始化bean
                1.构造器
                2.静态工厂方法
                3.实例工厂方法
            依赖注入的配置
                配置形式
                    1.构造参数
                        顺序
                        类型
                        索引
                        名称
                    2.setter
                    注意
                        1.在程序中的写法
                        2.在配置文件中的写法
                        程序和配置文件之间的关系
                    选择
                        优先选择setter
                        如果要表达"初始化bean之前必须初始化某个参数"的含义时使用构造器方式
                传值方式
                    idref
                        传递值:传递的是bean的id,是一个字符串,而不是bean
                        传递范围:需要在idref作为标签时,对其属性进行赋值:bean,local,parent
                    ref
                        传递的值:传递的是bean
                        传递范围:需要ref作为标签:bean,local,parent
                    基本量
                    内部bean
                    自动装配
                集合的配置
                    list
                    set
                    properties
                    map
                    合并
                null值
                depends-on属性
                lazy-init属性
            bean的作用域
                singleton
                    含义:每一个IoC/DI容器中一个bean定义对应一个实例
                    范围:IoC/DI容器
                    创建时机:在容器创建时
                prototype
                    每次操作的时候就新建一个实例
                    创建容器的时不会初始化,每次获取bean的时候才初始化
                request
                session
                global session
            方法注入
                程序中的写法:抽象类的抽象方法
                配置:lookup-method
                使用范围:单例中的不单例
            生命周期
                认识:我们不能控制生命周期的运行,控制的只能是生命周期的回调方法
                Spring中Bean的装配过程
                    1.实例化;
                    2.设置属性值;
                    3.如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
                    4.如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
                    5.如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
                    6.调用BeanPostProcessor的预先初始化方法;
                    7.调用InitializingBean的afterPropertiesSet()方法;
                    8.调用定制init-method方法;
                    9.调用BeanPostProcessor的后初始化方法;
                Spring容器的关闭过程
                    1. 调用DisposableBean的destroy();
                    2. 调用定制的destroy-method方法;
                生命周期的回调方法
                    init,destroy
                    写法
                        实现InitializingBean和DestroyingBean接口
                        在配置文件中写入属性:init-method(或default-init-method),destroy-method(或default-destroy-method)
    ApplicationContext的其他应用
        国际化
            方式1:资源文件(properties文件)+配置文件(xml文件)+context.getMessage方法
                1.properties文件中写入中文是不允许的,需要写入中文相应的Unicode码
                2.properties文件中允许写入动态的量{0},{1}等
                配置文件中需要写入一个org.springframework.context.support.ResourceBundleMessageSource的bean,其id是messageSource(不可修改),并为其注入一个属性basenames:注入一个list集合,list集合中的元素值就是文件的名字(不包括文件后缀和文件后面的Locale信息)。
                getMessage方法
                    被ApplicationContext的实例来调用其实间接调用的是messageSource的getMessage方法
                    第一个参数:properties文件中的key
                    第二个参数:对properties文件中{0},{1}等的实际传参
                    第三个参数:缺省值
                    第四个参数:查找properties文件时对应的Locale
            方式2:properties资源文件+注入xml配置文件+ms.getMessage方法
                同上,仅仅只是需要将messageSource的bean ref到类的属性ms上
        读取资源
            通过context的Api来获取:context.getResource(String classpath:path).getInputStream().read(new byte[1024]);
            通过资源注入,然后使用Resource类的getInputStream()方法
        事件
            让bean实现ApplicationContextListener接口实现其onApplicationEvent()方法,onApplicationEvent()方法
        在web应用中的实例化
            Listener:org.springframework.web.context.ContextLoaderListener读取配置文件,真正创建ApplicationContext
            context-param:contextConfigLocation=/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml
                注意点:
1.contextConfigLocation的value值可以是多个路径,用逗号,空格,分号分隔
2.contextConfigLocation的value值支持通配符*
AOP
    基本概念
        是什么
            范式
            编程范式
            另一个角度
        有什么
            方面/关注点
        和OOP的关系
    思想的演变
        原始:具体功能具体实现,缺点是代码重复
        抽象方式1:提取公共功能+调用,缺点是在调用端过于主动(权利由调用端控制)
        使用模式:装饰模式,代理模式:覆盖+多态调用,缺点是在使用装饰类或代理类的时候仍然过于主动,且存在对相关API的依赖关系
            装饰模式
            静态代理
            动态代理
                JDK动态代理
                CGLIB动态代理
        AOP:CGLIB动态代理模式+容器+多态调用:既能减少重复代码,又能变功能组装的主动为被动,还没有暴露对相关代理API的依赖
    能干什么
        代码复用性
        降低功能上的耦合
    核心概念
        关注点
        通知
        连接点
        切入点
        切面
        目标对象
        AOP代理
        织入
        引入
    AOP的结构图
        aspect集合:①关注点+具体连接方式=advice ②连接点的集合=切入点两者组合起来
    AOP的运行流程
        1.形成advice:根据advice的具体配置找到关注点和通知类型形成advice
        2.形成切入点:根据切入点的配置找到所有的连接点形成切入点
        3.织入形成切面:根据配置中advice和切入点的对应关系,将两者组合形成多个切面
    helloworld
        Java代码
            写Target类
            写advice类(提供用来作为通知的方法)
        配置aspect
            在aop:config-aop:aspect中配置aspect的对应类:ref属性(仅仅只是为了后面在写关注点method属性的时候不用谢全限定名来图个方便而已)
            在aop:config-aop:aspect-aop:pointcut中配置切入点的连接表达式expression
            在aop:config-aop:aspect-aop:before(或其他通知类型如after,around等)中配置advice的关注点:method属性,以及配置advice和切入点的对应关系
        理解
            AOP在程序毫不知情的情况下织入了一些切面,体现了应用开发的组装式思维
    @AspectJ
        @Aspect
        @Before
        @Pointcut
        @After
        切入点表达式语法
            表达式关键字
                execution
                    execution表达式的基本概念
                        其实就是一个方法的全定义名称,只不过可以使用通配符(*,..,+)而已
                        分级:表达式可以拆分成修饰符部分,返回值部分,包名部分,类名部分,方法名部分,参数部分,抛出异常部分
                            必填部分
                                返回值部分,方法名部分,参数部分
                            可选部分
                        通配符的含义
                            *
                                含义:不跨级别的单个数量的任意,例如出现在包名部分表示包名级别的任意名字的单个包
                            ..
                                含义:不跨级别的多个数量的任意,例如出现在包名部分表示包名级别的任意名字的多个包
                            +
                                加在类型后边表示匹配当前类型及其子类型
                Within
                    概念:通过Within(包名部分+类名部分)来匹配某些类中的所有的方法
                    语法:Within(包名部分+类名部分)
                This
                    通过指定代理对象对应的接口的全限定名来匹配对应的目标方法
                    语法:This(全限定类名)
                    注意:This表达式中不能使用通配符
                Target
                    通过指定目标对象对应的接口或直接指定目标对象对应的类来匹配对应的目标方法
                    语法:Target(全限定类名)
                    注意:Target表达式中不能使用通配符
                bean
                    Spring配置文件中配置的Bean的名字或id来匹配对应的类的所有方法
                    语法:bean(beanId or beanName)
                    注意:这是Spring中特有的语法,在@Aspect语法中没有
                注解型关键字:限制注解从而来限制要匹配的目标方法
                    @Within
                    @This
                    @Target
                注解来限制匹配范围的方式
                    可以使用与或非:如:@(A||B)
                    修饰类型时的"@A B"
                        表示匹配加有@A注解的B类型
                    在参数部分时的"@A(B)"
                        表示匹配参数被@A注解的目标方法
            如何看懂
                先看必填部分,分析出各个部分在哪里,然后分析各个部分的含义
        Advice
            @Before
            @After
            @Around
            @AfterReturning
            @AfterThrowing
            如何传递参数
                JoinPoint
                args
            如何接收返回值
                @Around的jb.proceed()方法执行得到返回
                @AfterReturning中的returning属性
            调用顺序
                多个同类型的通知之间顺序是不定的
                多个Advice之间通过实现Ordered接口来指定它们的织入顺序
            返回情况
                当多个AfterReturning类型的通知共同操作一个方法的返回值时只有第一个通知能够接受到返回,后面接受到的都是null值
    xml配置
        aspect
        pointcut
        advice
        advice和pointcut的关系
        advice的运行时机
        各种advice的配置方法
        传递参数
    AOP API
        Pointcut
        各种advice的API
        代理相关的API:ProxyFactoryBean
        advisor相关的API:RegexpMethodPointcutAdvisor
    总结配置AOP的各种方式
        1.@AspectJ+<aop:aspectj-autoproxy/>+自动代理
        2.<aop:before>+xml中使用expression表达的pointcut+自动代理
        3.使用Spring3风格的aop:advisor+xml中使用expression表达的pointcut+Spring1风格的advice的API+自动代理
        4.手动配置ProxyFactoryBean(手动代理)+Spring1风格的advisorBean(advisor的相关API,其中interceptorNames引用于advisorBean)+advisorBean的配置中的advice属性引用于adviceBean,patterns属性引用于pointcut对应的正则表达式
    AOP在设计上的考虑
        是否拦截字段?不用拦截字段,对字段的操作使用setter+依赖注入即可
        不要滥使用切面:切面影响性能
            什么情况下使用切面?符合切面的特点时
        正交性
        切面应该搜索范围小
Spring对Jdbc支持
    概要
        好处
            我们只需要提供SQL和结果处理即可完成整个的jdbc的操作
        组成
            core包:提供JdbcTemplate和一些回调接口和类
            dataSource包:提供dataSource访问的工具
            object包:在core的基础上对jdbc进一步的封装,提供一些查询,修改和存储过程等相关的类
            support包:提供了一些SQLException的转换类以及相关的工具类
    JdbcTemplate
        Crud实现
            配置DataSource,把DataSource注入到实现类中,直接使用JdbcTemplate来execute sql
            如何传参?
                直接执行一个拼接好的完整的sql
                使用PreparedCallBack对sql中的占位符(?)进行赋值
            如何处理结果
                PreparedCallBack
        创建
            new
            JdbcDaoSupport
    NamedJdbcTemplate
        crud实现
            增删改
                配置DataSource,把DataSource注入到实现类中,增删改使用update(sql,new SqlParameterSource(queryObj))
            查询
                配置DataSource,把DataSource注入到实现类中,查询使用query或者queryForXxx方法
                如何传参?
                    SqlParameterSource
                    Map
                如何处理结果
                    对每一行统一处理:RowMapper或RowCallBackHandler
                    对产生的结果集遍历后逐一处理:ResultSetExtractor<T>返回结果为T类型
                    使用queryForXxx方法可以自动处理结果
    DataSourceUtils
        用来管理DataSource,如果想要使用绑定Spring事务的connection对象,那么就可以使用DataSourceUtils类来获取连接,注意取得的连接不要手动关闭
    JdbcDaoSupport
        使用条件
            继承JdbcDaoSupport,提供dataSource的bean的注入
        好处
            实现类不用再写dataSource属性(已经通过继承获得)
            封装了获取JdbcTemplate,异常转换器,获取数据源等功能
Spring对ORMapping的支持
    hibernateTemplate的使用
        增删改
            使用HibernateTemplate的save,persist,delete,update,merge等很多hibernate中可以使用的方法
        查询
            find(或findByXxx)
                传递参数?
                    以?作为占位符则使用Object[]传递参数
                    以:name作为占位符则使用String[]和Object[]共同传递参数
        增删改查通用
            execute(hibernateCallback):其中hibernateCallback是实现了HibernateCallback接口的对象(在doInHibernate方法中直接使用参数session进行业务操作,不用关闭session不用去管事务)
                子主题 1
        注意:在Spring和Hibernate集成的时候默认使用的是hibernate.sourceforge.net发布的dtd,所以在写一些hbm.xml配置文件的时候注意将相应的dtd声明改成hibernate.sourceforge.net发布的dtd
    HibernateDaoSupport
        使用条件
            继承HibernateDaoSupport,提供sessionFactory的bean的注入
        好处
            实现类不用再写sessionFactory属性(已经通过继承获得)
            封装了获取HibernateTemplate,异常转换器,获取数据源等功能
Spring对事务的支持
    以PlatformTransactionManager为根的一致性的事务API体系
    Spring事务的优点
        一致性
        声明性事务
        提供了能够整合Spring中各种数据访问技术的API
    使用Spring的事务
        方案
            高层次方案:使用Spring的高层持久化集成API(最常用的方式)
            低层次方案:DataSourceUtils(针对JDBC),SessionFactoryUtils(针Hibernate),PersistenceManagerFactoryUtils(针对JDO)等等(极少使用)
                在纯JDBC中,如果你需要使用Spring的事务,那么就需要使用上面的类来管理连接,如:Connection conn=DataSourceUtils.getConnection(dataSource);
        tx:advice中tx:method的属性
            name:指定方法名(可使用通配符,如get*等)
            propagation:事务传播属性,默认是required
            isolation:隔离级别
            read-only:该方法是否需要开启事务
            timeout:事务超时时间
            rollback-for:对于哪些exception采取回滚,如com.foo.MyBussinessException,ServletException
            no-rollback-for:对那些exception不回滚
        注意
            优先使用jdbc的transactionManager,Hibernate的transactionManager可以使用jdbc的transactionManager代替
            使用Spring AOP Transaction的前提是:被管理对象的被选中的且其中没有关闭或重新打开容器代码的动态方法
        种类
            声明性事务
                两种配置方式
                    ①dataSourceBean+txManagerBean+tx:advice+aop:advisor+aop:pointcut
                    ②dataSourceBean+txManagerBean+贴在目标类上的@Transactional
                    比较
                        ①dataSourceBean+txManagerBean+tx:advice+aop:advisor+aop:pointcut②dataSourceBean+txManagerBean+贴在目标类上的@Transactional两种声明性事务的比较:在第二种方式中原本需要声明的aop:pointcut(也就是事务织入的大致位置)和tx:advice(事务织入的具体位置)随着@Transactional的贴上就随之确定了,若要设置propagation,isolation,rollbackfor等属性则直接设置@Transaction的相应的属性即可。
                    选择
                        实际开发中,对于较大的项目:采用xml配置的方式(在后期配置事务的时候不用改源代码,不用重新编译、打包、部署),对于较小的香米采用注解的方式
            编程性事务
                使用TransactionManager
                直接使用PlatformTransactionManager
            选择:声明性事务
ssh的集成
    Spring3+Hibernate3
    Spring3+Struts2
    心得:集成其实就是管理其他技术的入口部分

SSH的集成:

SH集成:cfg.xml废除,Spring中的LocalSessionFactoryBean来代替(注入相关属性dataSource,mappingSources,hibernateProperties)

SS集成:

1:开启Struts2结合Spring3,在struts.xml中添加如下语句(老版本的struts.objectFactory并不是Spring所以需要做统一处理)

<constant name="struts.objectFactory" value="spring"/>

2:在web.xml中添加listener,如下:(利用Tomcat读取web.xml,Tomcat启动时会启动ServletContext从而调用ServletContextListener的子类ContextLoaderListenerContextLoaderListenercontextInitialized方法在该方法中读取applicationContext*.xml配置文件启动了Spring框架并初始化了SpringWebApplicationContext容器)(需要3中指定contextConfigLocation:Spring的主配置文件的位置,对于Struts2的配置文件则采用默认访问classpath:struts.xml的方式进行)

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

3:在web.xml中指定需要初始读取的spring配置文件,如下:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext-

*.xml,classpath*:applicationContext-*.xml</param-value>

</context-param>

当然别忘了加上Struts2自己的filter

4:在struts.xmlAction配置的时候,如下:

<action name="testAction" class="springBeanName">

<result name="success">/index.jsp</result>

</action>

5:在Spring中正常定义Bean就可以了,把Action定义成为Bean,如下:

<bean id="testAction" class="cn.javass.test.web.TestActioin">

<property name="ebi" ref="testEbi"/>

</bean>

6:在StrutsAction中,就可以通过依赖注入的方式来注入需要使用的接口了。

ss集成注意点:

struts.xml中配置Action的时候action元素的class属性的值直接引用于bean的名字即可

②配置actionBean的时候注意加上scope=”prototype”


SpEL
    基本概念
    基本API
        ExpressionParser接口
            getValue(Expression,Class):解析expression返回Class指定的类型
        Expression接口
        EvaluationContext接口
            setVariable(variableName, value)
    基本运行流程
        1.词法语法分析(生成语法树),解析得到了Expression对象
        2.以context中的值作为参数,Expression对象运行getValue方法得到返回值
    运行原理
    基本表达式
        算数运算表达式
        关系表达式
         逻辑表达式
            注意:不支持 &&和||
        字符串连接及截取表达式
            语法:‘String’ [index]和'Hello ' + 'World!'
        三目运算及Elivis运算表达式
            语法:表达式1?:表达式2
            含义:当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2
            心得:其实就相当于JavaScript中的表达式1||表达式2
        正则表达式
            ‘123’ matches ‘\\d{3}’
    类类型表达式
        语法:T(Type)
        点(.)运算符的含义:与java中一样
        new运算符:和java中一样
        instanceof运算符:和java中一样
    Groovy语言中的安全导航运算符
        语法:(对象|属性)?.属性
        含义:用
来避免当“?.”前边的表达式为null时抛出空指针异常,而是返回null
    变量引用
        #variableName:引用自定义变量
        #root:引用根对象
        #this:一般表示引用当前上下文对象,在集合投影时又表示集合中每一个元素
        赋值表达式(=):和java中一样
    bean引用
        语法:@myBean
    集合
        定义List
            语法:{#variable1,#variable2}
            注意:{常量1,常量2,...}定义产生的List是final型的不可修改的
        定义数组
            语法:new Object[length]或者new Object[]{表达式1,表达式2}
            注意:定义多维数组只能动态定义不能立即初始化
        访问集合
            #collection[1]
            #map['key']
        集合投影
            语法:#collection.![#this.元素的属性]
            含义:#collection.![#this.xx]表示的含义是取出collection中每一个元素的xx重新组成一个新的Set或者List
        集合筛选
            语法:#collection.?[#this.xx(布尔表达式)]
            取出集合元素的所有属性中满足布尔表达式为true的属性组成List或者Set
    xml或注解中的Expresion
        语法:"#{SpEL表达式}"