Spring入门详解

来源:互联网 发布:mysql 分析查询语句 编辑:程序博客网 时间:2024/05/02 04:36

准备开始看看Spring源码, 所以把Spring复习一遍,做下笔记..


一. Spring的4种关键策略:

1. 基于POJO的轻量级和最小入侵编程(基本不出现在业务逻辑中, 不用强制实现接口之类的);

2. 通过依赖注入和面向接口来实现松耦合;

3. 基于切面和惯例进行声明式编程;

4. 通过切面(减少重复调用)和模版减少样板式代码(比如JDBC那些重复的连接配置)。




二. 两个核心概念:依赖注入和AOP

Bean的依赖注入:

1. 构造器注入属性 (及通过构造器注入所需的类, 在XML中作相应配置)

    - 使用类默认public构造器

    - 使用<bean><constructor-arg value="传普通类型参数" 或用 ref="传对象引用"><bean>定义public构造器          参数

    - 如果没有public的构造器, 用<bean id="" class="" factory-method="获取单例的方法" />


2. 设值注入属性(getter和setter:实例化时注入) 

    - <bean><property name="" value="传普通类型参数" 或用 ref="传对象引用"><bean>

    - 如果Bean不想被共享可以设置成内部Bean, <bean><property name="" ref=""><bean class=""></property><bean> 


3. SpEL(Spring表达式语言 : #{expression},Spring3.0开始支持) 

    - 使用Bean的ID来引用Bean

    - 调用方法和访问对象属性 

    - 对值进行算术、关系和逻辑运算

    - 正则表达式匹配

    - 集合操作


4. 注解(XML配置<context:annotation-config>【不用写<property>和<constructor-arg>】---升级---》》<context:component-scan base-package="">【连Bean都可以不用写了】)

    - @Autowired [ (required=false) ]这样没有Bean也行: byType自动装配,如果找不到还可以用@Qualifier("")通过byName方式缩小范围

    - @Inject 与@Autowired不同的是无required属性,但有与@Qualifier("")对应的@Named("")

     - @Bean 基于Java方式的注入, 有编译检查, 不能同名。

component-scan扫描的类(stereotype):

@Component -- 表示为Spring组件(它的具体化有@Controller等)

@Controller -- SpringMVC的Controller  相当于Struts2的控制

@Repository -- 表示数据仓库

@Service -- 服务层



Bean的作用域(通过scope属性定义):



Bean的初始化和销毁:

<bean id="" class="" init-method="执行一些Bean实例化时调用的方法" destroy-method="执行一些Bean销毁时调用的方法" />



AOP:

通过声明的方式将他们应用(在Spring配置文件中配置)到它们需要影响的组件中去, 是各个组件专注于自身的业务, 而不用把日志、事务之类的代码耦合(调用或者直接在组件实现)到组件的业务逻辑中去。



AOP在Spring配置文件中的配置:

<aop : config>  <aop:aspect ref="logBean , safeBean Or...切面."> 
    <aop:pointcut id="you logistic bean" expression="execution(* *.切点业务方法)" />    <aop:before pointcut-ref="you logistic bean" method="前置切面方法">    <aop:after pointcut-ref="you logistic bean" method="后置切面方法">  </aop:aspect> </aop : config>

  execution[在方法执行时触发](*[返回任意类型] com.weniuwuren[包名].method[方法名](..[参数]))  

  && [ || ] [ ! ] within(com.wenniuwuren.*)


表达式:

  


通知器:




AOP核心名词:


其中,切点(where)定义了哪些连接点会得到通知(what,when)。


当然,切面还有个很强大的功能。为Java这个非动态语言, 添加新Method(以上描述的是新增功能:安全,日志)。

<aop:declare-parents

  types-matching="实现类"

  implement-interface="要被实现的接口"

  default-impl="" or deltegate-ref=""/>


三. Spring容器(创建Bean, 装配他们, 配置他们, 管理他们的整个生命周期):

  Bean Factory最基本容器 ---- 基于这个之上又建立Application(应用上下文)

  Application分为三类:

    -ClassPathXmlApplicationContext : 读取类路径下的XML配置文件加载Application

    -FileSystemXmlApplicationContext : 读取文件系统下的XML配置文件并加载Application

    -XmlWebApplicationContext : 读取Web应用下的XML配置文件并加载Application


通过下图命名空间配置容器(常用就是Beans了)





四. Spring生命周期



上图解释:

1. Bean实例化

2. 填充属性----Spring将值和Bean的引用注入Bean对应属性中

3. 如果Bean实现了BeanNameAware接口, Spring将Bean的ID传给setBeanName()方法

4. 如果Bean实现了BeanFactoryAware接口, 将调用setBeanFatory()方法将Beanfactory实例传入

5. 如果Bean实现了ApplicationContextAware接口, 将调用setApplicationContext()方法将上下文引用传入

6. 如果实现了BeanPostProcessor接口, 将调用相应初始化方法

7. InitializingBean初始化

8. 如果实现了BeanPostProcessor接口, 将调用相应初始化方法

9. Bean可以使用了, 它们将在ApplicationContext中直到, ApplicationContext被销毁

10.  DisposableBean销毁

以上步骤均可自定义一些操作。



五. 事务(在XML中用tx命名空间定义, <tx:annotation-driven transaction-manager="transactionManager"/>)

  Spring以来以下5个参数来控制如何管理事务。

  <1> propagation behavior(传播行为):客户端与被调用方法之间的事务边界。 [事务应该被启动还是挂起,方法是否在事务中运行]



  <2> isolation level(隔离级别):一个事务可能受其他并发事务影响的程度。



<3> read only(只读):是否为只读事务。只读优化是由事务启动时数据库实施的, 只对启动一个新事务(PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED)才有意义。


<4> timeout(事务超时)  事务开始时启动,所以只对启动一个新事务(PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED)才有意义。


<5> roll back(回滚原则) 




六. Spring框架模块




     


0 0
原创粉丝点击