`

Spring Aop Advise方法(增强方法) 中获取目标方法的参数

阅读更多

Spring Aop Advise方法(增强方法) 中获取目标方法的参数

 

1. 概念 

   

   切面类: 一种特殊bean,通过aop配置,其中的方法(增强方法),会对目标bean的目标方法做一些增强处理

   (比如在目标方法之前或之后调用等).

   

   切入点(pointcut): 一种规则,普通bean中符合这种规则的方法,将成为上面切面类中所说的目标方法,接受切面类方法

   的特殊处理.

   

   增强方法(Advice),包括aop:befor,aop:after,aop:after-retuing,aop:around,aop:throwing等.

   

2. 配置片段:

     

<!-- AOP测试的chinese -->
            <bean id="chinese_aop" class="test.aop.Chinese" />
            <!-- 定义一个普通bean,作为切面bean -->
            <bean id="accessArgAspect" class="test.aop.aspect.AccessArgAspect" />
            <!-- AOP配置  --> 
            <aop:config>
              <!-- 配置切面aspect -->
              <aop:aspect id="aspect" ref="accessArgAspect">
                <aop:after-returning 
                  pointcut="execution(* test.aop.*.*(..))" 
                  method="access"
                  returning="retval"
                  arg-names="time,food,retval" 
                />
              </aop:aspect> 
            </aop:config>

       

    上面的配置中:

    <bean id="chinese_aop" class="test.aop.Chinese" />

    配置了普通的bean,该bean中的一些方法

    即将满足切入点配置规则,接受切面类中增强方法(Advice)的增强处理.

    

    <bean id="accessArgAspect" class="test.aop.aspect.AccessArgAspect" /> 定义一个切面类,

    切面类可以是一个普通的bean.

    

    <aop:config>

      <!--配置切面aspect,通过ref关联到前面配置的作为切面类的bean-->

      <aop:aspect id="aspect" ref="accessArgAspect">

        <!-- 配置一种aop:after-returning增强处理-->

        <aop:after-returning

          <!-- 切入点 规则,符合这个规则的普通bean中的方法将接受增强处理 -->

          pointcut="execution(*test.aop.*.*(..)) and args(food,time,..)"  

          <!-- 切面类中,作为增强处理的方法的名称 -->

          method="access"

          <!-- 普通bean,接受增强处理方法的返回值,void的类型被视为null --> 

          returning="retval" 

          <!-- 切面类中增强方法的参数名,这个配置可以省略 -->

          arg-names="time,food,retval"

        />

        

      </aop:aspect>

    </aop:config>

    

3. 参数绑定

   切面类 方法(增强方法)获取 目标方法(普通bean中接受增强方法处理的方法) 参数的方式称为参数绑定.

   

   (1) 增强方法 不需要传递参数,则不需要参数绑定.

   

   (2) 增强方法中,只有一个JoinPoint类型的参数,使用这种参数,也不需要参数绑定.

       因为, JoinPoint类有一些方法可以获取目标方法的调用信息(包括参数信息),比如:

       Object[] getArgs(),返回在执行目标方法时传递的参数

       Signature getSignature(),获取 目标方法的签名

       Object getTarget():返回被植入 增强处理的目标对象

       Object getThis(): 返回AOP框架为目标对象生成的代理对象(Spring AOP通过动态代理实现)

       

       假如是aop:around类型的增强处理方法,可以使用ProceedingJoinPoint作为参数,

       ProceedingJoinPoint除了有上述的几个方法外,还有一个proceed()方法,替代目标方法执行.

       

   (3) 增强方法中,有普通类型的参数,

       比如public void access(Date time,String food, String retval)

       这种增强方法,必须要在pointcut中通过配置args 和 returning,保证参数正确绑定.

       (returning只针对aop:after-returning类型的增强处理,其他的可以省略)

       (即,增强方法中出现的参数名必须在pointcut配置中都得到明确的配置,否则报异常)

       pointcut="execution(*test.aop.*.*(..)) and args(food,time,..)"

       中args(food,time,..)中的food和time是参数名,来自切面类的增强方法,不能乱写,

       必须和切面类中增强方法的参数名称一致,在切面类的增强方法参数列表中必须能找到.

       因为在增强方法public void access(Date time,String food, String retval)中,time是Date类型的,

       food是String类型的,所以pointcut(切入点)定义中and args(food,time,..)符合and前面的规则的同时

       还要符合args(food,time,..)的规则.

       args(food,time,..)表是所有 第一个参数是String类型,第二个参数是Date类型的方法才能称为目标方法.

       .. 表示可以有第三个,第四个, ... , 第n个参数,但是至少有两个参数(String,Date)

       所以需要注意的有:

       a. 切面类中的增强方法参数,必须要在pointcut中有明确指定,比如

          public void access(Date time,String food, String retval)

          这个方法中三个参数food,和time通过args指定了,retval表示aop:after-returning定义的目标函数的返回值.

       b. 明确指定了参数后,AOP框架在运行时能正确绑定参数,因为:

          and args(food,time,..)表示 只对一类目标方法的调用做增强处理,这种目标方法是:在准备调用这种目标方法时,

          实际传递给它的参数为food和time所表示的类型(food和time必须在增强方法的参数列表中找到,这样就根据增强方法确定了food和time的类型).

          并且,传递参数的顺序也要是和args(food,time,..)中一致.这样在调用目标方法时,至少会按顺序传递food,time两个参数,

          AOP框架可以将这两个参数传递给 增强方法.

   

   (4) 增强方法中 有 JoinPoint和普通类型参数,

       则必须将JoinPoint类型的参数作为第一个参数,普通参数从第二个开始.

       其他的处理方式,按照上面(3)中仅含有普通参数的方式处理.

       

 主要代码;

package test.aop;

import java.util.Date;

/**
 * 
 * 普通bean的接口
 *
 */
public interface Person
{
  String sayHello(String name);
  void eat(String food, Date time);
  void eat2(String food, Date time,String test);
}

 

package test.aop;

import java.util.Date;

/**
 * 
 *一个普通bean,eat方法和sayHello方法,是需要被切入,动态影响的
 *
 */
public class Chinese implements Person
{

  @Override
  public void eat(String afood, Date atime)
  {
    System.out.println("正在吃: " + afood + ", 时间是: " + atime);
  }

  @Override
  public String sayHello(String name)
  {
    return name + " Hello, Spring AOP.";
  }
  
  public void eat2(String afood, Date atime,String test)
  {
    System.out.println("eat2 --------- 正在吃: " + afood + ", 时间是: " + atime + ", eat2里面的test= " + test);
  }

}

 

package test.aop.aspect;

import java.util.Arrays;
import java.util.Date;

import org.aspectj.lang.JoinPoint;

/**
 * 
 * 定义切面类,处理test.aop.Chinese.eat()
 *
 */
public class AccessArgAspect
{
  
  //普通的 增强方法
  public void access(Date time,String food, String retval)
  {
    System.out.println("");
    
    System.out.println("目标方法中 String 参数为: " + food);
    System.out.println("目标方法中 String 参数为: " + time);
    System.out.println("目标方法 返回值: " + retval);
    
    System.out.println("模拟记录日志...");
    
  }
  
  /**
   * 第一个参数为JoinPoint类型的增强方法,JoinPoint必须为第一个参数
   * @param jp
   * @param time
   * @param food
   * @param retval
   */
  public void accessWithJoinPoint(JoinPoint jp,Date time,String food)
  {
    System.out.println("");
    System.out.println("JoinPoint.getArgs()获取参数列表:" + Arrays.toString(jp.getArgs()));
    
    System.out.println("JoinPoint jp ---- 目标方法中 String 参数为: " + food);
    System.out.println("JoinPoint jp ---- 目标方法中 String 参数为: " + time);
    
    System.out.println("JoinPoint jp ---- 模拟记录日志...");
    
  }
}

 

package test.aop;

import java.util.Date;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 
 * AOP客户端测试类
 *
 */
public class TestClient
{
  public static void main(String[] args)
  {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
    System.out.println(ctx);
    
    Person person = ctx.getBean("chinese_aop",Person.class);
    
    person.sayHello("jack");
    
    person.eat("米饭",new Date());
    
    person.eat2("米饭",new Date(),"test");
  }
}

 

<?xml version="1.0" encoding="UTF-8"?>  
<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-3.0.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 
            
            <!-- 小试牛刀 property使用 name,value-->
            <bean id="personService" class="test.spring.PersonService">
              <property name="name" value="wawa"></property>
            </bean>
            
            <!-- 
                  设值注入
                property使用 name,ref ,
                ref也是一个bean的id,ref 可以在stoneAxe和steelAxe之间随意切换,而不用修改java代码 
            -->
            <bean id="chinese" class="test.ioc.setter.Chinese">
              <property name="axe" ref="steelAxe"></property>
            </bean>
            <bean id="stoneAxe" class="test.ioc.setter.StoneAxe" /> 
            <bean id="steelAxe" class="test.ioc.setter.SteelAxe" /> 
            
            <!-- 
                构造注入
                constructor-arg标签,ref ,
                ref也是一个bean的id,ref 可以在stoneAxe和steelAxe之间随意切换,而不用修改java代码
                constructor-arg 也可以配置value,表示传递给构造函数的是一个 普通的值,而不是另一个bean 
            -->
            <bean id="chinese1" class="test.ioc.constructor.Chinese">
              <constructor-arg ref="steelAxe" /> 
            </bean>
            
            <!-- 国际化 -->
           <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
              <property name="basenames" >
                <list>
                  <!-- 这里的value可带路径   -->
                  <value>message</value>
                </list>
              </property> 
            </bean>
            
            <!-- 
              ApplicationContext的事件机制 
                在Spring中配置了实现ApplicationListener接口的Bean,
              Spring容器就会把这个Bean当成容器事件的监听器
            -->
            <bean class="test.springevent.EmainNotifier" /> 
            
            <!-- bean中获取 ApplicationContext引用-->
            <bean name="beangetappcontext" class="test.bean.get.appcontext.BeanGetAppContext" />
            
            <!-- AOP测试的chinese -->
            <bean id="chinese_aop" class="test.aop.Chinese" />
            <!-- 定义一个普通bean,作为切面bean -->
            <bean id="accessArgAspect" class="test.aop.aspect.AccessArgAspect" />
            <!-- AOP配置  --> 
            <aop:config>
              <!-- 配置切面aspect -->
              <aop:aspect id="aspect" ref="accessArgAspect">
                <aop:after-returning 
                  pointcut="execution(* test.aop.*.*(..)) and args(food,time,..)" 
                  method="access"
                  returning="retval"
                  arg-names="time,food,retval" 
                />
                
                <aop:before 
                  pointcut="execution(* test.aop.*.*(..)) and args(food,time,..)" 
                  method="accessWithJoinPoint"
                />
                
              </aop:aspect> 
            </aop:config>
             
</beans> 

 

工程文件注:

 

使用Spring 3.2.0的所有ja包,

3.2.0的srping包,做AOP需要依赖(Spring 3.2.0中去除了依赖包,需要自己找)

com.springsource.org.aopalliance-1.0.0.jar,下载地址http://ebr.springsource.com/repository/app/bundle/version/detail?name=org.springframework.aop&version=3.2.0.RELEASE

还有,3.0.2的com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar包,

下载3.0.2版本的依赖包以后,找

spring-framework-3.0.2.RELEASE-dependencies (1)\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE这个目录里面有      

          

附件中工程已包含所有需要的jar包

         

分享到:
评论

相关推荐

    基于java的-28-“智慧食堂”设计与实现--LW-源码.zip

    提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    C#,回文分割问题(Palindrome Partitioning Problem)算法与源代码

    C#,回文分割问题(Palindrome Partitioning Problem)算法与源代码 1 回文串 “回文串”是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串。 2 回文分割问题 给定一个字符串,如果该字符串的每个子字符串都是回文的,那么该字符串的分区就是回文分区。 例如,“aba | b | bbabb | a | b | aba”是“abababababa”的回文分区。 确定给定字符串的回文分区所需的最少切割。 例如,“ababababababa”至少需要3次切割。 这三个分段是“a | babbab | b | ababa”。 如果字符串是回文,则至少需要0个分段。 如果一个长度为n的字符串包含所有不同的字符,则至少需要n-1个分段。

    node-v9.2.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    贪心算法解决活动选择问题,Java版源码

    贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解可以决定全局最优解。 附件中一个使用贪心算法解决活动选择问题(也称为会议时间安排问题)的 Java 示例代码。这个问题的目标是选择最大的活动数量,使得活动之间互不重叠。 在示例中,我们定义了一个 Activity 类来表示每个活动的开始和结束时间。然后,我们创建了一个活动数组,并使用 Arrays.sort() 方法按照活动的结束时间对它们进行排序。 接下来,我们遍历排序后的数组,使用贪心算法的策略选择活动。选择的标准是当前活动的开始时间是否晚于或等于之前选择的最后一个活动的结束时间。如果是,我们就选择这个活动,并更新 lastActivityEnd 为当前活动的结束时间。最后,我们打印出可以执行的最大活动数量。

    小程序-2-“最多跑一次”微信小程序--LW-源码.zip

    提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    基于java的-198-ssm智能新冠疫苗接种助手--LW-源码.zip

    提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    酒店管理系统的设计与实现.zip

    本项目基于jsp框架,数据库采用mysql,采用tomcat服务部署,适合学生论文、课设参考及学习。 功能介绍: 1)基本操作 2)客户管理 3)客房管理 4)菜品管理 5)餐桌预定 6)餐饮消费管理

    【前端素材】大数据-大屏数据统计.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    node-v8.11.2.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    雷迪森的工具包(95分以上课程大作业).zip

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以简化开发过程、提高代码的可维护性和可测试性。 2. Spring MVC框架:Spring MVC是基于Spring框架的Web框架,用于开发Web应用程序。它采用MVC(Model-View-Controller,模型-视图-控制器)的架构模式,将应用程序分为模型层、视图层和控制器层,提供了处理请求、渲染视图和管理流程的功能。 3. MyBatis框架:MyBatis是一个持久层框架,用于与数据库进行交互。它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    基于java的-148-php停车场管理系统-源码.zip

    提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    【前端素材】大数据-银行企业信用风险实时监测.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    node-v8.12.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    【前端素材】大数据-观测站 综合监管平台.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    基于java的-179-ssm大健康老年公寓管理系统-源码.zip

    提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    node-v12.14.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码

    C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码 割线法 割线法用于求方程 f(x) = 0 的根。它是从根的两个不同估计 x1 和 x2 开始的。这是一个迭代过程,包括对根的线性插值。如果两个中间值之间的差值小于收敛因子,则迭代停止。 亦称弦截法,又称线性插值法.一种迭代法.指用割线近似曲线求方程根的2步迭代法.此法用通过点(xk,f(xk))及(xk-1,f(xk-1))的割线 近似曲线y=f(x),用割线的根作为方程根的新近似xk+1,从而得到方程求根的割线法迭代程序 ( k=1,2,…,n), 其中x0,x1为初始近似.若f(x)在根x*的邻域内有二阶连续导数,且f′(x*)≠0,则当x0,x1在x*邻域内时,割线法收敛于x*,其收敛阶为

    模型算法灰色系统理论.pptx

    数学模型算法

    YOLOV5 改进实战项目【更换骨干网络为shufflenet】:橘子是否成熟检测(包含数据、代码、训练好的权重文件)

    YOLOV5 改进实战项目【更换骨干网络为shufflenet】对橘子是否成熟检测,包含代码、数据集、训练好的权重参数,经测试,代码可以直接使用。 【yolov5】项目总大小:196 MB 本项目更换了yolov5骨干网络为官方实现的resnet网络,简单训练了30个epoch,map指标为0.97,map0.5:0.95=0.62。这里仅仅训练了30个epoch用于测试,网络还没收敛,加大轮次可以获取更高的网络性能 【如何训练】和yolov5一样的训练方法,摆放好datasets数据,然后更改yaml文件中的类别信息即可训练 【数据集】(数据分为分为训练集和验证集) 训练集datasets-images-train:2313张图片和2313个标签txt文件组成 验证集datasets-images-val:224张图片和224个标签txt文件组成 更多yolov5改进介绍、或者如何训练,请参考: https://blog.csdn.net/qq_44886601/category_12605353.html

    week6.1.7z

    week6.1.7z

Global site tag (gtag.js) - Google Analytics