【Spring】手动实现AOP编程(十一)

来源:互联网 发布:服务器 定时关机 软件 编辑:程序博客网 时间:2024/06/06 04:38

手动实现AOP编程

AOP 面向切面的编程,

AOP可以实现“业务代码”与“关注点代码”分离

 

// 保存一个用户public void add(User user) {Session session = null;Transaction trans = null;try {session = HibernateSessionFactoryUtils.getSession();   // 【关注点代码】trans = session.beginTransaction();    // 【关注点代码】 session.save(user);     // 核心业务代码 trans.commit();     //…【关注点代码】 } catch (Exception e) {     e.printStackTrace();if(trans != null){trans.rollback();   //..【关注点代码】 }} finally{HibernateSessionFactoryUtils.closeSession(session);   ////..【关注点代码】 }   }



分析总结: 

关注点代码,就是指重复执行的代码。

业务代码与关注点代码分离,好处?

   --à 关注点代码写一次即可;

-à开发者只需要关注核心业务;

运行时期,执行核心业务代码时候动态植入关注点代码; 【代理】

 

 

如何分离?

过程式/对象式/代理模式分离

方式一:

UserDao.java

package cn.lfsenior.d_myaop; import javax.annotation.Resource; import org.springframework.stereotype.Component; /** * 目标对象 * */@Component   // 加入容器public class UserDao implements IUserDao{// 重复执行代码形成的一个类@Resourceprivate Aop aop; @Overridepublic void save() {aop.begin();System.out.println("-----核心业务:保存!!!------");aop.commite();}}


 

Aop.java

package cn.lfsenior.d_myaop; import org.springframework.stereotype.Component; @Component  // 加入IOC容器public class Aop { // 重复执行的代码public void begin(){System.out.println("开始事务/异常");}public void commite(){System.out.println("提交事务/关闭");}}


 

App.java

package cn.lfsenior.d_myaop; import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext; public class App {ApplicationContext ac =new ClassPathXmlApplicationContext("cn/lfsenior/d_myaop/bean.xml"); @Testpublic void testApp() {IUserDao userDao = (IUserDao) ac.getBean("userDao");userDao.save();}}


 

方式二:

Aop.java

package cn.lfsenior.d_myaop1; import org.springframework.stereotype.Component; @Component  // 加入IOC容器  (切面)public class Aop { // 重复执行的代码public void begin(){System.out.println("开始事务/异常");}public void commite(){System.out.println("提交事务/关闭");}}


 

UserDao.java

package cn.lfsenior.d_myaop1; import org.springframework.stereotype.Component; /** * 目标对象 * */@Component   // 加入容器public class UserDao implements IUserDao{ @Overridepublic void save() {System.out.println("-----核心业务:保存!!!------");} }


 

ProxyFactory.java

package cn.lfsenior.d_myaop1; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy; /** * 代理工厂 * */public class ProxyFactory {// 目标对象private static Object target;private static Aop aop; // 生成代理对象的方法public static Object getProxyInstance(Object target_,Aop aop_){target = target_;aop = aop_;return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {aop.begin();// 执行重复代码// 执行目标对象的方法Object returnValue = method.invoke(target, args);aop.commite(); // 执行重复代码return returnValue;}});}}


App.java

package cn.lfsenior.d_myaop1; import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext; public class App {ApplicationContext ac =new ClassPathXmlApplicationContext("cn/lfsenior/d_myaop1/bean.xml"); @Testpublic void testApp() {IUserDao userDao = (IUserDao) ac.getBean("userDao_proxy");System.out.println(userDao.getClass());userDao.save();}} 


 

原创粉丝点击