AOP
Aspect(切面) Oritend(面向)Progrmming(编程) 面向切面编程
Advice(通知) connetpoint(连接点) pointcut(切点) caspect(切面) advisor(织入)
软件系统可以是一组关注点组成的,直接的业务关注点就是直切关注点(主业务)
为直切关注点提供服务的就是横切关注点(交叉业务)。
切面:横切关注点被模块化的类,就叫切面。也就是增强类。深入的说就是
通知和切点的集合。
通知:增强类中的方法,就是通知。
连接点:在一个应用执行过程中,能插入一个切面的点。也就是说 主业务类的所有方法都是连接点,不一定是切点。
切点:可以切到一个或多个连接点,切到一个方法就是切点。
织入:增强(通知)和切点绑定的过程。
案例:
1. 引依赖
<!--织入的依赖-->
<dependency>
<groupId> org.aspectj</groupId >
<artifactId> aspectjweaver</artifactId >
<version> 1.8.7</version>
</dependency>
2.
Dao层
public interface IUserDAO { //接口
public void save(User user);
}
实现类
public class UserDAOImpl implements IUserDAO {
public void save(User user) {
System.out.println("sev sess!!!");
}
}
Service层
public interface IUserService { //接口
public void seve2(User user);
}
//实现类
public class UserServiceImpl implements IUserService {
public void seve2(User user) {
dao.seve(user);
}
private IUserDAO dao; //域属性
public IUserDAO getDao()
{
return dao;
}
public void setDao(IUserDAO dao)
{
this.dao = dao;
}
}
AOP层
public class LoggerBeforeAdvice implements MethodBeforeAdvice {
//Before 实现没实现的方法
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("我比你先执行!!!");
}
}
配置 注册
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
">
<!-- dao -->
<bean id=”dao”class=“cn...UserDAOImpl”></bean>
Calss 只能写接口实现类
<!-- service -->
<bean id=“service” class=“cn...UserServiceImpl”></bean>
//域属性的注入 用 ref ref指向 <dean id=”dao”>
<property name=”dao” ref=”dao”> </property>
<!--advice 通知-->
<bean id=”befoadvice” class=”cn...LoggerBeforeAdvice
”></bean>
<!--切面 要导aop命名空间 -->
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
<aop:config>
<!--01.切点-->
<aop :pointcut id=”mypointcut” expression=”execution
(public void sve2(cn....User))”></aop:pointcut>
<!--02.织入-->
<aop:advisor advice-ref=”befoadvice” pointcut-ref=”mypintcount”> </aop:advisor>
//测试
public class SpringTest0724 {
@Test
//aop测试
public void aop01(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextspring03aop.xml");
IUserDAO biz=(IUserDAO) ctx.getBean("dao");
User user=new User();
biz.save(user);
System.out.println("success!");
}
结果