文档章节

spring

Scofieldxs
 Scofieldxs
发布于 2015/11/09 18:47
字数 1580
阅读 95
收藏 5

###spring常用配置全景图

输入图片说明

###IoC

控制反转,依赖注入

####三种依赖注入方式

  • 构造方法注入:在构造方法中将需要的类作为参数传进去

      public FXNewsProvider(Listener listener,Persistener persistener){
          this.listener=listener;
          this.persistener=persistener;
      }
    
  • setter方法

      public class FooBar {
    
          @Setter
          @Getter
          private ResourceLoader resourceLoader;
      }
    

    xml配置:

    <bean id="resourceLoader" class="org.springframework.core.io.DefaultResourceLoader"></bean>

    <bean id="fooBar" class="..FooBar"> <property name="resourceLoader"> <ref bean="resourceLoader"/> </property> </bean>

  • 接口方法,不好用已淘汰

####spring的IoC #####两种容器类型:

  1. BeanFactory:基础IoC容器,延时初始化策略,启动快

BeanDefinitionRegistry是一个书架,用来放BeanDefinition

每一个对象,在容器中都有一个BeanDefinition的实例对应,保存对象的信息。

当客户端向BeanFactory请求对象的时候,BeanFactory返回一个完备的对象实例。

  1. ApplicationContext:高级,启动时完成初始化

#####注解 @Component:告知spring我是依赖

@Autowired :告知spring需要为当前对象注入哪些依赖

配置:

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

指定去包下面扫描component类

#####bean的scope

	<bean id="" class="" scope="prototype">

singleton:一个容器中只存在一个共享实例,所有依赖都引用它,存活时间和容器相同

prototype:产生一个新的对象给请求方,请求方负责生命周期,可以保存一些状态信息

####IoC原理

流程分为两个阶段: #####1.容器启动阶段

加载Configuration MetaData(xml配置文件)->组成相应的BeanDefinition->注册到BeanDefinitionRegistry

spring提供接口(BeanFactoryPostProcessor)能够在启动最后做一些额外的操作

该接口已有实现:PropertyPlaceholderConfigurer:管理配置文件

	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="locations">
	      <list>
	        <value>classpath:/conf/jdbc-mysql.properties</value>
			</list>
	    </property>
	</bean>

xml中使用占位符,启动阶段完成加载时,PropertyPlaceholderConfigurer会替换占位符

#####2.Bean实例化阶段

####bean周期

  • 实例化bean

采用策略模式来决定如何实例化bean

可以用反射或者cglib动态字节码实例化

实例化后用BeanWrapper包裹返回。BeanWrapper提供对bean的统一访问方式,省去反射复杂代码

  • aware接口

实例化后,检查实例是否实现了aware接口,如果是,则将aware接口中定义的依赖注入给实例

不明白干啥用的

  • BeanPostProcessor

前置处理、后置处理两种,来提供实例化的扩展。

AOP实现原理就是它?

  • InitializingBean和init-method

用来进一步调整实例状态

	<bean id="aa" class="bb" init-method="setupNum">
	</bean>

在初始化之后执行setupNum方法

  • DisposableBean和destry-method

定义使用完成后销毁操作,例如连接池在系统退出后释放资源


###ApplicationContext #####1.统一资源加载 spring使用org.springframework.core.io.Resource接口作为所有资源的访问接口

相对应的资源查找定位接口为ResourceLoader

	ResourceLoader loader=new DefaultResourceLoader();
    Resource resource=loader.getResource("d:\\README");
    resource.getFile();

ResourcePatternResolver是ResourceLoader的一个扩展,可以返回匹配路径中的多个Resource

ApplicationContext继承了ResourcePatternResolver,因此ApplicationContext支持spring内统一资源加载

#####2.国际化 提供MessageSource接口

#####3.内容事件发布 标准自定义事件三个角色:

  • 自定义的事件类型:EventObject
  • 自定义事件监听器:EventListener
  • 自定义事件发布者:EventPublisher

spring事件

  • ApplicationEvent:spring自定义事件类型 <-- EventObject
  • ApplicationListener:监听器
  • ApplicationContext:继承了ApplicationEventPublisher接口,担任发布者

#####4.简化的多配置文件加载功能 <import resource="applicationContext-properties.xml"/> <import resource="applicationContext-datasource.xml"/> <import resource="applicationContext-interceptors.xml"/>


#######others:依赖注入方式

  • JSR250提供的@Resource

IoC容器会根据@Resource所指定的名称,到容器中查找beanName对应的实例,注入给标记的对象

  • bean扫描:启动时spring会去com.web.app扫描所有标注了注解的类,注册到容器中

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

默认扫描的注解类型是@Component,又可以细分为@Repository,@Service,@Controller



###AOP

AOP是有一个概念,实现AOP的编程语言为AOL

AspectJ是扩展自java的一种AOL

AspectJ在编译时自动编译出了一个新类,属于编译时增强的AOP框架

#####基本概念

  • Joinpoint:织入点
  • Pointcut:表述Joinpoint
  • advice:代表将会织入到Joinpoint的横切逻辑
  • Aspect:对advice的一个封装
  • 织入器:完成横切关注点切入到代码的实现,spring aop使用ProxyFactory

####spring aop

在运行期间为对象生成一个代理对象,将横切逻辑织入到代理对象中,系统最终使用代理对象

两种实现方法:

  1. aop如果发现目标实现接口,则使用动态代理(java.lang.reflect.Proxy),

  2. 若没有实现任何接口,则aop使用CGLIB实现


###数据访问 #####1.统一异常

由于客户端对数据访问抛出的异常无法处理,所以抛unchecked exception比较好

