A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-7-31 10:39 编辑

Sping一站式框架

Sping介绍Sping体系
  • core container
    a) beans与core 它们提供spring框架最基本功能,包含ioc与di
    b) context 上下文对象,基于beans与cores
    c) spel它是sprng提供的一个表达式语言
  • Data access/integration
    a) 数据访问
    b) 集成
  • Web
    a) Spring本身提供spring mvc
    b) 也可以与其它的web层进行集成
  • AOP
    AOP大部分情况下是使用动态代理来实现的。
  • Test
    使用spring可以方便的进行测试

Spring优点
  • 方便解耦,简化开发
    Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
  • AOP编程的支持
    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
  • 声明式事务的支持
    只需要通过配置就可以完成对事务的管理,而无需手动编程
  • 方便程序的测试
    Spring对Junit4支持,可以通过注解方便的测试Spring程序
  • 方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
  • 降低JavaEE API的使用难度
    Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

IOC和DI
  • IOC
    inversion of controller控制反转
  • DI
    dependency injection依赖注入
  • 区别
    IOC 控制反转,是指对象实例化权利由spring容器来管理
    DI 依赖注入 在spring创建对象的过程中,对象所依赖的属性通过配置注入对象中。

Bean获取与实例化BeanFactory与ApplicationContext关系和区别
  • BeanFactory采用延迟加载的方案,只有在调用的getBean时才会实例化Bean

    • 有一个实现类叫做XmlBeanFactory

  • ApplicationContext是BeanFactory的子接口,有如下实现类,会在读取xml文件时立即创建Bean对象

    • FileSystemXmlApplicationContext
    • ClassPathXmlApplicationContext

  • ApplicationContext会在配置文件加载时,就会初始化Bean,并且会提供不同的应用层的Context实现,例如web开发种的的WebApplicationContext

bean标签中id和name的区别
id中不能存在特殊符号,name中可以,id符合xml的规范,name是为了更好的扩展
Bean的实例化方式
  • 无参数构造
  • 静态工厂
  • 实例化工厂

Bean的生命周期
  • instantiate bean对象实例化
  • populate properties 封装属性
  • 如果Bean实现BeanNameAware执行setBeanName
  • 如果Bean实现BeanFactoryAwar或ApplicationContextAwar设置工厂setBeanFactory或上下文对象setApplicationContext
  • 如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization
  • 如果Bean实现InitializingBean执行afterPropertiesSet
  • 调用自定义的init-method方法
  • 如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
  • 执行业务处理
  • 如果Bean实现DisposableBean执行destroy
  • 调用自定义的destroy-method

对于bean的生命周期方法:
第三步与第四步是让Bean了解spring容器。
第五步与第八步 可以针对指定的Bean进行功能增强,这时一般会使用动态代理.
第六步与第十步:通过实现指定的接口来完成init与destroy操作
但是在开发中一般不使用第6步与第10步,原因是我们可以使用第7步与第11步来完成。
第7步与第11步的初始化与销毁操作它无耦合,推荐使用的。但是必须在配置文件中指定初始化与销毁的方法
<bean init-method="" destroy-method=""></bean>
总结:
对于bean的生命周期,我们需要关注的主要有两个方法:
  • 增强bean的功能可以使用后处理Bean, BeanPostProcessor
  • 如果需要初始化或销毁操作我们可以使用init-method  destroy-method

Bean的作用域
在bean标签中有一个scope属性,用于描述bean的作用域
可取值:
  • singleton单例
  • prototype多例
  • request用于web开发中,将bean对象通过request.setAttribute()存储到request域中
  • session用于web开发中,将bean对象通过session.setAttribute()存储到session域中

Bean属性注入
  • 构造器注入
  • setter方法注入

    • 集合属性的注入

  • c和p名称空间

spELl表达式
spEL表达式的格式  #{表达式}
注解开发
  • 引入约束
    context
  • 类上注解(一般不加注解后面的value值)

    • @Component(" ")
    • @Repository(" ")
    • @Service(" ")
    • @Controller(" ")

    以上注解一般javaEE三层架构的对象才会使用这些注解
    • @Scope

      • prototype
      • singleton
      • request
      • session


  • 属性上注解

    • @Value(“值”)                基本数据类型/字符串@AutoWired                 具体对象(通过数据类型注入的)

      • @Qualifier("Bean的名称")                与AutoWired配合使用,可以根据名称注入属性@Resource(name="userDao")         等同于AutoWired与Qualifier同时使用的情况


  • 方法上注解

    • @postConstruct                初始化方法@PreDestroy                        销毁方法

    注意:对于销毁的方法,只有对单例的对象才有效果,而且需要调用ApplicationContext.close()方法时才能执行

整合JUnit4
导入test的jar包
在测试类上添加注解:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
在web中的应用
  • 到与web的jar包
  • web.xml中配置一个Listener
    <listener>
        <listener-class>org.springframework.context.ContextLoaderListener</listener-class>
    </listener>
  • 在web.xml中配置applicationContext.xml文件的位置
    默认情况下会在WEB-INF目录下查找applicationContext.xml
    如果applicationContext.xml文件不是在默认位置,我们可以在web.xml文件中配置
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    classpath:applicationContext.xml 它代表的是在当前工程的类路径下(可以理解成是在src)下来查找applicationContext.xml文件。
    contextConfigLocation它是在listener中声明的一个常量,描述的就是spring配置文件的位置。
    //获取ApplicationContext对象
    ApplicationContext context = (ApplicationContext) request.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
