目录
一、Spring AOP的原理(面向切面编程(AOP))
二、AOP相关术语
1.增强处理(Advice)
前置增强
后置增强
环绕增强
异常抛出增强
最终增强等类型
2.切入点(Pointcut)
3.连接点(Join Point)
4.切面(Aspect)
5.目标对象(Target object)
6.AOP代理(AOP proxy)
7.织入(Weaving)
三、怎样使用AOP
1.在项目中添加Spring AOP的jar文件
2.编写前置增强和后置增强实现日志功能
3.编写Spring配置文件,对业务方法进行增强处理
4.编写代码获取带有增强处理的业务对象
总结
一、Spring AOP的原理(面向切面编程(AOP))
- AOP的目标:让我们可以“专心做事”
- AOP原理:
- 将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决
- 采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能
预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术
二、AOP相关术语
1.增强处理(Advice)
前置增强
后置增强
环绕增强
异常抛出增强
最终增强等类型
2.切入点(Pointcut)
3.连接点(Join Point)
4.切面(Aspect)
5.目标对象(Target object)
6.AOP代理(AOP proxy)
7.织入(Weaving)
三、怎样使用AOP
1.在项目中添加Spring AOP的jar文件
2.编写前置增强和后置增强实现日志功能
package com.home.aop.log;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* @author lyt
* 用户业务日志
*/
public class UserServiceLogger {
Logger logger = Logger.getLogger(UserServiceLogger.class);
/**
* 前置增强
*/
public void before(){
logger.info("保存前");
}
/**
* 后置增强
*/
public void afterReturning(JoinPoint jp, Object result){
logger.info(jp.getTarget()+"\t"+jp.getSignature().getName()+"方法\t"+result);
logger.info("保存后");
}
}
3.编写Spring配置文件,对业务方法进行增强处理
xml配置文件头信息:
- 定义切入点
- 织入增强处理
<!--创建组件-->
<bean id="userDao" class="com.home.aop.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.home.aop.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!--创建日志组件-->
<bean id="logger" class="com.home.aop.log.UserServiceLogger"></bean>
<aop:config>
<!-- <aop:pointcut id="point" expression="execution(public void addNewUse(com.home.aop.bean.User))"/>-->
<aop:pointcut id="point" expression="execution(* com.home.aop.service..*.*(..))"/>
<aop:aspect ref="logger">
<aop:before method="before" pointcut-ref="point"></aop:before>
<!-- 指定需要注入返回值的属性名为result-->
<aop:after-returning method="afterReturning" pointcut-ref="point" returning="result"></aop:after-returning>
</aop:aspect>
</aop:config>
表达式匹配规则举例:
4.编写代码获取带有增强处理的业务对象
- 创建User类
package com.home.aop.bean;
/**
* @author lyt
* 用户类
*/
public class User {
private String name;
private String pass;
private String email;
getter&setter方法
构造器
}
- 创建UserDao接口
package com.home.aop.dao;
import com.home.aop.bean.User;
/**
* @author lyt
* 用户数据访问接口
*/
public interface UserDao {
/**
* 增加用户
* @param user 用户对象
*/
public void addUser(User user);
}
- 用户数据访问实现类
package com.home.aop.dao.impl;
import com.home.aop.bean.User;
import com.home.aop.dao.UserDao;
/**
* @author lyt
* 用户数据访问实现类
*/
public class UserDaoImpl implements UserDao {
/**
* @param user 用户对象
*/
@Override
public void addUser(User user) {
System.out.println(user.getName()+",用户添加成功!");
}
}
- 用户业务逻辑对象接口
/**
* @author lyt
* 用户业务逻辑对象接口
*/
public interface UserService {
public void addNewUser(User user);
}
- 用户业务逻辑实现类
public class UserServiceImpl implements UserService {
/**
* 调用userDao的添加方法
*/
private UserDao userDao;
private String who;
private String content;
/**
* 创建构造器
*/
public UserServiceImpl() {
}
public UserServiceImpl(String who, String content) {
this.who = who;
this.content = content;
}
@Override
public void addNewUser(User user) {
userDao.addUser(user);
}
}
- test
public class UserServiceTest {
private Logger logger = Logger.getLogger(UserServiceTest.class);
@Test
public void addUser(){
logger.info("开始");
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext3.xml");
logger.info(context);
/*UserService userService = context.getBean(UserServiceImpl.class);*/
UserService userService = (UserService)context.getBean("userService");
logger.info(userService);
User user = new User();
user.setName("Tom");
userService.addNewUser(user);
}
总结