面试 — 进行时 — Spring AOP

死磕Spring之AOP篇 - Spring AOP常见面试题 代理模式是一种结构性设计模式,通过代理类为其他对象提供一种代理以控制对这个对象的访问。AOP 代理是 AOP 框架中 AOP 的实现,主要分为静态代理和动态代理,如下:静态代理:代理类需要实现被代理类所实现的接口,同时持有被代理类的引用,新增处理逻辑,进行拦截处理,不过方法还是由被代理类的引用所执行。静态代理通常需要由开发人员在编译阶段就定义好,不易于维护。常用 OOP 继承和组合相结合AspectJ,在编辑阶段会织入 Java 字节码,且在运行期间会进行增强。 阅读详情

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.

说说 spring aop 的那些事。

Spring AOP 的前世今生

  • 起源与发展 :AOP(Aspect-Oriented Programming,面向切面编程)作为一种编程思想,旨在解决传统面向对象编程中存在的代码重复、关注点分散等问题。Spring AOP 是 Spring 框架对 AOP 思想的实现,它借鉴了 AOP Alliance 的相关规范,并不断发展和完善。

  • 与 AspectJ 的关系 :早期 Spring AOP 和 AspectJ 是相互竞争的 AOP 框架,但后来 Spring 决定整合 AspectJ,从 Spring 2.0 开始对 AspectJ 提供支持,并在后续版本中不断加深融合。不过,Spring AOP 和 AspectJ 在实现原理和使用场景上有所不同,Spring AOP 主要基于动态代理实现运行时增强,而 AspectJ 是基于字节码操作的编译时增强。

Spring AOP 的核心设计思想

  • 代码复用 :将通用的功能(如日志记录、事务管理等)抽取出来,形成可复用的切面模块,避免在多个业务模块中重复编写相同的代码,提高代码的可维护性和可扩展性。

  • 关注点分离 :将业务逻辑和通用功能分离,让开发者能够更专注于业务逻辑的实现,而通用功能则由切面来处理,从而使代码更加清晰、简洁,降低模块间的耦合度。

  • 动态织入 :在运行时通过动态代理技术将切面逻辑织入到目标对象的方法中,无需修改目标对象的源代码,实现了对目标对象的无侵入式增强,增强了系统的灵活性和可扩展性。

  • 基于接口与注解的编程模式 :提供了丰富的注解(如 @Aspect、@Before、@After、@Around 等),方便开发者快速定义切面和切点,降低了 AOP 编程的门槛,同时也支持基于接口的编程模式,与 Spring 容器紧密结合,方便对切面进行管理。

  • 与 Spring 容器的集成 :依赖于 Spring 的 IOC 容器,能够方便地获取和管理切面 Bean,同时也能够利用 Spring 容器的其他功能(如依赖注入等)来增强切面的灵活性和可配置性。

Spring AOP 的核心实现源码

  • AOP 代理的创建 :Spring AOP 通过 AopProxyFactory 来创建 AOP 代理对象,它会根据目标对象是否实现了接口以及相关配置来决定使用 JDK 动态代理还是 CGLIB 代理。其核心实现代码如下:扫码添加如下号码,了解更多信息。

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

    @Override
    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: " +
                        "Either an interface or a target is required for proxy creation.");
            }
            if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                return new JdkDynamicAopProxy(config);
            }
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }

    private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
        Class<?>[] ifcs = config.getProxiedInterfaces();
        return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));
    }
}
  • 方法拦截器链的执行 :在 Spring AOP 中,方法拦截器链的执行是通过 ReflectiveMethodInvocation 类来实现的,其核心代码如下:

public class ReflectiveMethodInvocation extends AbstractMethodInvocation {
    // 方法拦截器链
    private final List<Object> interceptorsAndDynamicMethodMatchers;
    private final Class<?> targetClass;
    private final Object[] arguments;
    private final Method method;
    private final Object target;
    // 其他代码...

    public Object proceed() throws Throwable {
        Object returnType = null;
        for (int i = 0; i < interceptorsAndDynamicMethodMatchers.size() - 1; i++) {
            Object interceptorOrInterceptionAdvice = interceptorsAndDynamicMethodMatchers.get(i);
            if (interceptorOrInterceptionAdvice instanceof MethodInterceptor) {
                returnType = ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
                if (returnType != null) {
                    return returnType;
                }
            }
        }
        return invokeJoinpoint();
    }