AOP
  • OOP面向切面编程
  • OOD面向对象设计
  • AOP面向切面编程
    日志记录
    性能统计
    事务处理
    安全控制
    异常检测

概念
[td]
概念
英文
解释
目标对象
target
被增强的对象
连接点
jointpoint
可能被增强的方法
切入点
pointcut
被增强的方法
通知/增强
advice
增加的功能
切面
aspect
对具体的方法做出的具体的增强
代理对象
proxy
增强后的对象
织入
weaving
增强的过程
Cglib动态代理
  • 创建Enhancer
    Enhancer enhance = new Enhancer();
  • 传递目标对象的Class
    enhance.setSuperclass(target.getClass());
  • 设置回调操作,需要实现Callback接口(子接口MethodInterceptor)
    enhance.setCallback(this);
  • 创建代理对象
    enhance.create();
  • intercept方法
    public Object intercept(Object proxy, Method method,Object[] args MethodProxy methodProxy){
        return method.invoke(target,args)
    }
doRecoveryActions
JdbcTemplate连接池及JdbcTemplate配置<!-- Spring内置连接池配置 -->
[Java] 纯文本查看 复制代码
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql:///springtest"></property>
    <property name="username" value="root"></property>
    <property name="password" value="1003"></property>
</bean>
​
<!-- c3p0内置连接池配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql:///springtest"></property>
    <property name="user" value="root"></property>
    <property name="password" value="1003"></property>
</bean>
​
<!-- JdbcTemplate配置 -->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>引入外部配置文件<context:property-placeholder location="classpath:ds.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${driverClass}"></property>
    <property name="jdbcUrl" value="${jdbcUrl}"></property>
    <property name="user" value="${user}"></property>
    <property name="password" value="${password}"></property>
</bean>JdbcTemplate的CRUD

  • update方法
    可以执行insert/update/delete操作
  • select操作

    • 简单数据类型
      QueryForObject(sql,类型.class,参数)
    • 复杂数据类型
      单个对象
      Object object = QueryForObject(sql,new RowMapper<T>,参数)
      多个对象
      List<T> list = Query(sql,new RowMapper<T>,参数)

  • 对结果集进行封装
    RowMapper的一个实现类BeanPropertyRowMapper
    使用前提:
    如果使用BeanPropertyRowmapper,实体类必须提供一个无参数的public构造方法,类中的bean属性名称与表中的列要对应
    注意:这个类是在spring2.5后提供。

Spring事务管理
  • 优点:

    • 提供一致的对于不同的事务管理的API
    • 支持声明式事务管理(重点)
    • 编程事务管理(在开发中应用比较少)
    • 优秀的整合与Spring的数据访问


Spring事务管理的三个接口
  • PlatformTransactionManager事务管理器,可以选择相关的平台
  • TransactionDefinition定义事务的相关信息,如隔离/传播/超时/只读
  • TransactionStatus描述事务具体的运行状态

PlatformTransactionManager
  • API

    • TransactionStatus getTransaction(TransactionDefinitaion definition) throw TransactionException
    • void commit(TransactionStatus) status throw TransactionException
    • void rollback(TransactionStatus) status throw TransactionException

  • 实现类

    • DataSourceTransactionManager 主要针对于JdbcTemplate开发  MyBatis开发
    • HibernateTransactionManasger主要针对于Hibernate开发
    • JpaTransactionManager 主要针对于JPA开发


TransactionDefinition
  • 隔离

    • ISOLATION_DEFUALT 它使用后端数据库的默认隔离级别(spring中选项)
    • ISOLATION_READ_UNCOMMITTED 不能解决问题,会发生脏读 不可重复读 虚读
    • ISOLATION_READ_COMMITTED 可以解决脏读 会产生不可重复读与虚读。
    • ISOLATION_REPEATABLE_READ 可以解决脏读,不可重复读 解决不了虚读
    • ISOLATION_SERIALIZABLE 串行化,可以解决所有问题

  • 传播
    常用的有三种

    • PROPAGATION_REQUIRED 默认值 两个操作处于同一个事务,如果之前没有事务,新建一个事务
    • PROPAGATION_REQUIRES_NEW两个操作处于不同的事务
    • PROPAGATION_NESTED它是一种嵌套事务,它是使用SavePoint来实现的。事务回滚时可以回滚到指定的savepoint,注意:它只对DataSourceTransactionManager有作用

    以下了解
    • PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不使用事务
    • PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
    • PROPAGATION_NOT_SUPPORTED 以非事务运行,如果有事务存在,挂起当前事务
    • PROPAGATION_NEVER 以非事务运行,如果有事务存在,抛出异常


TransactionStatus
  • API

    • boolean isNewTransaction()
    • boolean hasSavepoint()
    • void setRollbackOnly()
    • boolean isRollbackOnly()
    • void flush()
    • boolean isCompleted()






2 个回复

倒序浏览
666666666666666666666
回复 使用道具 举报
6666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马