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 {
@Override
public void save(User user) {
//这里并没实现完整的数据库操作,仅为说明问题
System.out.println("===============================");
System.out.println("保存");
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"));
users.add(new User(4, "暴天明", "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();
}
}
aop 通知
package aop;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
/**
* 通过 MethodInterceptor 接口实现环线增强
*/
public class AroundLogger implements MethodInterceptor {
private static final Logger log = Logger.getLogger(AroundLogger.class);
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object target = invocation.getThis();//获取被代理对象
Method method = invocation.getMethod();//获取被代理方法
Object[] args = invocation.getArguments();//获取方法参数
log.info("调用"+target+"的"+method.getName()+"方法。方法入参:"+Arrays.toString(args));
try {
Object result = invocation.proceed();//调用目标方法,获取目标方法返回值
log.info("调用"+target+"的"+method.getName()+"方法。方法返回值:"+result);
return result;
} catch (Throwable e) {
log.error(method.getName()+"方法发生异常:"+e);
throw e;
}
}
}
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="aroundLogger" class="aop.AroundLogger"/>
<!-- AOP 织入 -->
<aop:config>
<!-- 切点(织入点)业务包和子包中所有的类和方法都是织入点 -->
<aop:pointcut expression="execution(* biz..*.*(..))" id="pointcut"/>
<!-- 要织入的对象 -->
<aop:advisor advice-ref="aroundLogger" pointcut-ref="pointcut"/>
</aop:config>
</beans>
Test 测试数据
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();
}
}
log4j.properties 日记文件
# rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用
# 下面的属性配置中,所有日志的输出级别是info,输出源是console
log4j.rootLogger=info,console
# 定义输出源的输入位置是控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 定义输出日志的布局采用的类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 定义日志输出布局
log4j.appender.console.layout.ConversionPattern=%d %p [%c]%n - %m%n
效果图: