本文为博主辛苦总结,但愿本身之后返回来看的时候理解更深入,也但愿能够起到帮助初学者的做用.
转载请注明 出自 : luogg的博客园 谢谢配合!
AOP就是面向切面编程,经过预编译的方式和运行期动态代理实现程序功能的统一维护的技术.java
主要的功能是 : 日志记录,性能统计,安全控制,事务处理,异常处理等.mysql
一. 预编译面试
二.运行期动态代理spring
Advisor : 表明通常切面,Advice自己就是一个切面,对目标类全部方法进行拦截(* 不带有切点的切面.针对全部方法进行拦截)sql
PointcutAdvisor : 表明具备切点的切面,能够指定拦截目标类哪些方法(带有切点的切面,针对某个方法进行拦截)apache
1.导入相应的jar包
spring-aop-3.2.0.RELEASE.jar AOP联盟的jar包
com.springsource.org.aopalliance-1.0.0.jar 依赖包编程
2.编写被代理的对象:
CustomerDao 接口
CustomerDaoImpl 实现类安全
3.编写加强的代码app
public class MyBeforeAdvice implements MethodBeforeAdvice{ @Override /** * method:执行的方法 * args:方法的参数 * target:目标对象 */ public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("前置加强"); } }
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法因此它有一个专门的编译器用来生成遵照Java字节编码规范的Class文件。框架
AspectJ是一个基于Java语言的AOP框架
Spring2.0之后新增了对AspectJ切点表达式支持
@AspectJ 是AspectJ1.5新增功能,经过JDK5注解技术,容许直接在Bean类中定义切面
新版本Spring框架,建议使用AspectJ方式来开发AOP
语法:execution(表达式)
execution( <访问修饰符> ? <返回类型> <方法名> ( <参数> ) <异常> )
execution(* cn.itcast.dao.GenericDAO+.*(..)) ---检索GenericDAO及子类
/** * 前置加强 */ @Before("execution(* com.luogg.demo1.UserDao.add(..))") public void before(){ System.out.println("前置加强===>"); }
/* * 后置加强 */ @AfterReturning(returning="returnVal",value="execution(* com.luogg.demo1.UserDao.delete(..))") public void after(Object returnVal){ System.out.println("后置加强===>方法的返回值为:" + returnVal); }
/* * 环绕加强 */ @Around(value="execution(* com.luogg.demo1.UserDao.find(..))") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("环绕前加强"); proceedingJoinPoint.proceed(); System.out.println("环绕后加强"); }
/** * 抛出异常 */ @AfterThrowing(value="execution(* com.luogg.demo1.UserDao.find(..))",throwing="e") public void err(Throwable e){ System.out.println("出异常了"+e.getMessage()); }
/* * 最终通知 */ @After("execution(* com.luogg.demo1.UserDao.find(..))") public void after(){ System.out.println("最终通知"); }
第一步 : 引入jar包.
aspectj依赖aop环境.
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
第二步 : 编写被代理对象UserDao
/** * 编写被代理对象 用户dao层 * @author luogg * */ @Repository("userDao") public class UserDao { public void add(){ System.out.println("添加用户"); } public void delete(){ System.out.println("删除用户"); } public void update(){ System.out.println("修改用户"); } public void find(){ System.out.println("查询用户"); } }
/** * 定义一个切面,就是切点和加强的结合 * @author luogg * */ @Service("myAspect") @Aspect //定义切面 public class MyAspect { /** * 前置加强 */ @Before("execution(* com.luogg.demo1.UserDao.*(..))") public void before(){ System.out.println("前置加强"); } }
<!-- 开启自动生成代理 --> <aop:aspectj-autoproxy/> <!-- 去扫描注解装配的Bean --> <context:component-scan base-package="com.luogg.demo1"></context:component-scan>
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringTest1 { @Autowired //@Qualifier("userDao") private UserDao userDao; @Test public void test1(){ userDao.add(); userDao.delete(); userDao.update(); userDao.find(); } }
输出结果
添加用户
前置加强
删除用户
前置加强
修改用户
前置加强
查询用户
在注解中写切点太麻烦了,直接赞成定义,而后经过类名.方法名调用赞成的切点.
@Pointcut("execution(* com.luogg.demo1.UserDao.find(..))") public void myPointCut(){} /* * 最终通知 */ @After("MyAspect.myPointCut()") public void after(){ System.out.println("最终通知"); }
面试:
JDBC : org.springframework.jdbc.core.JdbcTemplate
Hibernate3.0 : org.springframework.orm.hibernate3.HibernateTemplate
IBatis(MyBatis) : org.springframework.orm.ibatis.SqlMapClientTemplate
JPA : org.springframework.orm.jpa.JpaTemplate
导入jar包: * com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar * com.springsource.org.apache.commons.pool-1.5.3.jar <!-- 配置DBCP链接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///spring3_day02"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean>
导入jar包: * com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar <!-- 配置c3p0链接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///spring3_day02"/> <property name="user" value="root"/> <property name="password" value="123"/> </bean>
在src下建立jdbc.properties
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:///spring3_day02
jdbc.user = root
jdbc.password = 123
须要在applicationContext.xml 中使用属性文件配置的内容. * 第一种写法: <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"></property> </bean> * 第二种写法: <context:property-placeholder location="classpath:jdbc.properties"/>