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
效果图:
相关推荐
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是...Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
springMybatis,springmvc,环绕通知,时间转换,des,md5加密账户密码.拦截器
spring的Aop中的前置通知,后置通知以及环绕通知简单代码
1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景
NULL 博文链接:https://free9277.iteye.com/blog/1935492
NULL 博文链接:https://z18022893621.iteye.com/blog/1956146
本人笔记中的源代码,Spring中的5种通知和3种加载通知的方式,五个通知包括:前置通知、后置通知、环绕通知、异常通知、引用通知。三种加载方式:默认加载、按名字加载、代理类加载
NULL 博文链接:https://baobeituping.iteye.com/blog/1208293
spring前置后置环绕通知,以及所需要jar
spring框架的aop前置、后置、环绕、异常通知以及自定义切入点实例
Spring spectJ AOP 前置通知 后置通知 返回通知 异常通知 环绕通知
尚硅谷Spring4视频教程,尚硅谷_佟刚_Spring_AOP 基础,尚硅谷_佟刚_Spring_返回通知&异常通知&环绕通知
Bean、通过 FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate ...
springboot配置AOP切面:前置通知、后置通知、环绕通知、返回通知、异常通知
Spring,mybatis,SpringMvc,环绕通知,时间转换,静态页面变动态页面
拦截环绕通知 12.3.2.2.前置通知 12.3.2.3.异常通知 12.3.2.4.后置通知 12.3.2.5.引入通知 12.4.Spring.NET中的Advisor 12.5.使用ProxyFactoryObject创建AOP代理 12.5.1.基本原理 12.5.2.ProxyFactoryObject的属性 ...
环绕通知(Around Advice) 6.2.4.6. 通知参数(Advice parameters) 6.2.4.7. 通知(Advice)顺序 6.2.5. 引入(Introductions) 6.2.6. 切面实例化模型 6.2.7. 例子 6.3. Schema-based AOP support 6.3.1. 声明一...
aop|[aop,正则,前置通知,后置通知,环绕通知](https://github.com/smltq/spring-boot-demo/blob/master/aop/HELP.md) data-redis|[lettuce,redis,session redis,YAML配置,连接池,对象存储]...
AOP程序 Spring框架 前置通知 后置通知 异常通知 环绕通知