Spring学习总结-2

10. Spring的AOP动态代理
· AOP相关术语
Target: 目标类
JoinPoint(连接点): 目标类里 可以被扩展/增强的方法
PointCut(切入点): 目标类里 实际被扩展/增强的方法
Advice(通知/增强): 扩展功能的逻辑。分为前置通知、后置通知、最终通知、异常通知、环绕通知
Aspect(切面): 把 Advice用到 切入点 的过程就叫切面
Introduction(引介): 特殊的通知,可以在运行期为类动态的添加一些方法或属性。
Weaving(织入): 把Advice 应用到 target的过程。

· AspectJ 简介
AspectJ 是一个基于Java的AOP框架,
本身不是spring的一部分,Spring2.0后增加了对AspectJ切点表达式的支持。
Spring开发AOP,需导入 Spring AOP jar包和AspectJ相关Jar包
aop,aopalliance,aspects,aspectjweaver

· 使用aspectJ 实现aop 的两种方式
一. 基于aspectJ的xml配置
二. 基于aspectJ的注解方式

· AspectJ常用表达式(用来配置切入点):
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
       任意修饰符 空格 方法名全路径 参数 异常
execution(* project.aop.Book.add(...))
execution(* project.aop.Book.*(...))
所有类的所有方法作切入点
execution(* *.*(...))
匹配所有 .save开头的方法 
execution(* save*(...))

· 基于aspectJ的xml配置
配置文件:
<aop:config>
<!--配置切入点-->
<aop:pointcut expression="execution(* project.aop.Book.add(...))" id="pc1"/>
<!--配置 切面 -->
<aop:aspect ref="增强类的对象">
<aop:before method="方法名" pointcut-ref="pc1"/>
</aop:aspect>

· 基于aspectJ的注解配置
在spring核心配置文件中,开启aop操作
<!--开启自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

//增强类 上配置注解
@Aspect
public class MyAdvice {
//在方法上 使用注解来完成增强配置
@Before(value="目标函数 表达式")
public void before() {
syso();
}
}

//测试
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Target target = (Target)context.getBean("target");
target.method();

11. log4j配置文件详解
#日志级别
log4j.rootLogger=info,stdout
#优先级从高到低 ERROR、WARN、INFO、DEBUG
# 配置 stdout 的日志信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=

#配置 输出文件 的日志信息
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=C:\mylog.log
log4j.appender.file.layout=org.apche.log4j.PatternLayout
#同上

12.spring整合web项目--解决加载核心配置文件问题
用 log4j 可观察出 每访问一次 Action 都会加载一次spring配置文件
解决方案:服务器启动时创建对象加载文件,底层使用 ServletContext监听器 
Spring 封装了 一个监听器,我们只需要配置一下就好:
一.导入 spring-web .jar包(监听器在此包中)
二.web.xml中配置监听器
<listener>
<listener-class>ContextLoaderListener
</listener>
三.web.xml中指定加载spring 配置文件 位置:
<context-param>
<param-name>contextLoaderListener(监听器源代码父类常量名)
<param-value>classpath:配置文件路径
</context-param>


13.Spring对不同持久化技术的支持,why为一站式框架?
ORM持久化技术 模板类
JDBC org.springframework.jdbc.core.JdbcTemplate
Hibernate5.0 org.springframework.orm.hibernate5.HibernateTemplate
iBatis(MyBatis) org.springframework.orm.ibatis.SqlMapClientTemplate
JPA org.springframework.orm.jpa.JpaTemplate


14.JdbcTemplate的使用
·需要jar包
spring-jdbc-x.x.x.jar,tx(事务),数据库连接包
·代码示例
//设置数据库连接信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///test");
//设置用户名,密码
//创建jdbcTemplate对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//调用jdbcTemplate对象里面的方法实现操作
String sql = "insert into user values(?,?)";
int rows = jdbcTemplate.update(sql,"lucy","250");
//rows 表示操作影响了 几行



