spring修图软件 AOP 代码旁边的箭头是什么意思

spring中的aop 是怎么面向切面编程的_百度知道
spring中的aop 是怎么面向切面编程的
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
芯学苑Java培训
芯学苑Java培训
采纳数:313
获赞数:244
Spring面向切面编程(AOP)
1 spring容器中bean特性Spring容器的javabean对象默认是单例的。通过在xml文件中,配置可以使用某些对象为多列。Spring容器中的javabean对象默认是立即加载(立即实例化:spring加载完成,立即创建对象)scope:属性singleton:默认值为单例,默认也是立即加载,在加载完成spring容器的时候,bean对象已经创建完成& &prototype:多例的,默认懒加载,spring容器加载完成的时候,不会创建bean的对象,只有从容器获得bean对象的时候,才进行bean对象的实例化request: 将创建的javabean对象,封装到request范围session:将创建的javabean对象,封装到session范围Spring容器bean的对象生命周期:Bean对象的创建一直到销毁为bean的生命周期。生命周期的开始:如果为单例,由加载完spring容器开始如果为多例,由从容器获得bean对象开始实例化初始化服务销毁(单例:关闭容器的时候,多例由jvm自动回收)2 spring的AOP面向切面编程2.1 模拟银行转账业务需求:实现银行的转账功能,在转账的时候需要完成1 身份认证(登陆)2 权限的验证3 转账实现4 历史交易记录,分析:1,2,4三个功能对于银行的业务,属于公共的功能(共性的功能)在功能实现的时候,需要将1,2,4抽取出来,单独实现,做到了将共性的功能和核心的业务功能进行了分离通过动态代理实现:共性的功能和核心业务功能的合并,产生核心业务对象的在代码实现的时候,进行了功能实现的分离:代码开发的进行分离,程序在运行的时候进行合并。2.2 springAOP的思想在系统开发中,将系统的共性的公共的功能独立实现,在程序运行的过程中,将共性功能和核心的业务功能,进行整合。好处:1 完成共性功能和核心业务功能的解耦合2 提供共性功能的复用性。2.3springAOP的概念&Aspect切面:封装共性功能的(增强功能的)类Advice通过:切面类中封装的增强功能的方法。PointCut:切入点,是一个集合的概念,该集合的表达使用一个正则表达式表达所有核心业务对象的所有方法的前后(事务处理AOP典型的应用)JoinPoint:连接点,程序中需要加入advice的地方,而且正在执行的ponitCut织入(Weaving):将aspect和核心业务对象,进行整合的过程。3 springAOP的实现3.1通过特定接口实现Aop通知的类型:Before:前置通知After:后置通知Around:环绕通知Throwing:异常通知需求:实现在业务对象中的方法执行的时候,记录日志功能3.1.1前置通知package&org.guangsoft.import&java.lang.reflect.Mimport&java.util.Aimport&java.util.Dimport&org.springframework.aop.MethodBeforeA/****&*&前置增强:&*&MethodBeforeAdvice&接口表示重写的方法为前置advice&*&***/public&class&BeforeLog&implements&MethodBeforeAdvice{&&&&@Override&&&&public&void&before(Method&method,&&&&Object[]&args,&Object&obj)&&&&throws&Throwable&&&&{&&&&&&&&System.out.println(method);&&&&&&&&System.out.println(Arrays.toString(args));&&&&&&&&System.out.println(obj);&&&&&&&&System.out.println(&BeforeLog-------------&&+&new&Date());&&&&}}AOP配置:&?xml&version=&1.0&&encoding=&UTF-8&?&&!--&到入xml文件的约束&--&&beans&xmlns=&&&&&xmlns:aop=&&&&&xmlns:xsi=&&&&&xsi:schemaLocation=&&&&&&&&&&&&&&&&&&&&&!--&实例化BeforeLog对象&--&&&&&&bean&id=&bf&&class=&org.guangsoft.utils.BeforeLog&&&/bean&&&&&&!--&实例化service对象&--&&&&&&bean&id=&us&&class=&org.guangsoft.service.impl.UsersServiceImpl&&/&&&&&&!--&进行aop的配置,产生代理对象&--&&&&&&aop:config&&&&&&&&&&!--&声明切入点&--&&&&&&&&&&aop:pointcut&expression=&execution(*&org.guansoft.service.impl.*.*(..))&&&&&&&&&&&&&id=&pc&&/&&&&&&&&&&!--&织入&将通知和切入点进行合并(切面+核心业务对象)&--&&&&&&&&&&aop:advisor&advice-ref=&bf&&pointcut-ref=&pc&&/&&&&&&/aop:config&&/beans&3.1.2后置通知对业务对象的方法进行后增强。package&org.guangsoft.import&java.lang.reflect.Mimport&java.util.Dimport&org.springframework.aop.AfterReturningA/***&*&后置通知&*&***/public&class&AfterLog&implements&AfterReturningAdvice{&&&&@Override&&&&public&void&afterReturning(Object&obj1,//&obj1&接收目标方法的返回值&&&&&&&&&&&&Method&method,&&&&&&&&&&&&Object[]&args,&&&&&&&&&&&&Object&obj2)&throws&Throwable&&&&{&&&&&&&&//&System.out.println(obj1+&----------------------&+obj2);&&&&&&&&System.out.println(&AfterLog-------------------&&+&new&Date());&&&&}}AOP配置:&?xml&version=&1.0&&encoding=&UTF-8&?&&!--&到入xml文件的约束&--&&beans&xmlns=&&&&&xmlns:aop=&&&&&xmlns:xsi=&&&&&xsi:schemaLocation=&&&&&&&&&&&&&&&&&&&&&!--&实例化BeforeLog对象&--&&&&&&bean&id=&bf&&class=&org.guangsoft.utils.BeforeLog&&&/bean&&&&&&bean&id=&af&&class=&org.guangsoft.utils.AfterLog&&&/bean&&&&&&!--&实例化service对象&--&&&&&&bean&id=&us&&class=&org.guangsoft.service.impl.UsersServiceImpl&&/&&&&&&!--&进行aop的配置,产生代理对象&--&&&&&&aop:config&&&&&&&&&&!--&声明切入点&--&&&&&&&&&&aop:pointcut&expression=&execution(*&org.guangsoft.service.impl.*.*(..))&&&&&&&&&&&&&id=&pc&&/&&&&&&&&&&!--&织入&将通知和切入点进行合并(切面+核心业务对象)&--&&&&&&&&&&aop:advisor&advice-ref=&bf&&pointcut-ref=&pc&&/&&&&&&&&&&aop:advisor&advice-ref=&af&&pointcut-ref=&pc&&/&&&&&&/aop:config&&/beans&3.1.3环绕通知package&org.guangsoft.import&java.lang.reflect.Mimport&java.util.Aimport&java.util.Dimport&org.aopalliance.intercept.MethodIimport&org.aopalliance.intercept.MethodI/***&*&环绕通知&*&***/public&class&AoundLog&implements&MethodInterceptor{&&&&/**&&&&&*&MethodInvocation中封装了目标对象,调用的方法,方法需要的参数&&&&&*&***/&&&&@Override&&&&public&Object&invoke(MethodInvocation&mi)&throws&Throwable&&&&{&&&&&&&&Method&method&=&mi.getMethod();&&&&&&&&Object[]&args&=&mi.getArguments();&&&&&&&&Object&obj&=&mi.getThis();&&&&&&&&System.out.println(method);&&&&&&&&System.out.println(Arrays.toString(args));&&&&&&&&System.out.println(obj);&&&&&&&&System.out.println(&around------before--------&&+&new&Date());&&&&&&&&Object&rv&=&method.invoke(obj,&args);//&调用目标对象的方法,放行&&&&&&&&System.out.println(&around------after--------&&+&new&Date());&&&&&&&&return&&&&&}}AOP配置:同上3.1.4 异常通知package&org.guangsoft.import&java.util.Dimport&org.springframework.aop.ThrowsA/****&*&异常通知&*&**/public&class&ExceptionLog&implements&ThrowsAdvice{&&&&/***&&&&&*&该类中的方法参考AfterReturningAdvice写&&&&&*&该参数是用来接收异常信息的&&&&&*&***/&&&&public&void&afterThrowing(Throwable&ex)&throws&Throwable&&&&{&&&&&&&&//&System.out.println(obj1+&----------------------&+obj2);&&&&&&&&System.out.println(&ExceptionLog-----------&&+&ex.getMessage()&&&&&&&&&&&&&&&&+&&--------&&+&new&Date());&&&&}}Pointcut:核心业务对象Advice:通知
来自电脑网络类芝麻团
采纳数:140
获赞数:363
参与团队:
建议看看反射机制
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。spring的aop是怎么影响代码的_百度知道
spring的aop是怎么影响代码的
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
  AOP为Aspect Oriented Programming的缩写,意为:面向方法编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。  面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。  AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。  主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。  主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改
变这些行为的时候不影响业务逻辑的代码。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Spring AOP marker at this line这个是什么意思_百度知道
Spring AOP marker at this line这个是什么意思
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:29985
获赞数:34071
Spring AOP marker at this lineSpring AOP标记在这一行双语对照例句:1.I see. Let me examine your vision. Look at this line of letters. Can you make themout? 我知道了,先查一下您的视力。请看这行字,能认出来吗? 2.If you get me this private line at saks fifth avenue. 如果你能帮我做成和萨克斯第五大道百货买卖。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。spring aop 的权限的管理是通过对路径的控制来实现的
现在共有两个角色,经理和员工
经理的权限检查的代码
MgrAuthorityInterceptor.java
public class MgrAuthorityInterceptor implements MethodInterceptor
public Object invoke(MethodInvocation invocation) throws Throwable
HttpServletRequest request =
ActionMapping mapping =
Object[] args = invocation.getArguments();
//解析目标方法的参数
for (int i = 0 ; i & args. i++ )
if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
//从session中得到用户的级别
String level = (String)request.getSession().getAttribute("level");
//如是经理级别则继续,否则,回到登陆页面
if ( level != null && level.equals("mgr") )
return invocation.proceed();
return mapping.findForward("login");
员工的权限的实现,EmpAuthorityInterceptor.java
public class EmpAuthorityInterceptor implements MethodInterceptor
public Object invoke(MethodInvocation invocation) throws Throwable
HttpServletRequest request =
ActionMapping mapping =
Object[] args = invocation.getArguments();
for (int i = 0 ; i & args. i++ )
if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
//从session中得到用户的级别
String level = (String)request.getSession().getAttribute("level");
//如是经理或员工级别则继续,否则,回到登陆页面
if ( level != null && (level.equals("emp") || level.equals("mgr")))
return invocation.proceed();
return mapping.findForward("login");
员工,经理权限的实现,在action-servlet.xml中
以经理权限拦截器生成代理
&bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&
&property name="beanNames"&
action中的经理的操作
&/property&
&property name="interceptorNames"&
&value&mgrAuthorityInterceptor&/value&
&/property&
以普通员工权限拦截器生成代理
&bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&
&property name="beanNames"&
员工中的action操作
&/property&
&property name="interceptorNames"&
&value&empAuthorityInterceptor&/value&
&/property&
&!-- 定义经理权限检查拦截器,class即前面的MgrAuthorityInterceptor.java--&
&bean id="mgrAuthorityInterceptor" class="org.***.MgrAuthorityInterceptor"/&
&!-- 定义普通员工权限检查拦截器 ,class即前面的EmpAuthorityInterceptor.java--&
&bean id="empAuthorityInterceptor" class="org.***.EmpAuthorityInterceptor"/&
浏览 13470
kukuqiu001
浏览: 180152 次
来自: 成都
反正对我是有用的
有没有使用Annotation配置AOP的方式来实现权限管理
还是不懂怎么配置出来!
很好,很到位
starandtina 写道如何解决中文问题?我是做英文项目搞 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'AOP是Spring核心功能之一。今天就用tiny-spring来实现一个AOP。具体功能会包括:
读取AspectJ格式的Pointcut描述。
使用JDK动态代理以及CGLib两种方式进行AOP织入。
AOP分为配置(Pointcut,Advice),织入(Weave)两部分工作,当然还有一部分是将AOP整合到整个容器的生命周期中。
AOP相关概念较多,我不会一一列举,但是会在每一步对概念做一点解释。
7.step7-使用JDK动态代理实现AOP织入
git checkout step-7-method-interceptor-by-jdk-dynamic-proxy
织入(weave)相对简单,我们先从它开始。Spring AOP的织入点是AopProxy,它包含一个方法Object getProxy()来获取代理后的对象。
在Spring AOP中,我觉得最重要的两个角色,就是我们熟悉的MethodInterceptor和MethodInvocation(这两个角色都是AOP联盟的标准),它们分别对应AOP中两个基本角色:Advice和Joinpoint。Advice定义了在切点指定的逻辑,而Joinpoint则代表切点。
public interface MethodInterceptor extends Interceptor {
Object invoke(MethodInvocation invocation) throws T
Spring的AOP只支持方法级别的调用,所以其实在AopProxy里,我们只需要将MethodInterceptor放入对象的方法调用即可。
我们称被代理对象为TargetSource,而AdvisedSupport就是保存TargetSource和MethodInterceptor的元数据对象。这一步我们先实现一个基于JDK动态代理的JdkDynamicAopProxy,它可以对接口进行代理。于是我们就有了基本的织入功能。
public void testInterceptor() throws Exception {
// --------- helloWorldService without AOP
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(&tinyioc.xml&);
HelloWorldService helloWorldService = (HelloWorldService) applicationContext.getBean(&helloWorldService&);
helloWorldService.helloWorld();
// --------- helloWorldService with AOP
// 1. 设置被代理对象(Joinpoint)
AdvisedSupport advisedSupport = new AdvisedSupport();
TargetSource targetSource = new TargetSource(helloWorldService, HelloWorldServiceImpl.class,
HelloWorldService.class);
advisedSupport.setTargetSource(targetSource);
// 2. 设置拦截器(Advice)
TimerInterceptor timerInterceptor = new TimerInterceptor();
advisedSupport.setMethodInterceptor(timerInterceptor);
// 3. 创建代理(Proxy)
JdkDynamicAopProxy jdkDynamicAopProxy = new JdkDynamicAopProxy(advisedSupport);
HelloWorldService helloWorldServiceProxy = (HelloWorldService) jdkDynamicAopProxy.getProxy();
// 4. 基于AOP的调用
helloWorldServiceProxy.helloWorld();
8.step8-使用AspectJ管理切面
git checkout step-8-invite-pointcut-and-aspectj
完成了织入之后,我们要考虑另外一个问题:对什么类以及什么方法进行AOP?对于“在哪切”这一问题的定义,我们又叫做“Pointcut”。Spring中关于Pointcut包含两个角色:ClassFilter和MethodMatcher,分别是对类和方法做匹配。Pointcut有很多种定义方法,例如类名匹配、正则匹配等,但是应用比较广泛的应该是和AspectJ表达式的方式。
AspectJ是一个“对Java的AOP增强”。它最早是其实是一门语言,我们跟写Java代码一样写它,然后静态编译之后,就有了AOP的功能。下面是一段AspectJ代码:
aspect PointObserving {
private Vector Point.observers = new Vector();
public static void addObserver(Point p, Screen s) {
p.observers.add(s);
public static void removeObserver(Point p, Screen s) {
p.observers.remove(s);
这种方式无疑太重了,为了AOP,还要适应一种语言?所以现在使用也不多,但是它的Pointcut表达式被Spring借鉴了过来。于是我们实现了一个AspectJExpressionPointcut:
public void testMethodInterceptor() throws Exception {
String expression = &execution(* us.codecraft.tinyioc.*.*(..))&;
AspectJExpressionPointcut aspectJExpressionPointcut = new AspectJExpressionPointcut();
aspectJExpressionPointcut.setExpression(expression);
boolean matches = aspectJExpressionPointcut.getMethodMatcher().matches(HelloWorldServiceImpl.class.getDeclaredMethod(&helloWorld&),HelloWorldServiceImpl.class);
Assert.assertTrue(matches);
9.step9-将AOP融入Bean的创建过程
git checkout step-9-auto-create-aop-proxy
万事俱备,只欠东风!现在我们有了Pointcut和Weave技术,一个AOP已经算是完成了,但是它还没有结合到Spring中去。怎么进行结合呢?Spring给了一个巧妙的答案:使用BeanPostProcessor。
BeanPostProcessor是BeanFactory提供的,在Bean初始化过程中进行扩展的接口。只要你的Bean实现了BeanPostProcessor接口,那么Spring在初始化时,会优先找到它们,并且在Bean的初始化过程中,调用这个接口,从而实现对BeanFactory核心无侵入的扩展。
那么我们的AOP是怎么实现的呢?我们知道,在AOP的xml配置中,我们会写这样一句话:
&aop:aspectj-autoproxy/&
它其实相当于:
&bean id=&autoProxyCreator& class=&org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator&&&/bean&
AspectJAwareAdvisorAutoProxyCreator就是AspectJ方式实现织入的核心。它其实是一个BeanPostProcessor。在这里它会扫描所有Pointcut,并对bean做织入。
为了简化xml配置,我在tiny-spring中直接使用Bean的方式,而不是用aop前缀进行配置:
&bean id=&autoProxyCreator& class=&us.codecraft.tinyioc.aop.AspectJAwareAdvisorAutoProxyCreator&&&/bean&
&bean id=&timeInterceptor& class=&us.codecraft.tinyioc.aop.TimerInterceptor&&&/bean&
&bean id=&aspectjAspect& class=&us.codecraft.tinyioc.aop.AspectJExpressionPointcutAdvisor&&
&property name=&advice& ref=&timeInterceptor&&&/property&
&property name=&expression& value=&execution(* us.codecraft.tinyioc.*.*(..))&&&/property&
TimerInterceptor实现了MethodInterceptor(实际上Spring中还有Advice这样一个角色,为了简单,就直接用MethodInterceptor了)。
至此,一个AOP基本完工。
10.step10-使用CGLib进行类的织入
git checkout step-10-invite-cglib-and-aopproxy-factory
前面的JDK动态代理只能对接口进行代理,对于类则无能为力。这里我们需要一些字节码操作技术。这方面大概有几种选择:ASM,CGLib和javassist,后两者是对ASM的封装。Spring中使用了CGLib。
在这一步,我们还要定义一个工厂类ProxyFactory,用于根据TargetSource类型自动创建代理,这样就需要在调用者代码中去进行判断。
另外我们实现了Cglib2AopProxy,使用方式和JdkDynamicAopProxy是完全相同的。
有一个细节是CGLib创建的代理是没有注入属性的,
Spring的解决方式是:CGLib仅作代理,任何属性都保存在TargetSource中,使用MethodInterceptor=&TargetSource的方式进行调用。
至此,AOP部分完工,Spring的核心也基本成型。除去import语句,main下面一共是1026行。下篇博文会对Spring进行一个整体的分析。
依然附上项目地址:
& 著作权归作者所有
人打赏支持
领取时间:
领取条件:购买或拥有开源马克杯的OSCer可领取
作为一个开源项目作者,是时候站出来拯救世界了!
领取时间:
领取条件:开源项目被开源中国收录的开发者可领取
“”在线下联结了各位 OSCer,推广开源项目和理念,很荣幸有你的参与~
领取时间:
领取条件:参与过开源中国“源创会”的 OSCer 可以领取
码字总数 116344
引用来自“胡桃同学”的评论step 9中,AbstractBeanFactory.getBean(String name) 的 doCreateBean(beanDefinition) 中创建了bean的实例,并将实例set到beanDefinition中,但接下来 initializeBean(bean, name) 可能会对bean生成动态代理,但并未设置到beanDefinition中,此处应为一个bug。beanDefinition.setBean(bean) 应该放在 initializeBean(bean, name) 后面才是正确的。:blush:十分感谢作者的项目,受益匪浅。设置之后感觉还是有一个问题,如果OutputService中又依赖了HelloWorldService,即循环依赖;如果先初始化HelloWorldService对象,那么初始化的过程中会去初始化OutputService;而初始化OutputService时,注入的HelloWorldService对象并不是AOP产生的代理对象
step 9中,AbstractBeanFactory.getBean(String name) 的 doCreateBean(beanDefinition) 中创建了bean的实例,并将实例set到beanDefinition中,但接下来 initializeBean(bean, name) 可能会对bean生成动态代理,但并未设置到beanDefinition中,此处应为一个bug。beanDefinition.setBean(bean) 应该放在 initializeBean(bean, name) 后面才是正确的。:blush:十分感谢作者的项目,受益匪浅。
step8、9、10解说要是能更详细点就好了,对于像我一样刚研究aop的小白来说,代码还是有点绕,看的不是太明白:persevere:
评论删除后,数据将无法恢复
引言 最近在读Spring源码,但是Spring代码层次嵌套太多,读起来有很大跳跃性,我有个朋友甚至开玩笑说,读Spring得拿纸笔,把方法和层次都写下来。 其实Spring我已经接触很久了,记得大学有个...
从Spring 2.0开始,可以使用基于schema及@AspectJ的方式来实现AOP,本文以一个简单的实例介绍了如何以@AspectJ方式在Spring中实现AOP。由于@Aspect是基于注解的,因此要求支持注解的5.0版本以...
什么是AOP Spring是解决实际开发中的一些问题: * AOP解决OOP中遇到的一些问题.是OOP的延续和扩展. AOP作用 对程序进行增强:不修改源码的情况下. * AOP可以进行权限校验,日志记录,性能监控,事...
上一篇从Web开发演进过程的一个侧面简述了一下为什么会有Spring?事实上只介绍了为什么会有Spring IOC(控制反转/依赖注入)以及Spring IOC的雏形。我们知道Spring的两个核心知识点是:IOC和...
临江仙卜算子
Spring AOP 的实现方式(以日志管理为例) 日 00:13:57 阅读数:23198 在学习Spring框架的历程中,最重要的是要理解Spring的IOC和AOP了,不但要学会怎么用,最好是知道它是怎么实...
没有更多内容
加载失败,请刷新页面
VirtualBox是一款虚拟机软件。虽然它的功能并不及VMware Workstation Pro,但它对开源精神的坚持使得它在Linux中依然深受欢迎。 唯一难以令人接受的是,VirtualBox的安装步骤较为复杂。不过,...
npm i webpack-dev-server --save-devwebpack.config.js中的module.exports增加:devServer: {
historyApiFallback: true,
hot: true,
inline: true,
progress: true,
如果您无法从 macOS 恢复功能启动 无法通过内建恢复系统启动时,新款 Mac 电脑及部分旧款 Mac 电脑会自动尝试通过互联网从 macOS 恢复功能启动。出现这种情况时,您在启动期间将会看到旋转的...
优点: 1.省略大量的xml配置文件 2.简化复杂的依赖管理 3.配合各种starter使用,基本上可以做到自动化配置 4.快速启动容器 5. 配合Maven或Gradle等构件工具打成Jar包后,Java -jar 进行部署运...
以下为Java代码 import java.io.IOEimport java.io.InputSimport java.util.Dimport java.util.HashMimport java.util.Mimport java.util.Pimpo......
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜好进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有

我要回帖

更多关于 spring面试题及答案 的文章

 

随机推荐