一、Spring
1.1 Spring原理
Spring是一个开源框架,为简化java企业级应用开发而生。Spring可以使得简单的JavaBean实现以前只有EJB才能实现的功能。Spring是遵从约定大于配置的框架,主要的核心在于依赖注入和控制反转;
Spring的核心:
控制反转(IOC):Spring容器使用工厂模式为我们创建了所需要的对象,不需要我们直接的过度耦合的new或者getInstance等构造一个对象实例。实现解耦的能力。这是控制反转的思想。主要表现在,当我们使用Spring Config XML文件时,在一面以<bean>标签的形式申明对象id和类路径。spring应用上下文加载该配置文件时读取相关配置时,通过调用工厂类和反射机制去创建该对象。不需要我们创建,直接调用spring提供的对象就可以了。
依赖注入(DI): Spring使用JavaBean对象的set方法或者带参数的构造方法为我们创建所需对象时将其所属性自动设置所需要的值的过程,就是依赖注入的思想。
面向切面编程(AOP): 面向切面编程AOP的底层是动态代理,Spring提供了两种动态代理,一个采用接口的JDK动态代理,一个采用类的CGLIB方式实现动态代理。
1.2 Spring中的设计模式
- 单例模式——spring配置文件中的bean,@Bean注解的方法,@Autowire、@Controller/@RestController、@Service、@Component注解的方法默认为单例模式。
- 代理模式——动态代理使用者AOP
- 模板方法模式——用来解决代码重复问题。比如:RestTemplate、JmsTemplate、JpaTemplate;
- 工厂模式——使用工厂模式解决创建对象不会对用户暴露创建逻辑的问题。Spring使用BeanFactory来创建对象的实例。
1.3 Spring的常用注解
注解的启动:注解装配默认是关闭的。所以需要在Spring的核心配置文件中配置使用给予注解的装配模式。
<context:annoation-config/>
常用的注解:
@Required:该注解应用于设置方法
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量
@Qualifier:该注解和@AutoWired搭配使用,用于消除的定bean自动装配的歧义
1.4 Spring Bean的生命周期
bean定义: 在配置文件中使用<bean></bean>来定义
bean初始化:
- 在配置文件中通过制定的init-method属性来完成
- 实现org.springframework.beans.factory.InitializingBean接口
bean调用:有三种方式可以得到bean实例,并进行调用
bean销毁:销毁有两种方式
- 实现配置文件制定的destory-method属性
- 实现org.springframework.bean.factory.DisposeableBean接口
1.5 Spring结构图
1.6 Spring的作用
- Spring根据配置文件创建以及组装对象之间的依赖关系
- Spring面向切面编程能增强代码业务逻辑,比如实现日志记录、性能统计、安全控制,做到无侵入性
- Spring简化数据库管理以及事务使用
- Srping容器能够集成JAVAEE和更多的第三方开发架包,整合更多技术
1.7 Spring事务
声明式事务管理的定义:用在Spring配置文件中的声明式的处理事务来代替代码式的处理事务。这项的好处是:事务管理不侵入开发的组件。因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,这样拆封维护起来极其方便。
声明式事务管理有两种配置:配置文件和基于注解的
配置文件:
####基于TransactionInterceptor的声明式事务管理:有两个次要属性:transactionManager,用来制定
一个事务治理器,并将具体事务相关的操作请托给它;另一个是Properties类型的transcationAttributes
属性,该属性的每一个键值对中,键制定的是方法名,方法名可以行使通配符,而值就是表现呼应方法的所运用的
事务属性。
<bean id="transcationInterceptor"
class="org.springframework.transcation.interceptor.TranscationInterceptor">
<property name="transactionManager" ref="transcationManager"/>
<property name="transactionAttributes">
<props>
<!------需要添加事务的方法---------------> <prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="bankService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="interceptorNames">
<list>
<idref bean="transactionInterceptor"/>
</list>
</property>
</bean>
<bean id="bankServiceTarget"
class="....................BankServiceImpl>
<property name="bankDao" ref="bankDao"/>
</bean>复制代码
#########基于TransactionProxyFactoryBean的声明式事务管理:配置文件比上述简化了很多。也成Spring
的声明式事务治理
<bean id="bankServiceTarget"
class=".......................BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<bean id="bankService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="transcationManager" ref="transactionManager"/>
<property name="transcationAttributes">
<props>
<!------需要添加事务的方法---------------> <prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</bean>复制代码
#############基于<tx>命名空间的声明式事务治理:在前面两种方法的基础上,Spring2.x引入了<tx>命名空间,
联络形式<aop>命名空间。
<bean id="bankService"
class=".......................BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<tx:advice id="bankAdvice" transcation-manager="transactionManager">
<tx:attributes>
<!------需要添加事务的方法--------------->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!--------在类中的transfer方法上添加切点------------->
<aop:pointcut id="bankPointcut" expression="execution(**.transfer(..))"/>
<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config>复制代码
基于注解的声明式事务管理:使用注解@Transcational可以浸染于接口、接口方法、类和类方法上,被注解的方法都具有该类型的事务属性
@Transcational(propagation=Propagation.REQUIRED)
public boolean transfer(Long fromId,Long toId,double amount){
return bankDao.transfer(fromId,toId,amount);
}复制代码
编程式事务与声明式事务的区别:
- 编程式事务需要程序员自己编写事务处理,然后调用。
- 声明式事务是在配置文件中配置,一般搭配在框架中使用
- 声明式事务将系统和业务逻辑分开,减少代码侵入
1.8 BeanFactory常用实现类
BeanFactory是工厂模式的一个实现。提供控制反转的功能,用来把应用的配置和依赖从真正的应用代码中分离。常用的BeanFactory实现有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。
其中最常用的就是XmlBeanFactory,它根据xml文件中的定义加载beans,该容器从xml文件读取配置元数据并用元数据创建一个完全配置的系统或应用。
Spring配置文件有何用处:Spring Config Xml包含了类信息,描述了如何配置它们,以及如何相互调用。
ApplicationContext的实现类:
- FileSystemXmlApplicationContext:此容器从一个xml文件中加载beans的定义,xml Bean配置文件的全路径必须提供给它的构造函数
- ClassPathXmlApplicationContext:此容器也从一xml文件中加载beans的定义,需要想它的构造函数中传入classpath,因为它通过classpath查找bean文件
- WebXmlApplicationContext:此容器加载的是web.xml
BeanFactory与ApplicationContext有什么区别?
- BeanFactory:基础类型的ioc容器,提供完成的ioc服务支持,如果没有特殊制定的,默认采取延迟初始化策略。相对来说,容器启动初期速度较快,所需资源有限。
- ApplicationContext:ApplicationContext是在BeanFactory的基础上构建的,是相对比较高级的容器实现,除了BeanFactory的所有支持外,ApplicationContext管理的对象,在容器启动后默认全部初始化并且绑定完成。
1.9 Spring AOP
AOP,面向切面编程,它利用一种称为“横切”的技术,剖开封装对象的内部,并将那些影响了多个类的公共行为封装到一个可重用模块,成为Aspect(切面),简单的说将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于较少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作行和可维护性。
Spring 通知类型
通知是在方法执行之前或之后要做的动作,实际上是程序执行时通过SpringAop触发的代码段
Spring切面可以应用五种类型的通知:
- before 前置通知,在一个方法执行之前被调用
- after 后置通知,在一个方法执行之后被调用,无论方法是否执行成功
- after-running 仅仅当方法成功执行之后触发
- around 环绕通知,在方法执行之前到方法执行之后调用的通知
二、SpringMVC
SpringMVC的工作原理
- 用户向服务器发送请求,请求被SpringMVC前端控制器DispatcerhServlet捕获;
- DispatcherServlet对请求URL进行解析,得到请求资源标识符(URL),然后根据该URL调用HandlerMapping将请求映射到处理器HandlerExcutionChain;
- DispatchServlet根据获得Handler选择一个合适的HandlerAdapter适配器处理;
- Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet;
- Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherServlet通过ViewResolver视图解析器将逻辑视图转化为真正的视图View;
- DispatcherServlet通过Model解析出ModelAndView()中的参数进行解析最终展现完成的view并返回给客户端;