Spring AOP动态代理例子

来源:互联网 发布:吾知的小说 编辑:程序博客网 时间:2024/06/06 13:00

对Oracle数据库的部门表进行增删改查:

话不多说;奋斗


1.实体类可以不写.hbm.xml文件直接写注解方式:

package com.jadeon.entity;import java.io.Serializable;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;@SuppressWarnings("serial")@Entity@Table(name = "dept")public class Dept implements Serializable {private Integer deptno;private String dname;private String loc;public Dept() {super();}public Dept(String dname, String loc) {super();this.dname = dname;this.loc = loc;}public Dept(Integer deptno,String dname, String loc) {super();this.deptno = deptno;this.dname = dname;this.loc = loc;}@Id@Column(name="deptno")@GenericGenerator(name="myGenerator",strategy="increment")@GeneratedValue(generator="myGenerator")public Integer getDeptno() {return deptno;}public void setDeptno(Integer deptno) {this.deptno = deptno;}@Column(name="dname")public String getDname() {return dname;}public void setDname(String dname) {this.dname = dname;}@Column(name="loc")public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}}


2.dao接口

package com.jadeon.dao;import java.util.List;public interface BasicDao<T> {public void saveBasic(T o);public void updateBasicById(T o);public void delBasicById(T o);public T selectBasicById(T o,String column,Object byId);public List<T> seletctAllBasic(T o);}

实现dao接口类

package com.jadeon.dao.impl;import java.util.List;import org.hibernate.criterion.Restrictions;import com.jadeon.dao.BasicDao;import com.jadeon.util.DBHelper;public class BasicDaoImpl<T> implements BasicDao<T> {@Overridepublic void saveBasic(T o) { DBHelper.openSession().save(o);}@Overridepublic void updateBasicById(T o) {DBHelper.openSession().merge(o);}@Overridepublic void delBasicById(T o) {DBHelper.openSession().delete(o);}@SuppressWarnings("unchecked")@Overridepublic T selectBasicById(T o, String column, Object byId) {return (T) DBHelper.openSession().createCriteria(o.getClass()).add(Restrictions.eq(column, byId)).uniqueResult();}@SuppressWarnings("unchecked")@Overridepublic List<T> seletctAllBasic(T o) {return DBHelper.openSession().createCriteria(o.getClass()).list();}}
3.service接口类
package com.jadeon.service;import java.util.List;import com.jadeon.entity.Dept;public interface DeptService {public void saveDept(Dept info);public void updateDeptById(Dept info);public Dept selectDeptById(Integer byId);public List<Dept> seletctAllDept();public void delDeptById(Integer byId);}

实现service接口类

package com.jadeon.service.impl;import java.util.List;import com.jadeon.dao.BasicDao;import com.jadeon.dao.impl.BasicDaoImpl;import com.jadeon.entity.Dept;import com.jadeon.service.DeptService;public class DeptServiceImpl implements DeptService {private BasicDao<Dept> dao = new BasicDaoImpl<Dept>();@Overridepublic void saveDept(Dept info) {dao.saveBasic(info);}@Overridepublic void updateDeptById(Dept info) {dao.updateBasicById(info);}@Overridepublic void delDeptById(Integer byId) {Dept info = dao.selectBasicById(new Dept(), "deptno", byId);dao.delBasicById(info);}@Overridepublic Dept selectDeptById(Integer byId) {return dao.selectBasicById(new Dept(), "deptno", byId);}@Overridepublic List<Dept> seletctAllDept() {return dao.seletctAllBasic(new Dept());}}

4.帮助类(DBHelper):

