使用工具IDEA,通过maven管理jar包
1:注解方式实现aop编程
1.1:开发步骤
(1):先引入aop相关的jar文件,可以从maven的中央仓库获取
spring-beans-5.0.8.RELEASE.jar
spring-context-5.0.8.RELEASE.jar
spring-aop-5.0.8.RELEASE.jar
commons-logging-1.2.jar
aopalliance.jar
aspectjweaver.jar
aspectjrt.jar
(2):在spring的配置文件中applicationContext.xml引入aop名称空间,设置开启注解扫描,扫描的包,开启aop注解。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--开启注解扫描-->
<context:annotation-config></context:annotation-config>
<!--设置注解扫描的包-->
<context:component-scan base-package="com.qy"></context:component-scan>
<!--开启aop注解,proxy-target-class设置实现类代理对象,默认为生成接口对象-->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
</beans>
(3):写一个切面类
package com.qy.util;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* Created by Administrator on 2018/11/22.
* 对于其他bean使用Component组件注解
*/
@Component //加入到IOC容器
@Aspect //指定当前类为切面类
public class Log {
/*设置切入点
第一个*代表返回值类型为任意类型
com.qy.service.impl代表切入的包
第二个*代表包中的任意类
第三个*代表类中的任意方法
(..)代表方法中的参数
@Pointcut("execution(* com.qy.dao.impl.*.*(..))")
public void pointCut(){
}
//设置在切入点之前执行该方法
@Before("pointCut()")
public void before(){
System.out.println("---------执行前---------");
}
//设置在切入点之后执行该方法
@After("pointCut()")
public void after(){
System.out.println("----------执行后---------");
}
}
(4):切面类写完后,编写执行目标对象的方法、接口和实现类。
package com.qy.dao;
/**
* Created by Administrator on 2018/11/22.
*/
public interface UserDao {
public void find();
}
package com.qy.dao.impl;
import com.qy.dao.UserDao;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2018/11/22.
* @Repository为dao层的注解
* value:设置名称
*/
@Repository(value = "userDao")
public class UserDaoImp implements UserDao {
@Override
public void find() {
System.out.println("---------UserDaoImp------------");
}
}
(5):编写测试类,测试代码
package com.qy.test;
import com.qy.dao.impl.UserDaoImp;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by Administrator on 2018/11/22.
*/
public class UserTest {
@Test
public void Test01(){
BeanFactory beanFactory=new ClassPathXmlApplicationContext("/applicationContext.xml");
//目标对象有实现接口,spring会自动选择"jdk代理【动态代理】"
//如果在第二步配置配置文件时,没有设置proxy-target-class="true"则代码为
//UserDao userDao=(UserDao)beanFactory.getBean("userDao");
//目标对象没有实现接口,spring会用"cglib代理哦",必须设置proxy-target-class="true"
UserDaoImp userDaoImp=(UserDaoImp) beanFactory.getBean("userDao");
userDaoImp.find();
}
}