Spring框架是进行对象管理,对象关联,解耦的一个中间层框架,是为了解决企业应用程序开发的复杂性而创建的。在SSH、SSM框架中Spring起着一个承上启下的作用,可以理解为一个整合框架。下面总结Spring的知识点,主要包括IoC和AOP两大技术。
一、Spring介绍
1、Spring概念
Spring:是轻量级的IoC和AOP的容器框架。是面向Bean的编程。
2、两大核心技术:IoC和AOP
控制反转IoC/依赖注入DI
面向切面编程AOP
二、Spring IoC
1、控制反转IoC/依赖注入DI
控制反转IoC:控制权由应用程序转移到IoC容器。由容器向应用程序注入应用程序所需的外部资源。
依赖注入DI:应用程序依赖容器,由容器创建并注入应用程序所需要的外部资源。
DI和IoC是对同一件事的不同描述而已,本质意义是一样的,实现了组件的解耦。
2、IoC使用关键技术
JDOM、反射机制、工厂模式
3、Spring配置文件Bean的作用域
Singleton:在Spring容器中仅存在一个共享的Bean实例,单例。 框架默认创建对象是单例的
Prototype:每次从容器中都获取一个新的实例,相当于new,多例
二者选择的原则:有属性的bean使用Prototype,无属性的bean则使用singleton
Request:每次HTTP请求都会创建一个新的Bean实例
Session:同一个HTTP请求共享一个Bean实例
global session:同一个全局Session共享一个Bean实例
4、使用Spring IoC步骤
- 创建工程并添加Spring的jar包:commons-logging-1.1.3.jar、spring-core-.jar等
- 拷贝框架的核心配置文件applicationContext.xml,存放在src目录下
- 创建业务层和数据访问层接口 :Dao、entity、Service层
- 编写业务层和和数据访问层实现类:DaoImpl、ServiceImpl类
- 在ServiceImpl类中添加DAO接口引用(private UserDao userDao;)和相关访问器(setter方法)
- 编写Spring配置文件,完成业务层和数据访问层装配(通过Bean创建对象,实现注入)
5、Spring Bean封装机制
Spring以Bean的方式管理所有的组件;Spring负责创建Bean的实例,并管理其生命周期-创建,初始化,销毁
BeanFactory是工厂模式的实现,负责创建和管理bean。如果使用BeanFactory来加载Spring配置文件,那么在调用getBean时,框架才调用对象的默认构造方法来创建对象。
ApplicationContextBeanFactory的子接口,所以具备BeanFactory所有功能,同时增加扩展的功能,例如加载资源配置文件,国际化支持等!如果使用ApplicationContext来加载Spring配置文件,会在加载时解析配置文件,创建对象,而不是在getBean时创建。
6、依赖注入的多种方式
- 在实现类中:
set方法注入:容器运行时,通过类属性的set方法将关联对象注入到目标对象中
构造方法注入:容器运行时,通过类的构造方法将关联对象注入到对象中
- 在配置文件中:
property装配:如,<property name=”userDao” ref=”userDao”></property>
p命名空间装配:首先声明xmlns:p=”http://www.springframework.org/schema/p”
其次p:属性装配<beanid=”.” class=”.” p:song = “Jingle” p:instrument-ref = “saxophone” />
- 不同类型参数的注入:
1、属性值为简单字符串时,通过property中的value标签来关联对象
2、属性值为引用类型/Bean时,通过property中的ref标签来关联对象
3、属性值为内部Bean时,property不写ref标签,把<bean>放中间
4、属性值为集合时,分别使用<list> <set><map> <props>标签实现
7、自动装配
no:默认值。Spring 默认不进行自动装配,必须显式指定依赖对象
byName:根据属性名自动装配。找不到什么也不做
byType:根据属性的类型自动装配。找不到什么也不做
constructor:根据构造方法的参数类型来装配。它针对构造方法。找不到抛异常
全局自动装配:声明default-autowire=”byName”放到beans里
8、拆分配置文件
将spring主配置文件拆分成action层、dao层、service层对应的配置文件
两种拆分方法:
1.在web.xml中使用通配符指定多个配置文件的位置,并通过监听器加载
2.在applicationContext.xml配置文件中引用其他配置文件,配置位置具体。
三、Spring AOP
1、面向切面编程-AOP
AOP概念:是通过动态代理的方式将代码切入到类的指定方法、指定位置上的编程思想。或者说是一种通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加功能的技术。
核心:动态代理设计模式、AspectJ、Jboss AOP、Spring AOP
2、Spring AOP术语
关注点 (Concern):是我们要考察或解决的问题。分为核心关注点(指系统中的核心功能,如订单管理)和横切关注点(指分散在各个模块中公共功能,如日志管理)
连接点(Joinpoint): 程序运行过程中的某一点,比如方法调用、属性访问、异常抛出
切入点(Pointcut):是特定的连接点,指可以插入增强处理的方法。
切面(Aspect):把散落在系统各处与横切关注点相关的重复代码抽取出来归整到一处形成一个模块。比如事务管理、权限管理;
代理对象(Proxy):为目标对象增加新功能从而产生的一个新的对象称为代理对象。负责调用拦截器和目标对象的方法
目标对象(Target):需要被增强处理的原对象,在spring中通常指service层接口实现类的对象
织入(Weaving): 将切面加入到(拦截器)方法中,为对象增加额外功能的过程
增强(Advice):在代理对象方法前后插入代码,在spring中增强是通过拦截器实现的
3、AOP 的实现原理
AOP分为静态AOP和动态AOP。静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。动态AOP是指将切面代码进行动态织入实现的AOP。
Spring的AOP为动态AOP,实现的技术为: JDK动态代理技术 和 CGLIB(动态字节码增强技术) 。尽管实现技术不一样,但都是基于代理模式 , 都是生成一个代理对象 。Spring默认是使用JDK的动态代理技术实现AOP。
JDK动态代理技术:主要使用到 InvocationHandler 接口和 Proxy.newProxyInstance() 方法
CGLIB(动态字节码增强技术):是继承被代理对象,然后Override需要被代理的方法。
4. Spring AOP的配置
使用<aop:config> 标签在xml中进行配置,或者使用注解和@Aspect风格的配置。
<aop:config>:AOP配置的顶层元素,大多数的<aop:*>元素必须包含在<aop:config>元素内
<aop:pointcut>:定义切点 <aop:aspect>:定义切面
<aop:after-returning>:定义后置增强 <aop:after-throwing>:定义异常增强
<aop:advisor>:定义AOP增强器 <aop:around>:定义环绕增强
<aop:before>:定义前置增强 <aop:after>:定义最终增强
5、Spring AOP实现
Spring提供了4种实现AOP的方式:常用的是前两种
1.纯POJO切面:使用<aop:config><aop:aspect><aop:before>配置AOP
2.@AspectJ注解的切面:用@Aspect的注解来标识切面,<aop:aspectj-autoproxy/>
3.经典的基于代理的AOP:比较复杂,主要是配置切点和增强
4.注入式AspectJ切面:通过Spring集成AspectJ,AspectJ采用编译期织入和类加载期织入切面
实现步骤:
- 添加AOP相关jar包:如:aspectjweaver.jar、aopalliance-1.0.jar
- 在核心配置文件applicationContext.xml增加命名空间xmlns:aop和约束文件/spring-aop-2.5.xsd
- 基于@Aspect的AOP配置 1、启用基于注解的事务配置 2、定义要扫描的包
- 编写代理对象类和增强处理类
- 在Spring配置文件中定义切面、切入点
- 在切入点织入增强处理
6、切入点表达式
public * addUser(com.pb.entity.User):”*”表示匹配所有类型的返回值
public void *(com.pb.entity.User):”*”表示匹配所有方法名
public void addUser (..):”.. “表示匹配所有参数个数和类型
* com.pb.service.*.*(..):匹配com.pb.service 包下所有类的所有方法
* com.pb.service..*(..):匹配com.pb.service 包及子包下所有类的所有方法
7、增强处理类型
Before前置增强处理,在目标方法前织入增强处理
AfterReturning后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理
AfterThrowing异常增强处理,在目标方法抛出异常后织入增强处理
After最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理
Around环绕增强处理,在目标方法的前后都可以织入增强处理
三、配置c3p0、dbcp数据源
1、在Spring容器配置:适合单一数据库的事务管理
- 添加jar包:c3p0.jar或commons-dpcp.jar
- 配置属性有:连接数据库驱动类、url、用户名、密码、连接池连接数、等待时间
2、在Web容器配置:适合多个数据库之间的事务管理
- 添加jar包:c3p0.jar或commons-dpcp.jar
- 在Tomcat安装目录下的context.xml添加<Resource name..type..url..factory../>
- 在web项目下的web.xml添加数据源对象引用<resource-ref><res-ref-name> <res-type>..</>
3、在jdbc属性文件中配置
- 新建一个jdbc.properties属性文件并添加数据源信息:
dbc.driverClassName、jdbc.url、jdbc.username、jdbc.password等
- 在spring配置文件中引用:
<context:property-placeholder location=”classpath:jdbc.properties”/>
- 数据库连接池属性获取:采用诸如${jdbc.url}的方式引用属性值
四、Spring注解
1、常用注解
注解:将Bean的定义信息和Bean实现类结合在一起。常用的方式有
@Component
@Repository:用于标注DAO类
@Service:用于标注Service类
@Controller:用于标注Action类
@Autowired 实现Bean的自动装配,默认按类型匹配
@Qualifier(“userDao”) @Resource(name=”userDao”)按Bean的名称装配
@Scope(“prototype”) 指定Bean的作用域
2、使用注解定义增强
Spring通过集成AspectJ实现了以注解的方式定义增强类,大大减少了配置文件中的工作量
实现步骤:
- 为项目添加AOP的annotation支持
- 编写目标方法和增强处理
- 使用注解声明增强处理类,定义切入点并织入增强处理
- 在Spring配置文件中添加<aop:aspectj-autoproxy/>元素
3、使用XML或注解实现事务处理
- 使用XML配置声明式事务
1.配置事务管理类
<bean id=”myTransactionManager” class=”org.springframework.orm.hibernate3
.HibernateTransactionManager”>
<property name=”sessionFactory” ref=”sessionFactory”></property>
</bean>
2.配置事务属性
<tx:advice id=”txAdvice” transaction-manager=”myTransactionManager”>
<tx:attributes>
<tx:method name=”add*” propagation=”REQUIRED”></tx:method>
<tx:method name=”del*” propagation=”REQUIRED”></tx:method>
<tx:method name=”search*” propagation=”SUPPORTS” read-only=”true”></tx:method>
</tx:attributes>
</tx:advice>
事务的常用属性:
propagation事务传播机制:required 保证事务代码在当前事务中运行
timeout允许事务运行的最长时间:以s为单位
rollback-for触发回滚异常 ; rollback-for不触发回滚异常
isolation事务隔离级别:default ; read-only设置是否为只读型事务
对于只执行查询的事务,设置read-only为true。其他属性一般使用默认值,也就是允许修改。
3.配置事务AOP切入点
<aop:config proxy-target-class=”true”>
<aop:pointcut id=”bizMethods” expression=”execution(* com.pb.service.*.*(..))” />
<aop:advisor advice-ref=”txAdvice” pointcut-ref=”bizMethods”></aop:advisor>
</aop:config>
- 使用注解配置声明式事务
1.配置事务管理类(和xml配置一样),并添加对注解配置的事务的支持
<tx:annotation-driven transaction-manager=”txManager”/>
2.使用@Transactional为方法添加事务支持
@Transactional(propagation=Propagation.SUPPORTS)
public Employee login(Employee employee) throws Exception {……}
4、在Spring中创建SessionFactory
通过SessionFactory获取Session对象,由Session对象通过数据源连接数据库,完成数据库操作。
- 加入SessionFactory的实现类AnnotationSessionFactoryBean,支持XML和注解的映射配置
- 引用数据源,配置Hibernate参数、加载由注解定义的持久化类
<property name=”dataSource” ref=”dataSource” />
<property name=”hibernateProperties”><props><!–省略部分配置–></props></property>
<property name=”PackagesToScan”><list><value>com.p.entity</value></list></property>