    private Object invokeJoinpoint() throws Throwable {
        return AopUtils.invokeJoinpointUsingReflection(target, method, arguments);
    }
}
  • 环绕通知的实现 :环绕通知是 Spring AOP 中一种强大的通知类型,它允许在目标方法执行前后都执行自定义逻辑,并且可以控制目标方法是否执行以及返回值等。环绕通知的核心实现代码如下:

public class AroundAdviceInterceptor implements MethodInterceptor {
    private final MethodInterceptor interceptor;

    public AroundAdviceInterceptor(MethodInterceptor interceptor) {
        this.interceptor = interceptor;
    }

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        return this.interceptor.invoke(invocation);
    }
}

Spring AOP 的使用场景

  • 日志记录 :在方法执行前后记录日志信息,方便对系统的运行情况进行监控和分析。

  • 权限验证 :在业务方法执行前进行权限验证,确保只有具有相应权限的用户才能访问特定的方法或功能。

  • 性能监控 :通过环绕通知测量方法的执行时间,对系统的性能进行监控和优化。

  • 事务管理 :对数据访问层的方法进行事务管理,确保数据的一致性和完整性。

  • 缓存管理 :在方法执行前检查缓存中是否存在结果,如果存在则直接返回缓存结果,否则执行方法并将结果存入缓存。

  • 异常处理 :在方法执行出现异常时进行统一的异常处理,如记录异常信息、发送警报邮件等。

Spring AOP 的替代方案

  • AspectJ :AspectJ 是一个功能强大的 AOP 框架,它基于字节码操作实现编译时增强,能够对类的字段、构造方法等进行增强,且性能较好。Spring AOP 已经集成了 AspectJ,但在使用时需要注意二者的区别和适用场景。

  • 字节码增强工具 :如 ASM、Javassist 等,它们可以直接操作字节码来实现对类的增强,具有较高的灵活性和性能,但使用相对复杂,需要对字节码有一定的了解。

  • 其他 AOP 框架 :如 Guice AOP 等,它们也提供了类似的功能,可根据具体需求选择合适的框架。

Spring AOP 面试题大全 每道问题都包含详细解答和代码示例,以便于理解与记忆。 阅读详情

相关推荐

IOC和AOP整合以及面试宝典spring

在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统 一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修 改源 码的基础上,还能对源码进行前后增强。属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性 注入。b、after: 在方法执行之后调用的通知,无论方法执行是否成功。

weixin_73683568的博客 1510

关于Spring 的IoC和AOP的面试题,快看看你都能答上来哪些

🏡  博客首页:派 大 星 ⛳️  欢迎关注  ❤️ 点赞  🎒 收藏  ✏️ 留言 🎢  本文由派大星原创编撰 🚧  系列专栏:《迎战面试》 🎈  本系列分享自己准备面试的过程和一些经典的面试题 目录🍓 Spring IOC🍉 IOC是什么?🥝 Ioc容器的初始化过程?🍒 基于注解的容器初始化🍅 依赖注入的相关注解?🌰 如何通过注解.

派大星的博客 1万+

Spring AOP常见面试题

Spring AOP常见面试题

m0_69468924的博客 2643

Spring AOP 详解

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架提供的一种编程范式,它允许开发者将横切关注点(如日志、事务管理、权限检查等)与业务逻辑分离,从而提高代码的模块化和可维护性。Spring AOP 基于代理机制实现,它为Spring应用提供了声明式事务管理等功能。

2301_80035594的博客 6824

来咯来咯,最新整理41道Spring和Spring AOP面试题(带答案)

最新整理41道spring和spring aop面试题 前言: 最近有很多小伙伴们私信我要spring的面试题,所以又给大家整理了一下,这里有41道spring和spring aop的面试题,由于篇幅限制,只有前二十个在这文章里带答案,需要其他面试题答案的可以关注我的公众号 Java 周某人 就获取免费领取方式! 1.什么是spring? Spring 是个ja...

Javazhoumou的博客 970

面试官:Spring AOP是怎么实现的?

