User 实体类
package entity;
/**
* 用户实体类
*/
public class User implements java.io.Serializable {
private Integer id; // 用户ID
private String username; // 用户名
private String password; // 密码
private String email; // 电子邮件
public User() {
super();
}
public User(Integer id, String username, String password, String email) {
super();
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
// getter & setter
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "\nUser [id=" + id + ", username=" + username + ", password=" + password + ", email="
+ email + "]";
}
}
UserDao 接口与实现
package dao;
import java.util.List;
import entity.User;
/**
* 增加DAO接口,定义了所需的持久化方法
*/
public interface UserDao {
public void save(User user);
public List<User> getAll();
}
package dao.impl;
import java.util.ArrayList;
import java.util.List;
import dao.UserDao;
import entity.User;
/**
* 用户 DAO 类,实现 IDao 接口,负责 User 类持久化操作
* */
public class UserDaoImpl implements UserDao {
// private static final Exception NullPointerException = null;
@Override
public void save(User user) throws NullPointerException {
//这里并没实现完整的数据库操作,仅为说明问题
System.out.println("===============================");
System.out.println("保存");
// try {
// throw NullPointerException;
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
System.out.println("===============================");
}
@Override
public List<User> getAll() {
List<User> users = new ArrayList<User>();
users.add(new User(1, "景临境 ", "123456", "963@qq.com"));
users.add(new User(2, "何开 ", "123456", "963@qq.com"));
users.add(new User(3, "左阻 ", "123456", "963@qq.com"));
System.out.println("===============================");
System.out.println("得到所有的用户");
System.out.println("===============================");
return users;
}
}
UserBiz 接口与实现
package biz;
import java.util.List;
import entity.User;
/**
* 用户业务接口,定义了所需的业务方法
*/
public interface UserBiz {
public void addNewUser(User user);
public List<User> findAllUsers();
}
package biz.impl;
import java.util.List;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import entity.User;
import biz.UserBiz;
/**
* 用户业务类,实现对 User 功能的业务管理
* */
public class UserBizImpl implements UserBiz {
//声明接口类型的引用,和具体实现类解耦合
private UserDao userDao = new UserDaoImpl();
//dao 属性的 setter 访问器,会被 Spring 调用,实现市值注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addNewUser(User user) {
//调用用户 DAO 的方法保存用户信息
userDao.save(user);
}
@Override
public List<User> findAllUsers() {
// TODO Auto-generated method stub
return userDao.getAll();
}
}
LoggerAfter 通知
package aop;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
* 通知
*/
@Aspect
public class LoggerAfter {
private static final Logger logger = Logger.getLogger(Aspect.class);
/**
* 后置通知
* @param point
* @param ret
*/
@AfterReturning(value="execution(* biz..*.*(..))",returning = "ret")
public void afterReturning(JoinPoint point,Object ret){
logger.info("后置通知,传入的参数:"+point.getSignature());
}
/**
* 前置通知
* @param point
*/
@Before(value="execution(* biz..*.*(..))")
public void before(JoinPoint point){
logger.info("前置通知,方法参数:"+Arrays.toString(point.getArgs()));
}
/**
* 异常通知
* @param e
*/
@AfterThrowing(value="execution(* biz..*.*(..))",throwing="e")
public void afterThrowing(RuntimeException e){
logger.info("异常通知:"+e.getMessage());
}
/**
* 环绕通知
* @param jp
* @return
*/
@Around(value="execution(* biz..*.*(..))")
public Object around(ProceedingJoinPoint jp){
logger.info(jp.getSignature().getName()+"环绕前");
Object re = null;
try {
re = jp.proceed();
logger.info("环绕后,返回值:"+re);
} catch (Throwable e) {
e.printStackTrace();
}
return re;
}
/**
* 最终通知
* @param point
*/
@After(value="execution(* biz..*.*(..))")
public void after(JoinPoint point){
logger.info(point.getSignature().getName()+"最终增强");
}
}
applicationContext.xml 配置
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
">
<!-- DAO类 -->
<bean id="userDao" class="dao.impl.UserDaoImpl" />
<!-- 业务类 -->
<bean id="userBiz" class="biz.impl.UserBizImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- 切面处理类 -->
<bean name="loggerAfter" class="aop.LoggerAfter"/>
<!-- 自动代理 -->
<aop:aspectj-autoproxy/>
</beans>
测试数据
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import entity.User;
import biz.UserBiz;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserBiz userBiz = (UserBiz) ctx.getBean("userBiz");
User user = new User();
user.setId(1);
user.setUsername("test");
user.setPassword("123456");
user.setEmail("963@qq.com");
userBiz.addNewUser(user);
userBiz.findAllUsers();
}
}
效果图: