ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5.1 spring常识AOP!

2021-09-14 16:33:14  阅读:150  来源: 互联网

标签:5.1 userService spring AOP 代理 切面 aop UserService public


AOP为Aspect Oriented Programming的缩写,意为:面向切面编程

通俗点讲,就是在你业务功能(目标类)方法执行前或者执行后,统一进行执行的(切面类)方法 目的也是为了降低业务逻辑部件间的耦合度,提高程序可重用性,提高开发效率。 aop采用横向抽取机制,取代传统纵向继承体系!   经典应用:事务管理、性能监视、安全检查、缓存 、日志等,特点是统一维护处理!   aop术语: 1.target:目标类,需要被代理的类。例如:UserService 2.Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法 3.PointCut 切入点:已经被增强的连接点。例如:addUser() 4.advice 通知/增强,增强代码。例如:after、before 5. Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程. 6.proxy 代理类 7. Aspect(切面): 是切入点pointcut和通知advice的结合 一个线是一个特殊的面。 一个切入点和一个通知,组成成一个特殊的面。 aop实现有两种方式:手动方式和自动方式,所谓手动方式就是不需要在xml做任何配置,全靠代码实现, 自动方式要在application中配置aop相关属性!   代码见sringTest 手动方式也分为两种方式 1. JDK动态代理 需要创建以下类代码 1.目标类:接口 + 实现类 public interface UserService { public void addUser(); public void updateUser(); public void deleteUser(); } 2.切面类:用于存通知 MyAspect 即你的统一处理方法 public class MyAspect { public void before(){ System.out.println("aop面向切面处理---前"); } public void after(){ System.out.println("aop面向切面处理---后"); } } 3.工厂类:编写工厂生成代理类MyBeanFactory spring-core包中Proxy.newProxyInstance创建代理类 内部做了三件事: public class MyBeanFactory { public static UserService createService(){ //1 目标类 final UserService userService = new UserServiceImpl(); //2切面类 final MyAspect myAspect = new MyAspect(); //3.代理类:将目标类(切入点)和 切面类(通知) 结合 --> 切面 UserService proxService = (UserService)Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),userService.getClass().getInterfaces(),new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //前执行 myAspect.before(); //执行目标类的方法 Object obj = method.invoke(userService, args); //后执行 myAspect.after(); return obj; } }); return proxService; } }       4.测试@Test方法 UserService userService = MyBeanFactory.createService(); userService.addUser(); 然后在执行addUser方法控制台打印: aop面向切面处理---前 IOC add user aop面向切面处理---后   2.CGLIB字节码增强 采用字节码增强框架 cglib 在运行时 创建目标类的子类,从而对目标类进行增强 目标类:不需要接口,只有实现类(没有implement)就行 也就是任意类,包含想执行的方法就型 当然你想用接口+实现类也没问题 切面类:用于存通知 MyAspect 即你的统一处理方法 3.工厂类:编写工厂生成代理 spring-core包中cglib报中的Enhancer创建代理类 代理类,也就是工厂类:将目标类(切入点)和 切面类(通知) 结合 --> 切面   自动方式也分为两种方式 1.半自动 让spring 创建代理对象,从spring容器中手动的获取代理对象 目标类 接口 + 实现类 切面类 需要实现接口:implements MethodInterceptor public class MyAspect implements MethodInterceptor { @Override public Object invoke(MethodInvocation mi) throws Throwable { System.out.println("发生前做一些东西!"); //手动执行目标方法 Object obj = mi.proceed(); System.out.println("业务处理完再做一些东西!"); return obj; } }   Spring applicationContext.xml配置 <!-- 1 创建目标类 --> <bean id="userServiceId" class="com.itheima.b_factory_bean.UserServiceImpl"></bean> <!-- 2 创建切面类 --> <bean id="myAspectId" class="com.itheima.b_factory_bean.MyAspect"></bean> <!-- 3 创建代理类 --> <bean id="proxyServiceId" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="interfaces" value="com.itheima.b_factory_bean.UserService"></property> <property name="target" ref="userServiceId"></property> <property name="interceptorNames" value="myAspectId"></property> </bean>   测试 String xmlPath = "applicationContext_Aop.xml";//不知道为什么必须放在resources资源文件夹中,这么写才有效! ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); //获得代理类 UserService userService = (UserService) applicationContext.getBean("proxyServiceId"); userService.addUser();       2.全自动 从spring容器获得目标类,如果配置aop,spring将自动生成代理。   目标类 接口 + 实现类   切面类 需要实现接口:implements MethodInterceptor   Spring applicationContext.xml配置 要引入aspectjweaver依赖 xml头部要引入xmlns:aop xsi:schemaLocation要加aop的两项 <!-- 1 创建目标类 --> <bean id="userServiceId" class="com.itheima.c_spring_aop.UserServiceImpl"></bean> <!-- 2 创建切面类(通知) --> <bean id="myAspectId" class="com.itheima.c_spring_aop.MyAspect"></bean> <!-- 3 aop编程 --> <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* com.itheima.c_spring_aop.*.*(..))" id="myPointCut"/> <aop:advisor advice-ref="myAspectId" pointcut-ref="myPointCut"/> </aop:config>   测试 String xmlPath = "applicationContext_Aop.xml";//不知道为什么必须放在resources资源文件夹中,这么写才有效! ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); //获得代理类 UserService userService = (UserService) applicationContext.getBean("userServiceId"); userService.addUser();     Spring的事务? 编程式事务管理:编程方式管理事务,极大灵活性,难维护。 声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。  

标签:5.1,userService,spring,AOP,代理,切面,aop,UserService,public
来源: https://www.cnblogs.com/zl-programmer/p/15268186.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有