介绍 Spring AOP的实现和IOC的实现比起来还是比较简单的。在正式介绍流程之前,先介绍一个接口 public interface BeanPostProcessor { // 在bean初始化之前执行 @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } // 在Bean初始化之后执行

小识的博客 8962

Spring AOP 最热门面试题及答案

译者的话 前几天去京东面试,被问到 AOP 相关的问题,之前一直没有系统地学习相关的知识,答得不是很好。趁着假期,找了一下相关的资料,优快云上有很多不错的文章,看了之后对 AOP 有比较好的理解了。然后 Google 了一下 AOP 相关面试题(AOP interview),搜出来的第一条结果是一个叫 HowToDoInJava 的网站上的一篇文章 Top Spring AOP Intervie...

dadiyang的博客 9万+

Windows系统下LaTeX环境搭建与编辑器配置全攻略

本文详细介绍了在Windows系统下搭建LaTeX环境的完整流程,包括TeX Live的安装、TeXStudio编辑器的配置优化以及常见问题排查。特别针对中文用户推荐使用清华镜像源加速下载,并提供了XeLaTeX编译器配置、中文支持等实用技巧,帮助用户快速上手LaTeX文档编写。

weixin_42554408的博客 449

Spring源码剖析-拜托面试官别再问我AOP原理了

前言 IOC/DI , AOP 是Spring最重要的两个特性 ,也是面试高频被问到的部分,前面我们已经分析了Spring的IOC相关源码以及DI依赖注入相关源码,从本篇文章开始我们着手分析Spring的AOP源码 。 AOP的理解 AOP基本概念 AOP是为面向切面编程,为什么要面向切面,何为切面?我们知道对于OOP面向对象而言在某些开发场景中是有一定不足,由于面向对象的思想是纵向的,它面对的是一个一个的对象,当我们需要在多个类中引入同一个公共的业务时(比如:事务,操作日志等),那么在每个类中都要引入公共

墨家巨子@俏如来 3900

Python与CAD系列基础篇(十)图形复制、移动、删除

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。进行图形复制、移动、删除的方法。pyautocad方式。pyautocad方式。

weixin_43894929的博客 2209

【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解

DeepSeek + Coze 打造个人专属AI智能体使用详解

congge 1万+

Spring面试必备:Spring IOC和AOP的理解、如何解决Spring循环依赖

IOC(Inversion of Control)是 Spring 框架的核心概念,指的是将对象的创建和管理交给 Spring 容器,而不是在应用程序中显式地进行控制。通过 IOC,依赖对象可以通过依赖注入(Dependency Injection, DI)进行传递,简化了对象的创建过程,降低了耦合度。

程序员-杨胡广的博客 2173

Open3D 读取、保存、显示点云【2025最新版】

paint_uniform_color给所有的点上一个统一的颜色。博客长期更新,本文最近更新时间为:2025年1月1日。

点云侠的博客 37万+

Spring IOC AOP常见的面试题及概念

本篇部分内容来源于网络,加上个人总结归纳,另外加上一些自己的见解,于是本篇文章诞生。感谢部分内容的提供者。 1、 Spring的 IOC和AOP机制 ? (1)我们是在使用 Spring框架的过程中,其实就是为了使用 IOC(控制反转)、依赖注入(DI与IOC一样)和AOP(面向切面编程),这两个也是 Spring 的灵魂。 (2)主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,AOP就是典型的代理模式的体现。 代理模式是常用的Java设计模式,他的特征是代理类与委托类有同样的接口,代理

qq_43012792的博客 9337

多物理场光学仿真软件:Ansys Lumerical_(8).CHARGE解决方案详解

CHARGE 模块主要用于求解 Poisson 方程和连续性方程,以模拟半导体器件中的电荷分布和载流子输运。通过 CHARGE 模块,可以分析器件的能带结构、载流子浓度、电流密度等关键参数。这些参数对于理解器件的工作原理和优化设计至关重要。

kkchenjj的博客 1382

VTsystem背景检查函数Value Valid

Value Valid是个非常实用的函数,如何让它灵活的为我们所用,便是本文的内容。

欢迎来到eee的博客 792

Spring AOP常见面试题整理

一直觉得对AOP了解得比较清楚了,不就是面向切面编程嘛,应用最多的地方,就是日志打印,没什么难点。可是有一天一个朋友微信发了一张图,问了两个问题: 1、Spring AOP的设计原理是什么? 2、在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? 我发现完全蒙圈,根本答不上来啊,真是汗颜,趁有空,赶紧抽时间整理下。 如果不用AO...

weixin_39309402的博客 2万+

大数据学习指南从入门到精通

利用框架的力量,看懂游戏规则,才是入行的前提大多数人不懂,不会,不做,才是你的机会,你得行动,不能畏首畏尾选择才是拉差距关键,风向,比你流的汗水重要一万倍,逆风划船要累死人的为什么选择学习大数据开发,不选择Java开发?借棋弈做比喻,智商高的不要选择五子琪,要选择围棋,它能长久地吸引你。不都是在棋盘上一颗黑子一颗白子地下吗?因为围棋更复杂,能够掌握如此复杂的技艺、产生稳定输出的棋手、让我们更佩服。选择学习大数据开发也如此,能让你的职业生涯走得更远,少走弯路。

Lansonli(蓝深李)的博客 2万+

面试题,说说你对spring IOC和AOP的理解

在面试中,经常会问,说说你对spring IOC和AOP的理解,问题很宽泛,似乎不知道从何说起。 回答思路:1.先用通俗易懂的话解释下何为IOC和AOP---------》2.各自的实现原理-----------》3.自己的项目中如何使用         以下文章本人觉得可以很好地回答前两个问题,特此转载供读者参考: http://blog.youkuaiyun.com/it_man/artic

s20081294的专栏 6万+

15、SQL Server查询优化与CPU负载管理

本文深入探讨了SQL Server查询优化与CPU负载管理的关键技术,包括强制连接类型的使用、键查找问题的解决、索引设计的最佳实践、高CPU负载的排查与优化,以及并行性的利弊与调整策略。通过优化查询逻辑、合理设计索引、监控与管理CPU资源,可以显著提升SQL Server的性能和稳定性。适用于数据库开发人员和DBA进行性能调优参考。

pz8901234的博客 76

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Spring 面试之IoC 和 AOP

Spring IoC 什么是IoC Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下: 控制是什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器

上山打卤面的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring面试,IoC和AOP的理解

spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

kiss_vicente的专栏 10万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

AOP、IOC、Spring面试题(个人总结)

一、什么是IOC? IOC就是一个Spring特有的,用来装类对象的,就是我们用Spring框架时,不需要new对象了,不过我们需要让我们的Spring知道我们写了哪些配置和需要用什么,所以这时我们就要引用Spring的注解或者在配置xml文件上配置我们的类配置,就是在我们自己写的类上加上@Component、@Controller、@Service、@Repository等等这些让我们的Spring知道我们等下要调用有哪些类,让它先准备准备,等下我们需要用了,就getBean或者通过@Autowrite

weixin_50520054的博客 3620

spring面试题之AOP

面试的时候关于spirng的知识点中,AOP绝对是一大热点,那么该怎么回答关于AOP的面试问题呢,接下来,将我自己总结的关于AOP的面试问题分享给各位。 (1).Spring AOP用的是哪种设计模式? 代理模式。 通过代理,可以详细控制访问某个或者某类对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。 (2).谈谈你对代理模式的理解? 通过代理,控制对对象的访问,它的设...

越是憧憬,越要风雨兼程 5639

Spring AOP 面试难点总结

Spring AOP 面试难点总结 Spring AOP 经常是各大面试官必提的知识点。我这里总结了 AOP 的各种关键知识点,希望能帮助到大家。 AOP 它能做什么:事务、安全、日志、缓存. 以前都是OOP的思想下编程模型,一切都是面向对象,显得井然有序,但某一天发现许多对象逻辑里有相同的代码逻辑或片段,比如记录日志、用户权限验证,他们都是做同样的事,这样,第一是觉得这样的代码对于有洁癖的人看起来是很反感的,再者若这些代码涉及改动时所有用到的点都要改。但又发现这些需要植入的地方只是一些关键地方。 那么,是

qq_36789243的博客 429

Spring 框架之AOP的原理剖析(面试必备)

本博客部分知识内容是由追梦工程师启发而来,同时也希望正在面试得你得到一份好工作。 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构的另一种考虑,补充了 OOP(Object-Oriented Programming)面向对象编程。在 OOP 中模块化的关键单元是类,而在 AOP 中,模块化单元是切面。也就是说 A...

weixin_41446894的博客 7300
上一篇: 面试 — 进行时 — CGLIB代理实现
下一篇: 面试 — 进行时 — 代理那些事
supingemail
博客等级 码龄18年 1235粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值