package com.jadeon.util;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class DBHelper {private static SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();private static Session session;public static Session openSession(){           //判断session是否打开         if (session == null || !session.isOpen()) session = sessionFactory.openSession();return session;}}

5.strutsxml和Hibernate.cfg.xml、web.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <package name="default" namespace="/" extends="struts-default">    <action name="dept_*" class="com.jadeon.action.DeptAction" method="{1}">            <result name="success">/allDept.jsp</result>            <result name="update">/updateDept.jsp</result>        </action>            </package></struts>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" ><hibernate-configuration>  <session-factory>    <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>  <property name="hibernate.connection.url">jdbc:oracle:thin:localhost:1521:orcl</property>  <property name="hibernate.connection.username">scott</property>  <property name="hibernate.connection.password">tiger</property>  <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>    <property name="hibernate.show_sql">true</property>  <!--   <mapping resource="com/jadeon/entity/Dept.hbm.xml"/> --><mapping class="com.jadeon.entity.Dept"/>    </session-factory></hibernate-configuration>
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <display-name>spring_02_proxy</display-name>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list><filter><filter-name>struts</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>


6.代理类:

package com.jadeon.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import org.hibernate.Session;public class TranscationDynamicProxy implements InvocationHandler{private Object obj;//需要代理的目标对象  private Session session;public TranscationDynamicProxy() {super();}public TranscationDynamicProxy(Object obj,Session session) {super();this.obj = obj;this.session = session;}/*** * 实例化代理对象 *  * @param args * @return */public static Object newInstance(Object args,Session session){//将目标对象传入进行代理  // 1. 实例化对象// 2. 定义的接口,所需要完成事情// 3. 开始做事情return Proxy.newProxyInstance(args.getClass().getClassLoader(), args.getClass().getInterfaces(), new TranscationDynamicProxy(args,session));//返回代理对象  }// 开始做事情 什么时候触发呢?// 在实例化LogDynamicProxy对象时 会触发该方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = null;try {System.out.println("begin recording log...");session.beginTransaction().begin();result = method.invoke(obj, args);//调用invoke方法,result 存储该方法的返回值  session.beginTransaction().commit();System.out.println("end recording log...");} catch (Exception e) {e.printStackTrace();session.beginTransaction().rollback();} finally {//session.close();}return result;}}

7.action测试类:
package com.jadeon.action;import java.util.ArrayList;import java.util.List;import com.jadeon.entity.Dept;import com.jadeon.proxy.TranscationDynamicProxy;import com.jadeon.service.DeptService;import com.jadeon.service.impl.DeptServiceImpl;import com.jadeon.util.DBHelper;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class DeptAction extends ActionSupport {private List<Dept> infos = new ArrayList<Dept>();private Dept info = new Dept();DeptService service = (DeptService) TranscationDynamicProxy.newInstance(new DeptServiceImpl(), DBHelper.openSession());public String getAllDept() {infos = service.seletctAllDept();return "success";}public String savaDept() {service.saveDept(info);return getAllDept();}public String updateDeptById() {if (info.getDname() == null && info.getDeptno() > 0 && info.getLoc() == null) {info = service.selectDeptById(info.getDeptno());return "update";}else{service.updateDeptById(info);return getAllDept();}}public String delDeptById() {service.delDeptById(info.getDeptno());return getAllDept();}public List<Dept> getInfos() {return infos;}public void setInfos(List<Dept> infos) {this.infos = infos;}public Dept getInfo() {return info;}public void setInfo(Dept info) {this.info = info;}}

主页面:

<html><head><title>DEPT TABLE INFORMATION</title></head><body><center><a href="dept_getAllDept">SELECT ALL DEPT INFORMATION</a></center></body></html>

查询和删除部门.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>DEPT TABLE INFORMATION</title></head><body><center><table><tr><th colspan="4"><h2>DEPT TABLE INFORMATION</h2></th></tr><tr><th>DEPTNO</th><th>DNAME</th><th>LOC</th><th colspan="2"> OPERATION</th></tr><c:forEach items="${infos}" var="dept"><tr><td>${dept.deptno}</td><td>${dept.dname}</td><td>${dept.loc}</td><td><a href="dept_delDeptById?info.deptno=${dept.deptno}">delete</a>|<a href="dept_updateDeptById?info.deptno=${dept.deptno}">update</a></td></tr></c:forEach></table><a href="addDept.jsp">add</a></center></body></html>


添加部门.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>DEPT TABLE INFORMATION</title><link rel="stylesheet" type="text/css" href="CSS/style.css"></head><body><center><form action="dept_savaDept" method="post"><table><tr><th colspan="2"><h2>UPDATE TABLE INFORMATION</h2></th></tr><tr><th>DNAME</th><th>LOC</th></tr><tr><td><input type="text" name="info.dname" /></td><td><input type="text" name="info.loc" /></td></tr></table><input type="submit" value="YES"/></form></center></body></html>

修改部门.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>DEPT TABLE INFORMATION</title><link rel="stylesheet" type="text/css" href="CSS/style.css"></head><body><center><form action="dept_updateDeptById" method="post"><input type="hidden" name="info.deptno" value="${info.deptno}"/><table><tr><th colspan="2"><h2>UPDATE TABLE INFORMATION</h2></th></tr><tr><th>DNAME</th><th>LOC</th></tr><tr><td><input type="text" name="info.dname" value="${info.dname}"/></td><td><input type="text" name="info.loc" value="${info.loc}"/></td></tr></table><input type="submit" value="YES"/></form></center></body></html>



原创粉丝点击