Spring
Posted Ivyvivid
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring相关的知识,希望对你有一定的参考价值。
AOP:
1.将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决
2.采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能
目的:
1.A从系统中分离出切面,独立于业务逻辑实现,在程序执行时织入程序中运行
2.配置AOP主要使用aop命名空间下的元素完成。可以实现定义切入点和织入增强等操作
3.Spring提供的增强处理类型包括:前置增强、后置增强、环绕增强、异常抛出增强、最终增强等
作用:
1.实现系统日志功能
a.业务介绍:将业务逻辑方法的调用信息输出到控制台
b.AOP思路:分别编写业务逻辑代码和“增强”代码,运行时再组装
c.步骤:
1)添加jar包
2)编写业务逻辑接口和实现类,编码时无需关心其他功能
d.定义切入点
1)public * addUser(com.xuetang9.demo.entity.User)
2)public void *(com.xuetang9.demo.entity.User)
3)public void addUser(..) 不知道参数类型
4)* com.xuetang9.demo.service.*.*(..) service包所有的方法
5)* com.xuetang9.demo.service..*.*(..) 等 service包及其子包所有的方法
2.增强类型
a.异常抛出增强:目标方法抛出异常时织入增强处理
ThrowsAdvice接口中并没有定义任何方法,但是我们在定义异常抛出的增强方法时必须遵守以下方法签名:
void afterThrowing ( [Method method, Object[] arguments, Object target) Throwable ex )
注意:方法名必须是afterThrowing。方法的入参只有最后一个是必须的,前三个入参是可选的,但是前三个参数要么都提供,要么一个也不提供。正确的声明方法举例:
1)afterThrowing(Method method, Object[] args, Object target, SQLException ex)
2)afterThrowing(SQLException ex)
3)afterThrowing(RuntimeException ex)
错误的声明方法举例:
1)catchThrowing(RuntimeException ex):方法名错误
2)afterThrowing(Method method, RuntimeException ex):参数列表错误
b.环绕增强:在目标方法的前后都可以织入增强处理
1)功能最强大的增强处理,Spring把目标方法的控制权全部在它手中
2)可以获取或修改目标方法的参数、返回值。可以对它进行异常处理,甚至可以决定目标方法是否执行
c.前置增强
d.后置增强
e.最终增强
范例:
1.实体类及其配置文件
a.实体类 -- User类
1 package com.Elastic.SpringDemo2.ivy.entity; 2 3 import java.io.Serializable; 4 5 public class User implements Serializable { 6 private String loginName; 7 private String loginPass; 8 9 public String getLoginName() { 10 return loginName; 11 } 12 public void setLoginName(String loginName) { 13 this.loginName = loginName; 14 } 15 public String getLoginPass() { 16 return loginPass; 17 } 18 public void setLoginPass(String loginPass) { 19 this.loginPass = loginPass; 20 } 21 22 }
b.实体类配置文件 -- User.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2016-7-5 22:38:24 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.Elastic.SpringDemo2.ivy.entity.User" table="user"> 7 <id name="loginName" type="java.lang.String"> 8 <column name="userName" /> 9 <generator class="assigned" /> 10 </id> 11 <property name="loginPass" type="java.lang.String"> 12 <column name="passWord" /> 13 </property> 14 </class> 15 </hibernate-mapping>
2.hibernate配置文件 -- hibernate.cfg.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 8 <property name="hibernate.connection.password">root</property> 9 <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernatedb</property> 10 <property name="hibernate.connection.username">root</property> 11 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 12 13 <property name="show_sql">true</property> 14 <property name="format_sql">true</property> 15 16 <mapping resource="com/Elastic/SpringDemo2/ivy/entity/User.hbm.xml"/> 17 </session-factory> 18 </hibernate-configuration>
3.util包
a.HibernateUtil类
1 package com.Elastic.SpringDemo2.ivy.util; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 public final class HibernateUtil { 7 private static Configuration cfg = null; 8 private static SessionFactory sessionFactory = null; 9 10 //本地线程 11 public static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 12 13 static{ 14 cfg = new Configuration().configure(); 15 sessionFactory = cfg.buildSessionFactory(); 16 } 17 18 public static Session getSession(){ 19 Session session = threadLocal.get(); 20 if (null == session || !session.isOpen()) { 21 session = sessionFactory.openSession(); 22 threadLocal.set(session); 23 } 24 return session; 25 } 26 }
4.dao包
a.IBaseDao接口
1 package com.Elastic.SpringDemo2.ivy.dao; 2 3 import java.io.Serializable; 4 import java.util.List; 5 import java.util.Map; 6 7 import org.hibernate.Session; 8 import org.hibernate.criterion.DetachedCriteria; 9 public interface IBaseDao<T> { 10 /** 11 * 12 * <p> 13 * <h3>方法功能描述:获取Session对象</h3> 14 * </p> 15 * @return 16 * @procedure 执行过程 17 * @see IBaseDao 18 */ 19 Session getSession(); 20 21 /** 22 * 23 * <p> 24 * <h3>方法功能描述:保存数据</h3> 25 * </p> 26 * @param record 需要保存的对象 27 * @procedure 执行过程 28 * @see IBaseDao 29 */ 30 void save(T record); 31 32 /** 33 * 34 * <p> 35 * <h3>方法功能描述:根据主键删除对应的数据</h3> 36 * </p> 37 * @param id 38 * @procedure 执行过程 39 * @see IBaseDao 40 */ 41 //不明确id的类型,就用Serializable 42 void delete(Serializable id); 43 44 /** 45 * 46 * <p> 47 * <h3>方法功能描述:根据数据对象删除数据库中对应的数据</h3> 48 * </p> 49 * @param record 50 * @procedure 执行过程 51 * @see IBaseDao 52 */ 53 void delete(T record); 54 55 /** 56 * 57 * <p> 58 * <h3>方法功能描述:根据指定的对象修改对应的数据</h3> 59 * </p> 60 * @param record 61 * @procedure 执行过程 62 * @see IBaseDao 63 */ 64 void update(T record); 65 66 /** 67 * 68 * <p> 69 * <h3>方法功能描述:根据主键查询对应的数据</h3> 70 * </p> 71 * @param id 72 * @return 返回查找到的数据,如果没有返回null 73 * @procedure 执行过程 74 * @see IBaseDao 75 */ 76 T findById(Serializable id); 77 78 /** 79 * 80 * <p> 81 * <h3>方法功能描述:根据指定的hql语句和参数查询语句</h3> 82 * </p> 83 * @param hql 需要执行的查询的HQL语句 84 * @param params 执行的查询的HQL语句所需的参数,如果没有填写null 85 * @return 返回查询数据的集合,如果出现异常返回null 86 * @procedure 执行过程 87 * @see IBaseDao 88 */ 89 List<T> find(String hql,Map<String, Object> params); 90 91 /** 92 * 93 * <p> 94 * <h3>方法功能描述:根据指定的HQL语句和参数以及分页所需的数据执行查询</h3> 95 * </p> 96 * @param hql 需要执行的查询的HQL语句 97 * @param pageIndex 需要查询的页数 98 * @param pageSize 每页显示的数据条数 99 * @param params 执行的查询的HQL语句所需的参数,如果没有填写null 100 * @return 返回分页查询的结果,是一个Map对象,该对象包含<blockquote> 101 * <b>data</b>:查询结果的数据集合是一个List对象<br> 102 * <b>pageIndex</b>:当前查询的页数<br> 103 * <b>pageSize</b>:每页显示的数据条数<br> 104 * <b>total</b>:数据的总条数<br> 105 * <b>pageTotal</b>:数据的总页数<br> 106 * <b>hasPrev</b>:是否有上一条数据<br> 107 * <b>hasNext</b>:是否有下一条数据<br> 108 * </blockquote> 109 * @procedure 执行过程 110 * @see IBaseDao 111 */ 112 Map<String, Object> find(String hql, int pageIndex, int pageSize, Map<String, Object> params); 113 114 /** 115 * 116 * <p> 117 * <h3>方法功能描述:分页查询数据</h3> 118 * </p> 119 * @param pageIndex 需要查询的页数 120 * @param pageSize 每页显示的数据条数 121 * @return 返回分页查询的结果,是一个Map对象,该对象包含<blockquote> 122 * <b>data</b>:查询结果的数据集合是一个List对象<br> 123 * <b>pageIndex</b>:当前查询的页数<br> 124 * <b>pageSize</b>:每页显示的数据条数<br> 125 * <b>total</b>:数据的总条数<br> 126 * <b>pageTotal</b>:数据的总页数<br> 127 * <b>hasPrev</b>:是否有上一条数据<br> 128 * <b>hasNext</b>:是否有下一条数据<br> 129 * </blockquote> 130 * @procedure 执行过程 131 * @see IBaseDao 132 */ 133 Map<String, Object> find(int pageIndex, int pageSize); 134 135 /** 136 * 137 * <p> 138 * <h3>方法功能描述:根据DetachedCriteria 对象设置的条件查询数据,该功能不具备分页操作</h3> 139 * </p> 140 * @param detachedCriteria 需要设置的对象查询条件 141 * @return 返回查询数据的集合,如果出现异常返回null 142 * @procedure 执行过程 143 * @see IBaseDao 144 */ 145 List<T> find(DetachedCriteria detachedCriteria); 146 147 148 /** 149 * 150 * <p> 151 * <h3>方法功能描述:根据DetachedCriteria 对象设置的条件进行分页查询</h3> 152 * </p> 153 * @param detachedCriteria 需要设置的对象查询条件 154 * @param pageIndex 需要查询的页数 155 * @param pageSize 每页显示的数据条数 156 * @return 返回分页查询的结果,是一个Map对象,该对象包含<blockquote> 157 * <b>data</b>:查询结果的数据集合是一个List对象<br> 158 * <b>pageIndex</b>:当前查询的页数<br> 159 * <b>pageSize</b>:每页显示的数据条数<br> 160 * <b>total</b>:数据的总条数<br> 161 * <b>pageTotal</b>:数据的总页数<br> 162 * <b>hasPrev</b>:是否有上一条数据<br> 163 * <b>hasNext</b>:是否有下一条数据<br> 164 * </blockquote> 165 * @procedure 拼接HQL语句 166 * @see IBaseDao 167 */ 168 Map<String, Object> find(DetachedCriteria detachedCriteria, int pageIndex, int pageSize); 169 170 171 172 }
b.IBaseDao接口实现类 -- BaseDao
1 package com.Elastic.SpringDemo2.ivy.dao; 2 3 import java.io.Serializable; 4 import java.lang.reflect.ParameterizedType; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 9 import org.hibernate.Criteria; 10 import org.hibernate.Query; 11 import org.hibernate.Session; 12 import org.hibernate.criterion.DetachedCriteria; 13 import org.hibernate.criterion.Projections; 14 15 import com.Elastic.SpringDemo2.ivy.util.HibernateUtil; 16 //忽略警告 17 @SuppressWarnings({ "rawtypes", "unchecked" }) 18 public class BaseDao<T> implements IBaseDao<T>{ 19 20 private Class entityClass; 21 22 public BaseDao(){ 23 entityClass = this.getEntityClass(); 24 } 25 26 /** 27 * 28 * <p> 29 * <h3>方法功能描述:根据反射得到当前泛型参数(实体类)的数据类型</h3> 30 * </p> 31 * @return 32 * @procedure 执行过程 33 * @see BaseDao 34 */ 35 private Class getEntityClass(){ 36 try { 37 ParameterizedType paramsType = (ParameterizedType)this.getClass().getGenericSuperclass();//只能通过父类得到 38 return (Class)paramsType.getActualTypeArguments()[0]; 39 } catch (Exception e) { 40 e.printStackTrace(); 41 } 42 return null; 43 } 44 45 @Override 46 public Session getSession() { 47 return HibernateUtil.getSession(); 48 } 49 50 private Map<String, Object> createPageData(List<T> data, int pageIndex, int pageSize, int total) { 51 Map<String, Object> map = new HashMap<String, Object>(); 52 53 //获得总页数 54 int pageTotal = (int)Math.ceil((double)total / pageSize); 55 map.put("data", data); 56 map.put("pageIndex", pageIndex); 57 map.put("pageSize", pageSize); 58 map.put("total", total); 59 map.put("pageTotal", pageTotal); 60 61 //boolean,若没赋值,默认true 62 map.put("hasPrev", pageIndex > 1); 63 map.put("hasNext", pageIndex < pageTotal); 64 return map; 65 } 66 67 /* (non-Javadoc) 68 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#save(java.lang.Object) 69 */ 70 @Override 71 public void save(T record) { 72 this.getSession().save(record); 73 74 } 75 76 /* (non-Javadoc) 77 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#delete(java.io.Serializable) 78 */ 79 @Override 80 public void delete(Serializable id) { 81 this.getSession().delete(this.findById(id)); 82 83 } 84 85 /* (non-Javadoc) 86 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#delete(java.lang.Object) 87 */ 88 @Override 89 public void delete(T record) { 90 this.getSession().delete(record); 91 92 } 93 94 /* (non-Javadoc) 95 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#update(java.lang.Object) 96 */ 97 @Override 98 public void update(T record) { 99 this.getSession().update(record); 100 101 } 102 103 /* (non-Javadoc) 104 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#findById(java.io.Serializable) 105 */ 106 @Override 107 public T findById(Serializable id) { 108 return (T) this.getSession().get(entityClass, id); 109 } 110 111 /* (non-Javadoc) 112 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(java.lang.String, java.util.Map) 113 */ 114 @Override 115 public List<T> find(String hql, Map<String, Object> params) { 116 Query query = this.getSession().createQuery(hql); 117 query.setProperties(params); 118 return query.list(); 119 } 120 121 /* (non-Javadoc) 122 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(java.lang.String, int, int, java.util.Map) 123 */ 124 @Override 125 public Map<String, Object> find(String hql, int pageIndex, int pageSize, Map<String, Object> params) { 126 String hqlCount; 127 //通过给定的HQL语句查询全部条数 128 int i = hql.indexOf("from"); 129 if (i == 0) { 130 hqlCount = "select count(*) " + hql; 131 } else { 132 hqlCount = "select count(*) " + hql.substring(i); 133 } 134 135 Query query = this.getSession().createQuery(hql); 136 query.setProperties(params); 137 138 //index从0开始 139 query.setFirstResult((pageIndex - 1) * pageSize); 140 query.setMaxResults(pageSize); 141 142 int total = Integer.parseInt(this.getSession().createQuery(hqlCount).uniqueResult().toString()); 143 return this.createPageData(query.list(), pageIndex, pageSize, total); 144 } 145 146 /* (non-Javadoc) 147 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(int, int) 148 */ 149 @Override 150 public Map<String, Object> find(int pageIndex, int pageSize) { 151 Criteria criteria = this.getSession().createCriteria(entityClass); 152 153 //查询总数 154 criteria.setProjection(Projections.rowCount()); 155 int total = Integer.parseInt(criteria.uniqueResult().toString()); 156 criteria.setProjection(null); 157 158 criteria.setFirstResult((pageIndex - 1) * pageSize); 159 criteria.setMaxResults(pageSize); 160 return this.createPageData(criteria.list(), pageIndex, pageSize, total); 161 } 162 163 /* (non-Javadoc) 164 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(org.hibernate.criterion.DetachedCriteria) 165 */ 166 public List<T> find(DetachedCriteria detachedCriteria) { 167 return detachedCriteria.getExecutableCriteria(getSession()).list(); 168 } 169 170 /* (non-Javadoc) 171 * @see com.Elastic.StrutsDemo2.ivy.dao.IBaseDao#find(org.hibernate.criterion.DetachedCriteria, int, int) 172 */ 173 @Override 174 public Map<String, Object> find(DetachedCriteria detachedCriteria, int pageIndex, int pageSize) { 175 //查询总数 176 int total = Integer.parseInt(detachedCriteria.getExecutableCriteria(getSession()) 177 .setProjection(Projections.rowCount()) 178 .uniqueResult().toString()); 179 180 //分页查询 181 Criteria criteria = detachedCriteria.getExecutableCriteria(getSession()); 182 criteria.setFirstResult((pageIndex - 1) * pageSize); 183 criteria.setMaxResults(pageSize); 184 return this.createPageData(criteria.list(), pageIndex, pageSize, total); 185 } 186 }
c.具体业务接口 -- UserDao类
1 package com.Elastic.SpringDemo2.ivy.dao; 2 3以上是关于Spring的主要内容,如果未能解决你的问题,请参考以下文章Spring boot:thymeleaf 没有正确渲染片段
What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段
Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]
解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段