From 1f9b78069640e742496574ecdc3fb3222b355054 Mon Sep 17 00:00:00 2001 From: fancyears <1243093769@qq.com> Date: Mon, 29 Apr 2019 17:52:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=87=87=E7=94=A8=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8=E8=BF=9B=E8=A1=8C=E6=8B=A6=E6=88=AAdao=E5=B1=82?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring/pom.xml | 38 +++++ spring/spring.iml | 15 +- spring/src/main/java/bean/Parent.java | 8 +- spring/src/main/java/config/BootConfig.java | 6 +- .../src/main/java/config/BootOutOfConfig.java | 8 +- .../src/main/java/config/BootWithConfig.java | 7 +- spring/src/main/java/dao/MyUserDao.java | 23 +++ spring/src/main/java/dao/UserDao.java | 42 ++---- .../src/main/java/dao/impl/MyUserDaoImpl.java | 59 ++++++++ .../src/main/java/dao/impl/UserDaoImpl.java | 87 +++++++++++ .../DisplayExecuteSqlInterceptor.java | 135 ++++++++++++++++++ .../src/main/java/log/LoggerWithoutXml.java | 12 +- spring/src/main/java/mapper/UserMapper.java | 23 +++ spring/src/main/java/service/BookService.java | 6 +- .../src/main/java/service/EntityService.java | 8 +- .../java/service/SimplePlayerService.java | 10 +- .../src/main/java/service/UserDetector.java | 1 - spring/src/main/java/service/UserRelease.java | 10 +- spring/src/main/java/service/UserService.java | 10 +- spring/src/main/resources/Beans.xml | 43 ++++-- spring/src/main/resources/log4j2.xml | 18 +++ spring/src/main/resources/resource.properties | 1 + .../java/day4/TestAnnontionWithoutXml.java | 8 +- spring/src/test/java/day4/TestImport.java | 2 - spring/src/test/java/day4/TestJSR250.java | 2 +- .../test/java/day6/TestAspectWithoutXml.java | 3 +- .../src/test/java/day7/TestJDBCTemplate.java | 33 +++++ 27 files changed, 524 insertions(+), 94 deletions(-) create mode 100644 spring/src/main/java/dao/MyUserDao.java create mode 100644 spring/src/main/java/dao/impl/MyUserDaoImpl.java create mode 100644 spring/src/main/java/dao/impl/UserDaoImpl.java create mode 100644 spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java create mode 100644 spring/src/main/java/mapper/UserMapper.java create mode 100644 spring/src/main/resources/log4j2.xml create mode 100644 spring/src/main/resources/resource.properties create mode 100644 spring/src/test/java/day7/TestJDBCTemplate.java diff --git a/spring/pom.xml b/spring/pom.xml index baccea1..23f7101 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -43,5 +43,43 @@ RELEASE compile + + + mysql + mysql-connector-java + 8.0.15 + + + + + + + + + + org.slf4j + slf4j-api + 1.7.26 + + + + org.slf4j + slf4j-log4j12 + 1.7.26 + test + + + + org.apache.logging.log4j + log4j-core + 2.11.2 + + + + org.apache.commons + commons-lang3 + 3.4 + + \ No newline at end of file diff --git a/spring/spring.iml b/spring/spring.iml index 878e79c..10015d6 100644 --- a/spring/spring.iml +++ b/spring/spring.iml @@ -2,12 +2,7 @@ - - - file://$MODULE_DIR$/src/main/resources/Beans.xml - file://$MODULE_DIR$/src/main/java/common/BeanFactoryGenerator.java - - + @@ -35,6 +30,14 @@ + + + + + + + + diff --git a/spring/src/main/java/bean/Parent.java b/spring/src/main/java/bean/Parent.java index 14389d9..5a531fe 100644 --- a/spring/src/main/java/bean/Parent.java +++ b/spring/src/main/java/bean/Parent.java @@ -27,7 +27,11 @@ public class Parent { */ private String word; - public String getName() { - return "这里是Parent:" + name; +// public String getName() { +// return "这里是Parent:" + name; +// } + + public void attemptToThrowException() throws Exception { + throw new Exception("手动触发异常"); } } diff --git a/spring/src/main/java/config/BootConfig.java b/spring/src/main/java/config/BootConfig.java index fd72672..fe49dda 100644 --- a/spring/src/main/java/config/BootConfig.java +++ b/spring/src/main/java/config/BootConfig.java @@ -1,6 +1,6 @@ package config; -import dao.UserDao; +import dao.impl.UserDaoImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,7 +13,7 @@ import org.springframework.context.annotation.Configuration; @Configuration public class BootConfig { @Bean - public UserDao getUserDao(){ - return new UserDao(); + public UserDaoImpl getUserDao(){ + return new UserDaoImpl(); } } diff --git a/spring/src/main/java/config/BootOutOfConfig.java b/spring/src/main/java/config/BootOutOfConfig.java index d992cee..d4e8e62 100644 --- a/spring/src/main/java/config/BootOutOfConfig.java +++ b/spring/src/main/java/config/BootOutOfConfig.java @@ -1,9 +1,7 @@ package config; -import dao.UserDao; +import dao.impl.UserDaoImpl; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import service.BookService; import service.UserService; /** @@ -26,7 +24,7 @@ public class BootOutOfConfig { return new UserService(getUserDao()); } @Bean - public UserDao getUserDao(){ - return new UserDao(); + public UserDaoImpl getUserDao(){ + return new UserDaoImpl(); } } diff --git a/spring/src/main/java/config/BootWithConfig.java b/spring/src/main/java/config/BootWithConfig.java index 1bba2c9..08db08e 100644 --- a/spring/src/main/java/config/BootWithConfig.java +++ b/spring/src/main/java/config/BootWithConfig.java @@ -1,10 +1,9 @@ package config; -import dao.UserDao; +import dao.impl.UserDaoImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Scope; /** * @Author: fancyears·milos·malvis @@ -18,7 +17,7 @@ import org.springframework.context.annotation.Scope; public class BootWithConfig { @Bean(initMethod = "init" ,destroyMethod = "cleanup") // @Scope("prototype")//非单例模式的bean不会执行destroyMethod定义的方法 - public UserDao getUserDaoFromConfig(){ - return new UserDao(); + public UserDaoImpl getUserDaoFromConfig(){ + return new UserDaoImpl(); } } diff --git a/spring/src/main/java/dao/MyUserDao.java b/spring/src/main/java/dao/MyUserDao.java new file mode 100644 index 0000000..0a2569b --- /dev/null +++ b/spring/src/main/java/dao/MyUserDao.java @@ -0,0 +1,23 @@ +package dao; + +import pojo.User; + +import java.util.List; + +/** + * @Author: fancyears·milos·malvis + * @Description: + * @Date: Created in 2019/4/29 16:53 + * @Modified By: + */ +public interface MyUserDao { + int insert(User user); + + int delete(Long id); + + List listUser(); + + User selectUser(Long id); + + int update(User user); +} diff --git a/spring/src/main/java/dao/UserDao.java b/spring/src/main/java/dao/UserDao.java index 338a500..c86dc4a 100644 --- a/spring/src/main/java/dao/UserDao.java +++ b/spring/src/main/java/dao/UserDao.java @@ -1,38 +1,24 @@ package dao; -import pojo.FastUser; import pojo.User; +import java.util.List; + /** * @Author: fancyears·milos·malvis * @Description: - * @Date: Created in 2019/4/16 10:52 + * @Date: Created in 2019/4/29 14:04 * @Modified By: */ -public class UserDao { - /** - * 模拟插入一个User对象 - * - * @param user - */ - public int insert(FastUser user) { - System.out.println("模拟插入User,Username=" + user.getUsername()); - return 1; - } - - public FastUser getUser(Long userId) { - User user=new User(); - user.setNickname("Rosy"); - user.setId(userId); - System.out.println("模拟查询User,Username=" + user.getNickname()+"\t ID="+user.getId()); - return user; - } - - public void init(){ - System.out.println("这里是UserDao初始化'"); - } - public void cleanup() { - // destruction logic - System.out.println("这里是UserDao cleanup'"); - } +public interface UserDao { + int insert(User user); + + int delete(Long id); + + List listUser(); + + User selectUser(Long id); + + int update(User user); + } diff --git a/spring/src/main/java/dao/impl/MyUserDaoImpl.java b/spring/src/main/java/dao/impl/MyUserDaoImpl.java new file mode 100644 index 0000000..5003784 --- /dev/null +++ b/spring/src/main/java/dao/impl/MyUserDaoImpl.java @@ -0,0 +1,59 @@ +package dao.impl; + +import dao.MyUserDao; +import mapper.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import pojo.FastUser; +import pojo.User; + +import java.util.List; + +/** + * @Author: fancyears·milos·malvis + * @Description: + * @Date: Created in 2019/4/29 16:53 + * @Modified By: + */ +public class MyUserDaoImpl implements MyUserDao { + @Autowired + private JdbcTemplate jdbcTemplate; + + public MyUserDaoImpl() { + } + @Override + public int insert(User user) { + String sql = "insert USER(username,password) values(?,?)"; + System.out.println(sql); + return jdbcTemplate.update(sql, user.getUsername(), user.getPassword()); + } + + @Override + public int delete(Long id) { + String sql = "delete USER t where t.id= ?"; + System.out.println(sql); + return jdbcTemplate.update(sql, id); + } + + @Override + public List listUser() { + String sql = "select * from USER"; + System.out.println(sql); + List result = jdbcTemplate.query(sql, new UserMapper()); + return result; + } + + @Override + public User selectUser(Long id) { + String sql = "select * from USER where id = ?"; + System.out.println(sql); + return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserMapper()); + } + + @Override + public int update(User user) { + String sql = "update USER t set t.username=? where id = ?"; + System.out.println(sql); + return jdbcTemplate.update(sql, user.getUsername(), user.getId()); + } +} diff --git a/spring/src/main/java/dao/impl/UserDaoImpl.java b/spring/src/main/java/dao/impl/UserDaoImpl.java new file mode 100644 index 0000000..391048f --- /dev/null +++ b/spring/src/main/java/dao/impl/UserDaoImpl.java @@ -0,0 +1,87 @@ +package dao.impl; + +import dao.UserDao; +import mapper.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import pojo.FastUser; +import pojo.User; + +import java.util.List; + +/** + * @Author: fancyears·milos·malvis + * @Description: + * @Date: Created in 2019/4/16 10:52 + * @Modified By: + */ +public class UserDaoImpl implements UserDao { + @Autowired + private JdbcTemplate jdbcTemplate; + + public UserDaoImpl() { + } + + /** + * 模拟插入一个User对象 + * + * @param user + */ + public int insert(FastUser user) { + System.out.println("模拟插入User,Username=" + user.getUsername()); + return 1; + } + + public FastUser getUser(Long userId) { + User user = new User(); + user.setNickname("Rosy"); + user.setId(userId); + System.out.println("模拟查询User,Username=" + user.getNickname() + "\t ID=" + user.getId()); + return user; + } + + public void init() { + System.out.println("这里是UserDao初始化'"); + } + + public void cleanup() { + // destruction logic + System.out.println("这里是UserDao cleanup'"); + } + + @Override + public int insert(User user) { + String sql = "insert USER(username,password) values(?,?)"; + System.out.println(sql); + return jdbcTemplate.update(sql, user.getUsername(), user.getPassword()); + } + + @Override + public int delete(Long id) { + String sql = "delete USER t where t.id= ?"; + System.out.println(sql); + return jdbcTemplate.update(sql, id); + } + + @Override + public List listUser() { + String sql = "select * from USER"; + System.out.println(sql); + List result = jdbcTemplate.query(sql, new UserMapper()); + return result; + } + + @Override + public User selectUser(Long id) { + String sql = "select * from USER where id = ?"; + System.out.println(sql); + return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserMapper()); + } + + @Override + public int update(User user) { + String sql = "update USER t set t.username=? where id = ?"; + System.out.println(sql); + return jdbcTemplate.update(sql, user.getUsername(), user.getId()); + } +} diff --git a/spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java b/spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java new file mode 100644 index 0000000..259b5fe --- /dev/null +++ b/spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java @@ -0,0 +1,135 @@ +package interceptor; + + +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; + +import java.lang.reflect.Method; + +/** + * @Author: fancyears·milos·malvis + * @Description: 方法拦截 粒度在方法上,调试管理 利用 AOP 原理, 在开发模式下于控制台展示 dao层 的实际执行的SQL + * @Date: Created in 2019/4/29 17:00 + * @Modified By: + */ +public class DisplayExecuteSqlInterceptor implements MethodInterceptor { + private static final Logger log = LoggerFactory.getLogger(DisplayExecuteSqlInterceptor.class); + + private static final String CONTROLLER ="CONTROLLER"; + private static final String SERVICE ="SERVICE"; + private static final String DAO ="DAO"; + private static final String IMPL ="IMPL"; + + @Value("true") + String codeModel; + String flag="true"; + @Override + public Object invoke(MethodInvocation mi) throws Throwable { + + + if(StringUtils.equals(flag,codeModel)){ + //获取该方法的传参 + Object[] ars = mi.getArguments(); + + //通过反射机制 获取到该方法 (Method 包含 作用域 返回类型 方法名 参数类型) + Method method= mi.getMethod(); + + //获取代理的对象 (也就是这个方法所在内存中的对象) + Object obj = mi.getThis(); + + Object [] params =new Object[]{} ; + String sql =""; + for(Object o :ars){ + if(o instanceof Object[]){ + params= (Object[]) o; + }else if(o instanceof String){ + sql=(String) o; + } + } + + Thread current = Thread.currentThread(); + StackTraceElement[] elements =current.getStackTrace(); + + //倒序输出 栈帧 信息 ,过滤出 项目的代码 这里只过滤出(Controller / service impl / dao impl)层的代码,如需要其他的可自行遍历 + if(elements !=null && elements.length>0){ + //获得项目名 + String packageName =DisplayExecuteSqlInterceptor.class.getPackage().getName(); + packageName=StringUtils.substringBefore(packageName,"."); + StringBuilder sb =new StringBuilder(); + sb.append(" -------->本次执行SQL的代码在<--------- "); + sb.append('\n'); + for(int i=elements.length ;i>0 ;i--){ + StackTraceElement e =elements[i-1]; + if(StringUtils.contains(e.getClassName(),packageName)){ + String cn=StringUtils.upperCase(e.getClassName()); + if(StringUtils.contains(cn,CONTROLLER)){ + sb.append( CONTROLLER+" 层 ->类名:"+e.getClassName()+",方法名:"+e.getMethodName()+",代码行数:"+e.getLineNumber()+""); + sb.append('\n'); + }else if(StringUtils.contains(cn,SERVICE) &&StringUtils.contains(cn,IMPL) && e.getLineNumber()>0) { + sb.append( SERVICE+" 层 ->类名:"+e.getClassName()+",方法名:"+e.getMethodName()+",代码行数:"+e.getLineNumber()+""); + sb.append('\n'); + }else if(StringUtils.contains(cn,DAO) &&StringUtils.contains(cn,IMPL) && e.getLineNumber()>0 ){ + sb.append(DAO +" 层->类名:"+e.getClassName()+",方法名:"+e.getMethodName()+",代码行数:"+e.getLineNumber()+""); + sb.append('\n'); + } + } + } + System.out.println(sb); + log.info(sb.toString()); + } + getExecuteSql(sql,params); + } + //执行被拦截的方法,切记,如果此方法不调用,则被拦截的方法不会被执行。 + return mi.proceed(); + } + + private String getExecuteSql(String sql, Object[] params) { + if (StringUtils.isNotBlank(sql)) { + if (params != null && params.length > 0) { + int a = getCount(sql, '?'); + int b = params.length; + if (a == b) { + sql = StringUtils.replace(sql, "?", "XXXX"); + for (int i = 0; i < params.length; i++) { + Object obj = params[i]; + if (StringUtils.isNotBlank(String.valueOf(obj)) && StringUtils.isNumeric(String.valueOf(obj))) { + obj = Integer.valueOf(String.valueOf(obj)); + } else { + obj = "'" + obj + "'"; + } + sql = sql.replaceFirst("XXXX", String.valueOf(obj)); + } + } else { + log.info("参数个数传的不正确, sql中 需要 :{} 个参数,实际传入参数为 :{} 个。", a, b); + return null; + } + } + } + + StringBuilder sb =new StringBuilder(); + sb.append(" ----------->本次执行sql为:<----------- "); + sb.append('\n'); + sb.append(sql+'\n'); + + log.info(sb.toString()); + return sql; + + } + + private int getCount(String sql ,char a ){ + int count=0; + if(null!=sql){ + for (int i = 0; i < sql.length(); i++) { + if(sql.charAt(i)==a){ + count++; + } + } + } + return count; + } + +} diff --git a/spring/src/main/java/log/LoggerWithoutXml.java b/spring/src/main/java/log/LoggerWithoutXml.java index a59ad2d..d137022 100644 --- a/spring/src/main/java/log/LoggerWithoutXml.java +++ b/spring/src/main/java/log/LoggerWithoutXml.java @@ -14,16 +14,18 @@ public class LoggerWithoutXml { /** Following is the definition for a pointcut to select * all the methods available. So advice will be called * for all the methods. + * + * 这个定义的切入点 */ @Pointcut("execution(* bean.Parent.*(..))") - private void selectAll(){ + private void pointCutDefine(){ System.out.println("执行selectAll"); } /** * This is the method which I would like to execute * before a selected method execution. */ - @Before("selectAll()") + @Before("pointCutDefine()") public void beforeAdvice(){ System.out.println("切点前操作"); } @@ -31,7 +33,7 @@ public class LoggerWithoutXml { * This is the method which I would like to execute * after a selected method execution. */ - @After("selectAll()") + @After("pointCutDefine()") public void afterAdvice(){ System.out.println("切点后操作"); } @@ -39,7 +41,7 @@ public class LoggerWithoutXml { * This is the method which I would like to execute * when any method returns. */ - @AfterReturning(pointcut = "selectAll()", returning="retVal") + @AfterReturning(pointcut = "pointCutDefine()", returning="retVal") public void afterReturningAdvice(Object retVal){ System.out.println("返回值:" + retVal.toString() ); } @@ -47,7 +49,7 @@ public class LoggerWithoutXml { * This is the method which I would like to execute * if there is an exception raised by any method. */ - @AfterThrowing(pointcut = "selectAll()", throwing = "ex") + @AfterThrowing(pointcut = "pointCutDefine()", throwing = "ex") public void AfterThrowingAdvice(IllegalArgumentException ex){ System.out.println("发生异常: " + ex.toString()); } diff --git a/spring/src/main/java/mapper/UserMapper.java b/spring/src/main/java/mapper/UserMapper.java new file mode 100644 index 0000000..3af164e --- /dev/null +++ b/spring/src/main/java/mapper/UserMapper.java @@ -0,0 +1,23 @@ +package mapper; + +import org.springframework.jdbc.core.RowMapper; +import pojo.User; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * @Author: fancyears·milos·malvis + * @Description: + * @Date: Created in 2019/4/29 14:08 + * @Modified By: + */ +public class UserMapper implements RowMapper { + @Override + public User mapRow(ResultSet resultSet, int i) throws SQLException { + User user=new User(); + user.setId(resultSet.getLong("id")); + user.setUsername(resultSet.getString("username")); + return user; + } +} diff --git a/spring/src/main/java/service/BookService.java b/spring/src/main/java/service/BookService.java index 512385c..83c6375 100644 --- a/spring/src/main/java/service/BookService.java +++ b/spring/src/main/java/service/BookService.java @@ -1,6 +1,6 @@ package service; -import dao.UserDao; +import dao.impl.UserDaoImpl; import lombok.Setter; import pojo.FastUser; import pojo.User; @@ -13,7 +13,7 @@ import pojo.User; */ public class BookService { @Setter - private UserDao userDao; + private UserDaoImpl userDaoImpl; @Setter private User user; @@ -23,7 +23,7 @@ public class BookService { public void doGetBookUser(Long userId){ System.out.println(user.getId()); - FastUser fastUser=userDao.getUser(userId); + FastUser fastUser= userDaoImpl.getUser(userId); // user.setId(userId); } } diff --git a/spring/src/main/java/service/EntityService.java b/spring/src/main/java/service/EntityService.java index 79552f2..54b078b 100644 --- a/spring/src/main/java/service/EntityService.java +++ b/spring/src/main/java/service/EntityService.java @@ -1,6 +1,6 @@ package service; -import dao.UserDao; +import dao.impl.UserDaoImpl; import lombok.Data; import pojo.FastUser; @@ -18,14 +18,14 @@ import javax.annotation.Resource; public class EntityService { private String name; - @Resource/*(type = UserDao.class)*/ + @Resource/*(type = UserDaoImpl.class)*/ // 1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常 //  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。如果name属性一旦指定,就只会按照名称进行装配。 //  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 //  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配; // @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。 - private UserDao userDao; + private UserDaoImpl userDaoImpl; public EntityService() { } @@ -41,6 +41,6 @@ public class EntityService { } public FastUser getUser(Long id) { - return userDao.getUser(id); + return userDaoImpl.getUser(id); } } diff --git a/spring/src/main/java/service/SimplePlayerService.java b/spring/src/main/java/service/SimplePlayerService.java index 8f7edc3..9a067ef 100644 --- a/spring/src/main/java/service/SimplePlayerService.java +++ b/spring/src/main/java/service/SimplePlayerService.java @@ -1,6 +1,6 @@ package service; -import dao.UserDao; +import dao.impl.UserDaoImpl; import lombok.Getter; import lombok.Setter; import org.springframework.beans.factory.annotation.Autowired; @@ -22,19 +22,19 @@ public class SimplePlayerService { @Autowired(required = false) SimplePlayer player; - private UserDao userDao; + private UserDaoImpl userDaoImpl; @Getter @Setter private String serviceName; @Autowired - public SimplePlayerService(UserDao userDao) { - this.userDao = userDao; + public SimplePlayerService(UserDaoImpl userDaoImpl) { + this.userDaoImpl = userDaoImpl; } public FastUser getPlayerByUser(Long id) { - return userDao.getUser(id); + return userDaoImpl.getUser(id); } public void showUser() { diff --git a/spring/src/main/java/service/UserDetector.java b/spring/src/main/java/service/UserDetector.java index 53bb664..2ebcd4b 100644 --- a/spring/src/main/java/service/UserDetector.java +++ b/spring/src/main/java/service/UserDetector.java @@ -1,6 +1,5 @@ package service; -import dao.UserDao; import lombok.Getter; import lombok.Setter; import pojo.User; diff --git a/spring/src/main/java/service/UserRelease.java b/spring/src/main/java/service/UserRelease.java index 910fc76..4e8eeb5 100644 --- a/spring/src/main/java/service/UserRelease.java +++ b/spring/src/main/java/service/UserRelease.java @@ -1,6 +1,6 @@ package service; -import dao.UserDao; +import dao.impl.UserDaoImpl; import pojo.User; /** @@ -10,16 +10,16 @@ import pojo.User; * @Modified By: */ public class UserRelease { - private UserDao userDao; + private UserDaoImpl userDaoImpl; private String desc; - public UserRelease(UserDao userDao, String desc) { - this.userDao = userDao; + public UserRelease(UserDaoImpl userDaoImpl, String desc) { + this.userDaoImpl = userDaoImpl; this.desc = desc; } public User releaseUser(Long id) { - User user = (User) userDao.getUser(id); + User user = (User) userDaoImpl.getUser(id); user.setId(id); return user; } diff --git a/spring/src/main/java/service/UserService.java b/spring/src/main/java/service/UserService.java index 8682913..df8cf30 100644 --- a/spring/src/main/java/service/UserService.java +++ b/spring/src/main/java/service/UserService.java @@ -1,6 +1,6 @@ package service; -import dao.UserDao; +import dao.impl.UserDaoImpl; import lombok.Getter; import lombok.Setter; import pojo.FastUser; @@ -15,7 +15,7 @@ public class UserService { @Setter @Getter - private UserDao userDao; + private UserDaoImpl userDaoImpl; @Getter private String daoClassConname; private Integer index; @@ -23,8 +23,8 @@ public class UserService { public UserService() { } - public UserService(UserDao userDao) { - this.userDao = userDao; + public UserService(UserDaoImpl userDaoImpl) { + this.userDaoImpl = userDaoImpl; } public UserService(String daoClassConname, Integer index) { @@ -32,6 +32,6 @@ public class UserService { this.index = index; } public boolean insert(FastUser user) { - return userDao.insert(user) > 0 ? true : false; + return userDaoImpl.insert(user) > 0 ? true : false; } } diff --git a/spring/src/main/resources/Beans.xml b/spring/src/main/resources/Beans.xml index c9d968c..baaac6f 100644 --- a/spring/src/main/resources/Beans.xml +++ b/spring/src/main/resources/Beans.xml @@ -8,13 +8,15 @@ http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" default-init-method="afterInitialization" > + - + + @@ -25,10 +27,20 @@ throwing="ex" method="AfterThrowingAdvice"/> + + + + + + + + + - + + @@ -82,30 +94,30 @@ - + - + - + - + - + - - + + @@ -185,5 +197,18 @@ + + + + + + + + + + + + + diff --git a/spring/src/main/resources/log4j2.xml b/spring/src/main/resources/log4j2.xml new file mode 100644 index 0000000..89d4b2e --- /dev/null +++ b/spring/src/main/resources/log4j2.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/spring/src/main/resources/resource.properties b/spring/src/main/resources/resource.properties new file mode 100644 index 0000000..cd44325 --- /dev/null +++ b/spring/src/main/resources/resource.properties @@ -0,0 +1 @@ +codeModel=true \ No newline at end of file diff --git a/spring/src/test/java/day4/TestAnnontionWithoutXml.java b/spring/src/test/java/day4/TestAnnontionWithoutXml.java index cbe36e7..d03c3f5 100644 --- a/spring/src/test/java/day4/TestAnnontionWithoutXml.java +++ b/spring/src/test/java/day4/TestAnnontionWithoutXml.java @@ -1,10 +1,8 @@ package day4; -import common.BeanFactoryGenerator; import config.BootConfig; import config.BootOutOfConfig; -import dao.UserDao; -import org.springframework.context.ApplicationContext; +import dao.impl.UserDaoImpl; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import pojo.FastUser; @@ -25,8 +23,8 @@ public class TestAnnontionWithoutXml { context.register(BootOutOfConfig.class);//这里注册一个bean,但是这个bean并没有被@Configuration进行修饰 (context).refresh(); BootConfig bootConfig=context.getBean(BootConfig.class); - UserDao userDao=bootConfig.getUserDao(); - userDao.getUser(56789L); + UserDaoImpl userDaoImpl =bootConfig.getUserDao(); + userDaoImpl.getUser(56789L); System.out.println("----------------------"); BootOutOfConfig bootOutOfConfig=context.getBean(BootOutOfConfig.class); bootOutOfConfig.getUserService().insert(new FastUser()); diff --git a/spring/src/test/java/day4/TestImport.java b/spring/src/test/java/day4/TestImport.java index ba57ce4..0d9d315 100644 --- a/spring/src/test/java/day4/TestImport.java +++ b/spring/src/test/java/day4/TestImport.java @@ -1,9 +1,7 @@ package day4; -import config.BootConfig; import config.BootOutOfConfig; import config.BootWithConfig; -import dao.UserDao; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import pojo.FastUser; diff --git a/spring/src/test/java/day4/TestJSR250.java b/spring/src/test/java/day4/TestJSR250.java index 5e9215d..8e97c30 100644 --- a/spring/src/test/java/day4/TestJSR250.java +++ b/spring/src/test/java/day4/TestJSR250.java @@ -22,7 +22,7 @@ public class TestJSR250 { EntityService entityService= (EntityService) context.getBean("entityService"); System.out.println(entityService.getName()); entityService.getUser(776L); - entityService.getUserDao(); + entityService.getUserDaoImpl(); context.close(); } } diff --git a/spring/src/test/java/day6/TestAspectWithoutXml.java b/spring/src/test/java/day6/TestAspectWithoutXml.java index a98fb13..1fb8c79 100644 --- a/spring/src/test/java/day6/TestAspectWithoutXml.java +++ b/spring/src/test/java/day6/TestAspectWithoutXml.java @@ -12,9 +12,10 @@ import org.springframework.context.ApplicationContext; * @Modified By: */ public class TestAspectWithoutXml { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { ApplicationContext context=BeanFactoryGenerator.context; Parent parent=context.getBean(Parent.class); System.out.println(parent.getName()); + parent.attemptToThrowException(); } } diff --git a/spring/src/test/java/day7/TestJDBCTemplate.java b/spring/src/test/java/day7/TestJDBCTemplate.java new file mode 100644 index 0000000..653feb0 --- /dev/null +++ b/spring/src/test/java/day7/TestJDBCTemplate.java @@ -0,0 +1,33 @@ +package day7; + +import common.BeanFactoryGenerator; +import dao.MyUserDao; +import dao.UserDao; +import dao.impl.MyUserDaoImpl; +import dao.impl.UserDaoImpl; +import org.springframework.context.ApplicationContext; +import pojo.User; + +import java.util.List; + +/** + * @Author: fancyears·milos·malvis + * @Description: + * @Date: Created in 2019/4/29 14:31 + * @Modified By: + */ +public class TestJDBCTemplate { + public static void main(String[] args) { + ApplicationContext context=BeanFactoryGenerator.context; + MyUserDao userDao=context.getBean(MyUserDao.class); + User user=new User(); + user.setUsername("a125d"); + user.setPassword("KKLAION_+qweasdjk*123kj"); + int id=userDao.insert(user); + User userFromDB=userDao.selectUser((long) id); + System.out.println(userFromDB); + + List users=userDao.listUser(); + System.out.println(); + } +} -- Gitee From 7c4e9f597adc1fd01e08cb29ccfbd1adacebde42 Mon Sep 17 00:00:00 2001 From: fancyears <1243093769@qq.com> Date: Tue, 30 Apr 2019 10:57:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=AE=8C=E6=95=B4log4j?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=8E=AF=E5=A2=83=EF=BC=8C=E5=85=B7=E4=BD=93?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6=E9=9C=80=E8=A6=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9log4j2.xml=E7=9A=84trans=5Flog=5Fpath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring/pom.xml | 50 +++-- .../DisplayExecuteSqlInterceptor.java | 82 ++++---- spring/src/main/resources/Beans.xml | 2 + spring/src/main/resources/log4j2.xml | 176 ++++++++++++++++-- spring/src/main/resources/resource.properties | 3 +- 5 files changed, 243 insertions(+), 70 deletions(-) diff --git a/spring/pom.xml b/spring/pom.xml index 23f7101..98c1344 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -49,24 +49,12 @@ mysql-connector-java 8.0.15 - - - - - - - + + - org.slf4j - slf4j-api - 1.7.26 - - - - org.slf4j - slf4j-log4j12 - 1.7.26 - test + org.apache.logging.log4j + log4j-api + 2.11.2 @@ -74,12 +62,38 @@ log4j-core 2.11.2 + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.11.2 + + + + org.apache.logging.log4j + log4j-jcl + 2.11.2 + + + + org.slf4j + slf4j-api + 1.7.26 + + + org.apache.commons commons-lang3 3.4 - + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + \ No newline at end of file diff --git a/spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java b/spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java index 259b5fe..26e8833 100644 --- a/spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java +++ b/spring/src/main/java/interceptor/DisplayExecuteSqlInterceptor.java @@ -7,81 +7,83 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; import java.lang.reflect.Method; /** * @Author: fancyears·milos·malvis - * @Description: 方法拦截 粒度在方法上,调试管理 利用 AOP 原理, 在开发模式下于控制台展示 dao层 的实际执行的SQL + * @Description: 方法拦截 粒度在方法上,调试管理 利用 AOP 原理, 在开发模式下于控制台展示 dao层 的实际执行的SQL * @Date: Created in 2019/4/29 17:00 * @Modified By: */ +@Configuration public class DisplayExecuteSqlInterceptor implements MethodInterceptor { private static final Logger log = LoggerFactory.getLogger(DisplayExecuteSqlInterceptor.class); - private static final String CONTROLLER ="CONTROLLER"; - private static final String SERVICE ="SERVICE"; - private static final String DAO ="DAO"; - private static final String IMPL ="IMPL"; + private static final String CONTROLLER = "CONTROLLER"; + private static final String SERVICE = "SERVICE"; + private static final String DAO = "DAO"; + private static final String IMPL = "IMPL"; + + @Value("${debugModel}") + Boolean debugModel; - @Value("true") - String codeModel; - String flag="true"; @Override public Object invoke(MethodInvocation mi) throws Throwable { - if(StringUtils.equals(flag,codeModel)){ + if (debugModel) { //获取该方法的传参 Object[] ars = mi.getArguments(); //通过反射机制 获取到该方法 (Method 包含 作用域 返回类型 方法名 参数类型) - Method method= mi.getMethod(); + Method method = mi.getMethod(); //获取代理的对象 (也就是这个方法所在内存中的对象) Object obj = mi.getThis(); - Object [] params =new Object[]{} ; - String sql =""; - for(Object o :ars){ - if(o instanceof Object[]){ - params= (Object[]) o; - }else if(o instanceof String){ - sql=(String) o; + Object[] params = new Object[]{}; + String sql = ""; + for (Object o : ars) { + if (o instanceof Object[]) { + params = (Object[]) o; + } else if (o instanceof String) { + sql = (String) o; } } Thread current = Thread.currentThread(); - StackTraceElement[] elements =current.getStackTrace(); + StackTraceElement[] elements = current.getStackTrace(); //倒序输出 栈帧 信息 ,过滤出 项目的代码 这里只过滤出(Controller / service impl / dao impl)层的代码,如需要其他的可自行遍历 - if(elements !=null && elements.length>0){ + if (elements != null && elements.length > 0) { //获得项目名 - String packageName =DisplayExecuteSqlInterceptor.class.getPackage().getName(); - packageName=StringUtils.substringBefore(packageName,"."); - StringBuilder sb =new StringBuilder(); + String packageName = DisplayExecuteSqlInterceptor.class.getPackage().getName(); + packageName = StringUtils.substringBefore(packageName, "."); + StringBuilder sb = new StringBuilder(); sb.append(" -------->本次执行SQL的代码在<--------- "); sb.append('\n'); - for(int i=elements.length ;i>0 ;i--){ - StackTraceElement e =elements[i-1]; - if(StringUtils.contains(e.getClassName(),packageName)){ - String cn=StringUtils.upperCase(e.getClassName()); - if(StringUtils.contains(cn,CONTROLLER)){ - sb.append( CONTROLLER+" 层 ->类名:"+e.getClassName()+",方法名:"+e.getMethodName()+",代码行数:"+e.getLineNumber()+""); + for (int i = elements.length; i > 0; i--) { + StackTraceElement e = elements[i - 1]; + if (StringUtils.contains(e.getClassName(), packageName)) { + String cn = StringUtils.upperCase(e.getClassName()); + if (StringUtils.contains(cn, CONTROLLER)) { + sb.append(CONTROLLER + " 层 ->类名:" + e.getClassName() + ",方法名:" + e.getMethodName() + ",代码行数:" + e.getLineNumber() + ""); sb.append('\n'); - }else if(StringUtils.contains(cn,SERVICE) &&StringUtils.contains(cn,IMPL) && e.getLineNumber()>0) { - sb.append( SERVICE+" 层 ->类名:"+e.getClassName()+",方法名:"+e.getMethodName()+",代码行数:"+e.getLineNumber()+""); + } else if (StringUtils.contains(cn, SERVICE) && StringUtils.contains(cn, IMPL) && e.getLineNumber() > 0) { + sb.append(SERVICE + " 层 ->类名:" + e.getClassName() + ",方法名:" + e.getMethodName() + ",代码行数:" + e.getLineNumber() + ""); sb.append('\n'); - }else if(StringUtils.contains(cn,DAO) &&StringUtils.contains(cn,IMPL) && e.getLineNumber()>0 ){ - sb.append(DAO +" 层->类名:"+e.getClassName()+",方法名:"+e.getMethodName()+",代码行数:"+e.getLineNumber()+""); + } else if (StringUtils.contains(cn, DAO) && StringUtils.contains(cn, IMPL) && e.getLineNumber() > 0) { + sb.append(DAO + " 层->类名:" + e.getClassName() + ",方法名:" + e.getMethodName() + ",代码行数:" + e.getLineNumber() + ""); sb.append('\n'); } } } - System.out.println(sb); log.info(sb.toString()); } - getExecuteSql(sql,params); + getExecuteSql(sql, params); } //执行被拦截的方法,切记,如果此方法不调用,则被拦截的方法不会被执行。 return mi.proceed(); @@ -110,21 +112,21 @@ public class DisplayExecuteSqlInterceptor implements MethodInterceptor { } } - StringBuilder sb =new StringBuilder(); + StringBuilder sb = new StringBuilder(); sb.append(" ----------->本次执行sql为:<----------- "); sb.append('\n'); - sb.append(sql+'\n'); + sb.append(sql + '\n'); log.info(sb.toString()); return sql; } - private int getCount(String sql ,char a ){ - int count=0; - if(null!=sql){ + private int getCount(String sql, char a) { + int count = 0; + if (null != sql) { for (int i = 0; i < sql.length(); i++) { - if(sql.charAt(i)==a){ + if (sql.charAt(i) == a) { count++; } } diff --git a/spring/src/main/resources/Beans.xml b/spring/src/main/resources/Beans.xml index baaac6f..7cec96a 100644 --- a/spring/src/main/resources/Beans.xml +++ b/spring/src/main/resources/Beans.xml @@ -8,6 +8,8 @@ http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" default-init-method="afterInitialization" > + + diff --git a/spring/src/main/resources/log4j2.xml b/spring/src/main/resources/log4j2.xml index 89d4b2e..dc35cfb 100644 --- a/spring/src/main/resources/log4j2.xml +++ b/spring/src/main/resources/log4j2.xml @@ -1,18 +1,172 @@ - + + + + + + + + + + + ${sys:catalina.home}/logs/ + info + server_ + + + + - - + + + + + + - - - + + + + + + + + + + ${log_pattern} + + + + + + + + + + + + + + ${log_pattern} + + + + + + + + + + + + + ${log_pattern} + + + + + + + + + + + + + + ${log_pattern} + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + \ No newline at end of file diff --git a/spring/src/main/resources/resource.properties b/spring/src/main/resources/resource.properties index cd44325..bb336b5 100644 --- a/spring/src/main/resources/resource.properties +++ b/spring/src/main/resources/resource.properties @@ -1 +1,2 @@ -codeModel=true \ No newline at end of file +#ģʽ +debugModel=true \ No newline at end of file -- Gitee