异常思路:定义统一父类,不同异常为不同子类

父类:DataAccessException(继承自RuntimeException)

子类:包括

PermissionDeniedDataAccessException

#####2.jdbc api

  • template

JdbcTemplate对数据库操作做了一层封装:

	public <T> T execute(StatementCallback<T> action) throws DataAccessException {

	}

使用的时候提供StatementCallback和sql即可

	JdbcTemplate template=new JdbcTemplate();
    final String sql="select * from date_table";
    StatementCallback<Object> callback=new StatementCallback<Object>() {

        public Object doInStatement(Statement stmt) throws SQLException, DataAccessException {
            // TODO Auto-generated method stub
            return stmt.execute(sql);
        }
    };
    
    template.execute(callback);
  • 基于对象的JDBC操作

顶层抽象对象:RdbmsOperation

也是通过JdbcTemplate实现的

###事务 #####1.组成

  • Resource Manager(RM):管理资源

  • Transaction Processing Monitor(TPM):协调RM

  • Transaction Manager(TM):TPM核心模块

  • Application:应用程序

      application----TM----RM		
      application----TM----RM		
      application----TM----RM
    

有多个RM时,为分布式事务

使用两阶段提交:当RM都提交成功后,则整个事务提交成功

####spring事务

设计原则:事务管理与数据访问相分离

顶层接口:PlatformTransactionManager

下层重要接口:

  • TransactionDefinition:定义事务属性:事务隔离级别、超时时间
  • TransactionStatus:定义事务状态

#####spring 事务配置

  • 配置dataSource数据源:

      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
          <property name="targetDataSources">
              <map key-type="java.lang.String">
                  <entry key="ds1" value-ref="ds1" />
                  <entry key="ds2" value-ref="ds2" />
              </map>
          </property>
          <property name="strategy">
              <ref local="roundRobinLBStrategy" />
          </property>
      </bean>
    
  • 配置事务管理器DataSourceTransactionManager,与数据访问技术相对应

      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"></property>
      </bean>
    
  • 为transactionInterceptor设置哪些方法提供什么事务

      	<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
      <property name="transactionManager" ref="transactionManager" />
      <property name="transactionAttributes">
        <props>
          <prop key="query*">PROPAGATION_SUPPORTS,readOnly</prop>
          <prop key="is*">PROPAGATION_SUPPORTS,readOnly</prop>
          <prop key="select*">PROPAGATION_SUPPORTS,readOnly</prop>
        </props>
      </property>
       </bean>
    

####ThreadLocal

  • 作用:通过避免对象的共享来保证应用程序线程安全
  • ThreadLocal通过ThreadLocalMap来保存线程自己的资源
  • 应用:
    • 为每一个线程分配自己的connection,因为一个connection对应一个事务,无法共用connection

© 著作权归作者所有

上一篇: 网络知识
下一篇: java琐碎知识
Scofieldxs
粉丝 4
博文 24
码字总数 26524
作品 0
海淀
私信 提问
Spring Cloud Greenwich.RC1 发布

Spring Cloud Greenwich 首个 RC 版发布了,这个里程碑版本与 Spring Boot 2.1.1.RELEASE 兼容,各个项目都进行了更新,以实现与 Java 11 的兼容性。可点此查看在该版本中,分配给这个版本的...

局长
2018/12/17
1K
1
Spring Cloud Greenwich.M3 版本发布

Spring Cloud Function 的第三个 Milestone 3 已发布,该版本的各个模块现可在 Spring Milestone 存储库中使用。 主要更改 此版本与 Spring Boot 2.1.0.RELEASE 兼容,并已对 Java 11 兼容性...

淡漠悠然
2018/11/22
5.7K
0
Spring Boot的启动器Starter详解

Spring Boot的启动器Starter详解 Spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。 2)spring-boot...

anlve
2018/02/22
201
0
Spring Cloud Finchley SR4 正式发布

Spring Cloud Finchley 的 Service Release 4 (SR4) 版本已发布,本次更新主要是对其包含的一些模块进行了升级,查看发布说明以了解更多信息,可从 Maven 中央仓库获取源码。Spring Cloud Fi...

xplanet
06/15
2.4K
1
spring-boot-plus 1.1.0 发布,集成 Spring Boot Admin 管理和监控应用

spring-boot-plus1.1.0.发布 集成Spring Boot Admin管理和监控应用 Spring Boot Admin用来管理和监控Spring Boot应用程序 应用程序向我们的Spring Boot Admin Client注册(通过HTTP)或使用S...

geekidea
08/01
4.4K
9

没有更多内容

加载失败,请刷新页面

加载更多

Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾。 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/column/details/21930...

Java技术江湖
29分钟前
5
0
怎么用for循环打出爱心

先上效果图: 这是用*组成的爱心,下面讲讲思路: 首先这个图形可以拆分成三部分:第一部分是上面三行的两个梯形,第二部分是中间三行的长方形,第三部分是最下面的倒三角形。 其实图形拆分好...

INEVITABLE
35分钟前
4
0
用HttpUrlConnection伪造成HttpClient

https://www.jianshu.com/p/27ad06cc39d2

shzwork
40分钟前
4
0
Golang net/http处理表单请求

代码示范: package mainimport ("fmt""html/template""net/http")const tpl = `<html><head><title>Hey</title></head><body><form method="POST" action="/">......

听夜深窗外风
47分钟前
5
0
博客迁移 开源中国博客不再更新 之后考虑关停

博客迁移 开源中国博客不再更新 之后考虑关停 我的博客地址:blog.mrpei.cc

MrPei
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部