结语
小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。
我们选择的这个行业就一直要持续的学习,又很吃青春饭。
虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。
送给每一位想学习Java小伙伴,用来提升自己。
本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!
文章目录
-
- Spring—面向AOP编程
-
- 什么是AOP
-
Aop在Spring中的作用
-
使用Spring实现Aop
-
- 方式一:通过 Spring API 实现
-
方式二:自定义类来实现Aop
-
方式三:使用注解实现
什么是AOP
面向切面编程(AOP) 通过提供另一种思考程序结构的方式来补充面向对象编程 (OOP)。OOP 中模块化的关键单元是类,而 AOP 中的模块化单元是_方面_。方面可以实现关注点的模块化,例如跨越多种类型和对象的事务管理。(这种关注点在 AOP 文献中通常被称为_横切_关注点。)AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
Aop在Spring中的作用
-
方面:跨越多个类的关注点的模块化。事务管理是企业 Java 应用程序中横切关注点的一个很好的例子。在 Spring AOP 中,方面是使用常规类(基于模式的方法)或使用
@Aspect
注解注解的常规类 (@AspectJ
样式)实现的。 -
连接点:程序执行过程中的一个点,例如方法的执行或异常的处理。在 Spring AOP 中,一个连接点_总是_ 代表一个方法的执行。
-
Advice:方面在特定连接点采取的行动。不同类型的通知包括“around”、“before”和“after”通知。(通知类型将在下面讨论。)许多 AOP 框架,包括 Spring,将通知建模为_拦截器_,_围绕_连接点维护一个拦截器链。
-
切入点:匹配连接点的谓词。Advice 与切入点表达式相关联,并在与切入点匹配的任何连接点处运行(例如,执行具有特定名称的方法)。由切入点表达式匹配的连接点的概念是 AOP 的核心,Spring 默认使用 AspectJ 切入点表达式语言。
-
介绍:代表类型声明其他方法或字段。Spring AOP 允许您向任何建议的对象引入新的接口(和相应的实现)。例如,您可以使用介绍使 bean 实现
IsModified
接口,以简化缓存。(介绍在 AspectJ 社区中称为类型间声明。) -
目标对象:被一个或多个方面建议的对象。也称为_建议_对象。由于 Spring AOP 是使用运行时代理实现的,因此该对象将始终是_代理_对象。
-
AOP 代理:由 AOP 框架创建的对象,用于实现方面契约(建议方法执行等)。在 Spring Framework 中,AOP 代理将是 JDK 动态代理或 CGLIB 代理。
-
编织:将方面与其他应用程序类型或对象链接起来,以创建建议对象。这可以在编译时(例如,使用 AspectJ 编译器)、加载时或运行时完成。Spring AOP 与其他纯 Java AOP 框架一样,在运行时执行编织。
咨询类型:
-
前通知:在连接点之前执行的通知,但不能阻止执行流继续到连接点(除非它抛出异常)。
-
返回后通知:在连接点正常完成后执行的_通知_:例如,如果一个方法返回而没有抛出异常。
-
抛出通知后:如果方法通过抛出异常退出,则执行通知。
-
After (finally) 通知:不管连接点退出的方式(正常或异常返回)都将执行的通知。
-
环绕通知:环绕连接点的通知,例如方法调用。这是最有力的建议。环绕通知可以在方法调用前后执行自定义行为。它还负责选择是继续连接点还是通过返回自己的返回值或抛出异常来缩短建议的方法执行。
使用Spring实现Aop
使用AOP织入,需要导入一个依赖包!
org.aspectj
aspectjweaver
1.9.8.M1
runtime
方式一:通过 Spring API 实现
- 首先编写我们的业务接口和实现类
public interface UserService {
public void add();
public void delete();
public void update();
public void search();
}
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println(“增加用户”);
}
@Override
public void delete() {
System.out.println(“删除用户”);
}
@Override
public void update() {
System.out.println(“更新用户”);
}
@Override
public void search() {
System.out.println(“查找用户”);
}
}
- 然后去写我们的增强类 , 我们编写两个 , 一个前置增强 一个后置增强
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class Log implements MethodBeforeAdvice {
// method : 要执行的目标对象的方法
// objects : 被调用的方法的参数
// o : 目标对象
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(o.getClass().getName()+“的”+method.getName()+“方法被执行。”);
}
}
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class AfterLog implements AfterReturningAdvice {
/*
-
returnValue : 返回值
-
method : 被调用的方法
-
args : 被调用的方法的对象的参数
-
target : 被调用的目标参数
-
*/
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println(“执行了”+target.getClass().getName()
+“的” + method.getName()+“方法”+" 返回值:"+returnValue
);
}
}
- 最后去spring的文件中注册 , 并实现aop切入实现 , 注意导入约束 .
<beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:aop=“http://www.springframework.org/schema/aop” xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
aop:config
<aop:pointcut id=“pointcut” expression=“execution(* UserServiceImpl.*(…))”/>
<aop:advisor advice-ref=“afterLog” pointcut-ref=“pointcut”/>
<aop:advisor advice-ref=“log” pointcut-ref=“pointcut”/>
</aop:config>
- 测试
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest10 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);
/* 代理的是接口,所以用UserService */
UserService userServiceImpl = context.getBean(“userServiceImpl”, UserService.class);
userServiceImpl.add();
}
}
Spring的Aop就是将公共的业务 (日志 , 安全等) 和领域业务结合起来 , 当执行领域业务时 , 将会把公共业务加进来 . 实现公共业务的重复利用 . 领域业务更纯粹 , 程序猿专注领域业务 , 其本质还是动态代理 。
方式二:自定义类来实现Aop
目标业务类不变依旧是userServiceImpl
- 第一步 : 写我们自己的一个切入类
总结
阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了
1、JAVA面试核心知识整理(PDF):包含JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。
2、Redis学习笔记及学习思维脑图
3、数据面试必备20题+数据库性能优化的21个最佳实践
云计算共30个章节。
[外链图片转存中…(img-vZblYNjc-1715008342485)]
2、Redis学习笔记及学习思维脑图
[外链图片转存中…(img-9NOMCY3I-1715008342485)]
3、数据面试必备20题+数据库性能优化的21个最佳实践
[外链图片转存中…(img-pgnXLLXK-1715008342485)]