因为是学习总结 所以参考了很多资料做的博客 如果有侵权 请联系我。写的不对的欢迎指出
Spring: -开源的轻量级框架
Spring核心:
IOC(控制反转控,制反转还有一个名字叫做DI(Dependency Injection),中文意思叫依赖注入。)-------Spring IOC是Spring中最核心的部分,是以Bean的方式来组织和管理Java应用中的各种组件,提供配置层次的解耦。所有的Bean都由Spring BeanFactory根据配置文件生成管理。ApplicationContext是BeanFactory的加强版,提供了更多的功能,如自动创建,国际化等。
AOP: Spring AOP也是Spring的核心技术,AOP擅长处理一些具有横切性质的系统服务,如事务管理,安全检查,缓存等。Spring并没有提供完整的AOP实现,Spring侧重于AOP实现与Spring IOC容器之间的整合,因此Spring AOP通常和Spring IOC一起使用。
为什么使用Spring :
1:降低组件之间的耦合度,实现各层之间的解耦
2:可以使用容器提供的众多服务。如:
--事务管理服务
--JMS
--Spring core核心服务
--持久化服务
--其他
3:提供了单例模式支持。开发人员不需要自己编写实现代码
4:提供了AOP技术。实现如:权限拦截,运行监控等功能
5:提供了众多的辅助类。如JDBC Template,HIbernate Template
6:对主流的应用框架提供了集成支持。集成Struts,JPA,Hibernate。
7:缺点:目前不支持集群
spring模块:
spring核心容器(Core): BeanFactory提供了组件生命周期的管理,组件的创建,装配,销毁等功能
SpringContext:ApplicationContext,扩展核心容器,提供事件处理、国际化等功能。它提供了一些企业级服务的功能,提供了JNDI,EJB,RMI的支持。
springAOP: 提供切面支持
SpringDAO: 提供事务支持,JDBC,DAO支持
SpringORM: 对流行的O/R Mapping封装或支持
springWeb支持struts集成
springMVC自带的mvc框架
依赖注入 IOC:开发思想---
高内聚低耦合(
一个类中紧密相连,不同类最好不要关联紧密
)
IOC底层原理:
1.xml配置文件
2.dom4j解析xml
3.工厂设计模式
4.反射
一.setter注入
通过类的set方法,将xml中的参数注入到对象中,
适用于初始化,因为每次加载,都会调用ApplicationContext方法
步骤
:
1.在xml中配置方法
注意:
set list 都是value注入,map是entry注入
scope="prototype" 作用范围 将单一bean的定义限制而在任意数量的对象实例
2.class对应类中,给参数设置set方法,
3.使用ApplicationContext得到的对象调用方法就可以了
二.构造注入
与set注入一样,xml通过构造方法给赋值对象,
set注入和构造注入的区别?
a) setter注入更加的直观,自然,方便一些
b)在参数过多的情况下,构造注入就更加的繁琐,臃肿,根据代码规范,构造参数内最好不要写逻辑代码,参数也不要超过三个
c)构造注入的好处就是:
可以在某些情况下决定参数的注入顺序
主流方式
:setter注入为主,构造注入为辅,没有依赖关系的注入就用构造注入
而有其它依赖关系的注入,就考虑
setter注入
构造注入的步骤
:
1. 在类中添加构造方法,
注意在
4.2版本后,多个构造方法是不会出现错误的,也可以用index下标去决定使用哪一个构造方法
2. 配置 xml文件
三:基于注解的主动装配
(
2
)
@Controller:web层
(
3
)
@Service:service层
(
4
)
@Repository:Dao层
@Autowired
标注成员变量时,不需要有
set方法
@Resource
默认按名称类匹配的,它是
JDK
提供的
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在
Spring
配置文件中配置
<context:annotation-config/>
元素。
p命名空间和c命名空间
p是依赖于set注入的,c呢是依赖构造注入的
p约束:
配置
:
<bean id="user" class="xxx.Studentr"
p:age="23" p:username="张三" p:email="
zhangsan@pbdevj.com
"
/>
<bean id="userBiz" class="biz.impl.UserBiz"
p:dao-ref="userDao"
/>
c约束:
<bean id="magician" class="xxx.Student"
c:age="11"
c:username="李四"
AOP:
什么是aop?
AOP(Aspect Oriented Programming)
面向切面编程
通过预编译方式和运行动态代理实现程序功能的统一维护
作用:能够无入侵性完成代码
切面:指在执行某些方法时,进入断点(切面)模式,在之前,之后或出现异常等做一些处理,
为什么会出现aop?
Aop和ioc都是解决代码的耦合性,可以增强代码的扩展性和可维护性
AOP实现可分为两类:
预编译方式 :在编译的时候已经做好了aop处理
运行期方式 :在运行时做aop处理
那么什么是Aspectj ?
Aspectj 是一个面向切面的框架,Aspectj定义了AOP语法,Spring AOP底层也是使用了Aspectj的框架来实现操作的。
Spring AOP 和Aspectj的关系?
二者都是AOP技术
二者处理方式不一样:
Aspectj:在编译java代码时,(依赖ajc编译器)编译时增强,编译时增强。(
属于静态织入)
;
Spring AOP:在运行时动态修改类(动态代理),生成新类,称为运行时增强(动态织入)
使用静态织入的方式性能要比动态高,但是动态织入更加方便
Spring AOP原理: 采用动态代理模式。
Spring AOP采用动态代理的过程:
(1) 将切面使用动态代理的方式动态织入到目标对象(被代理类),形成一个代理对象;
(2) 目标对象如果没有实现代理接口,那么Spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类;(3) 目标对象如果是final类,并且也没实现代理接口,就不能运用AOP。
AOP操作术语
Joinpoint(连接点): 类里面可以被增强的方法,这些方法称为连接点
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Aspect(切面): 是切入点和通知(引介)的结合
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象(要增强的类)
Weaving(织入):是把增强应用到目标的过程.
把advice 应用到 target的过程
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
Spring容器中的Bean
对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成"依赖注入"——这就是所谓IoC的本质。
Spring的生命周期
bean的实例化:
1:当作用域范围为singleton时,在初始化Spring容易的时候实例化bean实例。
---1:如果lazy-init的值为true,则为延迟bean的实例化,即在Spring容器启动时不实例化bean的对象
2:当作用域范围为prototype时,在调用Spring的getBean的方法时实例化bean对象
注入依赖对象可以采用手工装配或者自动装配,在实际应用中建议采用手工装配。因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
bean的属性
id 命名bean,id属性值,不能包含特殊符号
class 创建对象所在类的全路径
name 功能与id一样,但是name可以包含特殊符号
scope 指定bean的作用域
1.singleton:默认单例模式
2.prototype:多例
3.request:创建对象放入request作用域
4.session:同上
5. global session :同上
事物拦截器的实现原理。
spring中的事务管理是通过AOP代理来实现的,对被代理对象的每个方法进行拦截,
在方法执行前启动事务,方法执行完后根据是否有异常和异常的种类进行提交或回滚。
事务的四大特性:ACID
原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
一致性(Consistency) 一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏
隔离性(Isolation) 可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
持久性(Durability) 一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中