· JdbcTemplate查询
//回忆DBUtils 查询
/*
QueryRunner runner = new QueryRunner(dataSource);
//返回对象
runner.query(sql,new BeanHandler<User>(User.class));
//返回list集合
runner.query(sql,new BeanListHander<User>(User.class));
//dbutils有借口ResultSetHandler,
//针对不同结果 有不同的实现类

//jdbcTemplate实现查询,有接口RowMapper,
//jdbcTemplate没有针对这个接口的实现类,需要自己进行数据封装。
*/
(1)查询 返回一个值:queryForObject(String sql,Integer.class)
(2)查询 返回对象: queryForObject(sql,RowMapper<T>, Object ...args);
RowMapper 接口的 方法: mapRow(ResultSet rs,int num)
其实 这个方法就是 封装了 JDBC 中的 while(rs.next())之前的操作。
(3)查询返回list集合:query(sql,RowMapper<T>,Object...args)


15. Spring 配置连接池 (c3p0)和 使用 jdbcTemplate
applicationContext.xml

<!--IOC创建c3p0的数据源类并完成数据库连接信息的注入-->
<Bean id="dataSource" class="xx.xx.c3p0.Xxxx">
<!--注入属性值-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<!--剩下的可以看源码中属性名完成配置-->
</Bean>

<!-- IOC创建JdbcTemplate对象并把DataSource属性注入 -->
<Bean id=jdbcTemplate" class="org.xx.xx.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</Bean>

<!--IOC创建DAO 并注入 jdbcTemplate-->
<!--IOC创建Service并注入 DAO-->


16. Spring事务管理API
(1)什么是事务?
一组sql操作,对sql数据库操作的最基本单元(要么都成功,一个失败都失败)
(2)事务特性
四个:原子性,一致性,隔离性,持久性
(3)不考虑隔离性会产生的问题
隔离性:多个事务之间互不产生影响
三个问题:脏读,幻读,不可重复读
解决:设置事务隔离级别

· Spring事务管理两种方式
第一种:编程式事务管理(不用)
第二种:声明式事务管理
(1)基于xml配置文件实现
(2)基于注解实现(更常用,简便)

· Spirng事务管理API
Spring事务管理 高层抽象 主要 包括三个接口:
PlatformTransactionManager :事务管理器
TransactionDefinition : 事务定义信息(隔离,传播,超时,只读)
TransactionStatus : 事务具体运行状态
(1)Spring针对不同的 DAO层/持久化 框架 提供接口(PlatformTransactionManager) 不同的实现类(JPA什么的有都提供)
DataSourceTransactionManager : Spring JDBC 或 iBatis 进行持久化数据时 使用
HibernateTransactionManager : Hibernate 5.0 持久化数据

(2)首先 需要在配置文件中 配置 事务管理器
(3)实验事务作用的代码环境 实例:
DAO层: 扣A钱;加B钱(单纯对数据库操作层,不添加业务)
Service层: 业务函数中执行扣A加B操作(Service层又叫业务逻辑层)
模拟 事务 : 在 函数中 制造异常(如 除零),然后查看数据变化。

· 声明式事务管理(XML配置)(步骤复杂不常用)
(1)引入约束 aop 和 tx
(2)配置事务管理器
<!--第一步:配置 事务管理器-->
<!--选择上面的事务管理器接口的不同实现类-->
<bean id="transactionManager" class="">
<!--注入 配置好的 数据源 的实现类-->
<property name="dataSource" ref="dataSource">
</bean>
<!-- 第二步: 配置 事务增强(AOP运用) -->
<tx:advice id="" transaction-manager="指定事务管理器">
<!-- 做事务操作 -->
<tx:attributes>
<!-- 设置需要进行增强(事务管理)的方法/切入点)-->
<tx:method name="可用通配符"/>
</tx:attributes>
</tx:advice>
<!--第三步:配置 切入点和切面 -->
<aop:config>
<!--切入点(疑惑:第二部已经配置过切入点了)-->
<aop:pointcut expression="execution(* 类名.方法)" id=""/>
<!--增强器配置-->
<aop:advisor advice-ref="事务增强的id" pointcut-ref=""/>
</aop:config>

· 声明式事务管理(注解方式)(常用)
<!-- 第一步:配置事务管理器 -->
<!-- 第二步:开启事务注解 -->
<tx:annotation-driven transaction-manager="事务管理器">

<!-- 第三步:在业务层的方法上添加 注解 :@Transaction 
也可在 类上直接添加 @Transactional 表示全部方法加事务-->
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值