Spring知识点总结归纳。

Java+AI开发实战与知识点归纳系列:Spring流式输出实战——LangChain4j与Ollama集成 响应式编程基础:理解了Flux、Mono等Reactor核心概念流式API设计:掌握了如何设计流式响应的RESTful API异步编程模式:学会了回调模式与流式模式的转换前端流式处理:掌握了ReadableStream API的使用错误处理策略:学会了在流式场景下的异常处理在下一篇文章中,我们将再走一步,探讨如何实现多轮对话的上下文管理,让AI能够记住之前的对话内容,实现更智能的交互体验。本系列文章将持续更新,每一篇都是完整可运行的项目。💻完整的代码可以直接下载我上传的资源。 阅读详情

Spring

此文章部分引用java3y的《三歪教你Spring》;

简介:

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。

img
Spring 框架中重要概念

  • 容器(Container): Spring 当作一个大容器.
  • BeanFactory 接口.老版本.
  • 新版本中 ApplicationContext 接口,是 BeanFactory 子接 口.BeanFactory 的功能在 ApplicationContext 中都有.

从 Spring3 开始把 Spring 框架的功能拆分成多个 jar. Spring2 及以前就一个 jar

官方包目录介绍:

  • test: spring 提供测试功能

  • Core Container:核心容器.Spring 启动最基本的条件.

  • Beans : Spring 负责创建类对象并管理对象

  • Core: 核心类

  • Context: 上下文参数.获取外部资源或这管理注解等

  • SpEl: expression.jar

  • AOP: 实现 aop 功能需要依赖

  • Aspects: 切面 AOP 依赖的包

  • Data Access/Integration : spring 封装数据访问层相关内容

  • JDBC : Spring 对 JDBC 封装后的代码.

  • ORM: 封装了持久层框架的代码.例如 Hibernate

  • transactions:对应 spring-tx.jar,声明式事务使用.

  • web:需要 spring 完成 web 相关功能时需要.

    • 例如:由 tomcat 加载 spring 配置文件时需要有 spring-web包

环境搭建:

导入四大核心包和一个日志包:

  • logging
  • beans
  • context
  • core
  • expression

Maven直接导入坐标就行。

在resources下新建xml: applicationContext.xml,spring的配置文件可以叫任意名字,推荐叫applicationContext

Spring 容器 ApplicationContext,applicationContext.xml 配置的信息最终存储到了 AppliationContext 容器中;

idea创建的spring配置文件效果:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    
</beans>

Spring核心功能

IoC/DI 控制反转/依赖注入:

通过spring方式获取对象

配置xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="employee" class="top.young.domain.Employee"/>
</beans>

获取employee对象:

 @Test
    public void test01() throws Exception{
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        Employee employee = ac.getBean("employee", Employee.class);
        System.out.println(employee);
    }

运行结果:
在这里插入图片描述
经测试,可以正常获取对象。

bean的配置方式:

这里来归纳一下Bean的配置方式:

1-无参构造配置方式:
<bean id="person" class="cn.test._03_configuration_way.Person"/>
2-静态工厂创建对象:

通过factory-method属性来指定方法名称,这个方法必须是静态方法,因为静态方法可以直接使用 类名称.方法名称() 调用,返回Person对象

<bean id="factory" class="cn.test._03_configuration_way.static_factory.StaticFactory"
          factory-method="createPerson"/>
3-实例工厂创建对象

先配置一个工厂bean 因为它不是静态方法 所以必须要先创建工厂bean对象才能调用方法,再配置一个Person的bean,注意:第二个bean标签不要写class属性了

<bean id="factory"class="cn.test.instance_factory.instance_factory"/>
<bean id="person" factory-method="createFactory" factory-bean="factory"/>
4-FactoryBean创建对象

配置方式与默认使用无参构造创建bean对象没区别,区别就在于这个类实现了FactoryBean接口,那么Spring在初始化的时候就会自动去调用getObject方法来创建对象

以上是通过无参构造创建的对象,如果一个类有成员属性,那么怎么给属性赋值呢

spring的注入方式:
1-set注入
 <bean id="employeeDao" class="cn.itsource._01_di_set.EmployeeDao"/>

 <bean id="employeeService" class="cn.itsource._01_di_set.EmployeeService">
 	<property name="dao" ref="employeeDao"/>
  </bean>
2-constructor注入
2.1-constructor参数名注入
<bean id="employeeDao" class="cn.itsource._02_constructor.byname.EmployeeDao"/>
<bean id="employeeService" class="cn.itsource._02_constructor.byname.EmployeeService">
	<constructor-arg  name="dao" ref="employeeDao"/>
</bean>
2.2-constructor参数顺序注入
<bean id="employeeDao" class="cn.itsource._02_constructor.byindex.EmployeeDao"/>
<bean id="employeeService" class="cn.itsource._02_constructor.byindex.EmployeeService">
    <constructor-arg index="0" ref="employeeDao"/>
</bean>

2.3-constructor参数类型注入

根据参数类型注入,如果有多个想同类型的参数,那么还需要注意标签的顺序。

<bean id="employeeDao" class="cn.itsource._02_constructor.bytype.EmployeeDao"/>
<bean id="employeeService" class="cn.itsource._02_constructor.bytype.EmployeeService">
	<constructor-arg 
    	type="cn.itsource._02_constructor.bytype.EmployeeDao"
        ref="employeeDao"/>
</bean>


3-内部bean和外部bean
<!--内部-->
<bean id="employeeService"class="cn.itsource._03_inner_outer_bean.inner.EmployeeService">
	<property name="dao">
		<bean class="cn.itsource._03_inner_outer_bean.inner.EmployeeDao"/>
	</property>
</bean>
            
        
<!--外部-->
<bean id="employeeDao" class="cn.itsource._03_inner_outer_bean.outer.EmployeeDao"/>
<bean id="employeeService"class="cn.itsource._03_inner_outer_bean.outer.EmployeeService">
	<property name="dao" ref="employeeDao"/>
</bean>

4-注入数组

array标签注入

<!--        数组-->
        <property name="arrays">
            <array>
                <value>张三</value>
                <value>李四</value>
                <value>王二</value>
            </array>
        </property>

property value注入(不推荐)

<property name="arrays" value="张三,李四,王二"/>

5-注入List

​ list标签注入

<!--        list-->
        <property name="list">
            <list>
                <value>孙权</value>
                <value>曹操</value>
                <value>刘备</value>
            </list>
        </property>

6-注入Set
<!--        set-->
        <property name="set">
            <set>
                <value>猴子</value>
                <value>猴子</value>
                <value>赵信</value>
            </set>
        </property>

7-注入Map

​ 普通类型写法:

​ 其他类型写法:

​ 使用内部bean:

<!--            map-->
        <property name="map">
            <map>
                <entry key="mapkey" value="obj"></entry>
                <entry key="mapkey2" value-ref="otherBean"></entry>
                <entry key="mapke3" value="123"></entry>
                <entry key="mp3">
                    <ref bean="otherBean"/>
                </entry>
            </map>
        </property>

8-注入property
8.1-prop标签
<!--        property-props-->
        <property name="props1">
            <props>
                <prop key="driverClassName">com.mysql.jdbc.Dirver</prop>
                <prop key="url">jdbc:mysql://localhost:3306/test</prop>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>

8.2-value标签
<!--        property-value-->
        <property name="props2">
            <value>
                ##注释
                driverClassName=com.mysql.jdbc.Driver
                url=jdbc:mysql://localhost:3306/test
                username=root
                password=123456
            </value>
        </property>	

面向切面编程Spring-AOP

在学习AOP之前,我们要先学习一个设计模式,代理模式。

1.代理模式:
1-1.代理模式简介:

代理模式,提供了间接对目标对象进行访问的方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的功能上,增加额外的功能补充,即扩展目标对象的功能。—引用自互联网

1-2.静态代理

使用明星和经纪人举例,你想找一个明星来唱歌,你不能直接找明星谈,你需要找他的经纪人,首先签合同,然后明星过来唱歌,最后经纪人来收钱。

/**
 * @author young
 * @date 2020/4/18
 *
 *	由真实对象抽象出来的接口。
 */
public interface Star {
    /**
     * 签合同
     */
    void contract();

    /**
     * 唱歌
     */
    void singing();

    /**
     * 收钱
     */
    void collectMoney();
}

-------------------------------------------------------------------------------------
/**
 * @author young
 * @date 2020/4/18
 * 	
 *	经纪人
 */
public class AgentStar implements Star {
    private Star star;
    private String name;

    public AgentStar(Star star, String name) {
        this.star = star;
        this.name = name;
    }

    @Override
    public void contract() {
        System.out.println(this.name+"签合同");
    }

    @Override
    public void singing() {
        this.star.singing();
    }

    @Override
    public void collectMoney() {
        System.out.println(this.name+"收钱");
    }
}
--------------------------------------------------------------------------------------
/**
 * @author young
 * @date 2020/4/18
 *
 *		明星本人
 */
public class RealStart implements Star {
    private String name;

    public RealStart(String name) {
        this.name = name;
    }

    @Override
    public void contract() {
        System.out.println(this.name+"签合同");
    }

    @Override
    public void singing() {
        System.out.println(this.name+"唱歌");
    }

    @Override
    public void collectMoney() {
        System.out.println(this.name+"收钱");
    }
}  
-----------------------------------------------------------------------------------------
/**
 * @author young
 * @date 2020/4/18
 * 单元测试
 */
public class Test05 {
    @Test
    public void test() throws Exception{
        //明星本人
        Star realStart=new RealStart("周伦杰");
        //明星经纪人
        Star agentStar=new AgentStar(realStart,"宋喆");
        //你联系经纪人,签合同
        agentStar.contract();
        //联系经纪人,约时间唱歌
        agentStar.singing();
        //经纪人来收钱
        agentStar.collectMoney();
    }
}
----------------------------------------------------------------------------------------

运行结果

在这里插入图片描述

1-3.动态代理

此处使用JDK动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @author young
 * @date 2020/4/18
 *
 *
 *  jdk动态代理需要实现InvocationHandler接口
 */
public class StarInvocationHandler implements InvocationHandler {
    /**
     * 真实对象
     */
    private Star star;
    //经纪人对象。
    private Star agent;

    public StarInvocationHandler(Star star, Star agent) {
        this.star = star;
        this.agent = agent;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=null;
        //如果是唱歌就让明星来唱歌,否则都教给经纪人做
        if(method.getName().equals("singing")){
            return method.invoke(star, args);
        }else {
            return method.invoke(agent, args);
        }
    }
}


通过以上案例,已经基本了解了代理模式的设计思想,接下来就该学习AOP了。

2.面向切面编程Spring-AOP
2-1.简介

AOP的全称是 Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。目前是一种比较成熟的编程方式。
在传统的业务处理代码中,经常会有事务处理,日志处理等与核心业务无关的代码,同样的代码会分散到各个方法中。这样如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这违反了程序设计的开闭原则 。

2-2.四种通知:

@before 前置通知,执行目标方法之前执行。

@after 后置通知,执行目标方法之后执行

@after-throwing 异常通知,执行目标方法过程中出现异常则执行此通知。

@after-returning 返回后通知,和@after的区别是此通知出异常不执行

2-3.execution表达式

execution用来匹配需要在哪些类的哪些方法上添加通知。

语法解析

那么它的语法是这样⼦的:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-
pattern(param-pattern) throws-pattern?)

符号讲解:

  • ?号代表0或1,可以不写
  • “*”号代表任意类型,0或多
  • ⽅法参数为…表示为可变参数
    参数讲解:
  • modifiers-pattern?【修饰的类型,可以不写】
  • ret-type-pattern【⽅法返回值类型,必写】
  • declaring-type-pattern?【⽅法声明的类型,可以不写】
  • name-pattern(param-pattern)【要匹配的名称,括号⾥⾯是⽅法的参数】
  • throws-pattern?【⽅法抛出的异常类型,可以不写】
2-4.XML实现AOP:
2-4.1.使用四大通知

此处模拟的三层架构中的service层,用一个类TransactionManager来模拟事务。

/**
 * @author young
 * @date 2020/4/18
 * 此处隐藏service的接口。
 */
@Service
public class UserServiceImpl implements IUserService {
    @Override
    public void test() {
        System.out.println("执行方法");
    }
}

模拟事务类:

/**
 * @author young
 * @date 2020/4/18
 *
 *	模拟事务
 */
public class TransactionManager {
    public void begin() {
        System.out.println("开启事务");
    }

    public void commit() {
        System.out.println("提交事务");
    }

    public void rollback() {
        System.out.println("回滚事务");
    }

    public void close() {
        System.out.println("关闭资源");
    }
}


配置文件:

<!--    配置bean-->
    <bean id="manager" class="cn.itsource._07_springaop_xml.TransactionManager"/>
<!--    扫描包-->
    <context:component-scan base-package="cn.itsource._07_springaop_xml.service"/>

    <aop:config>
        <aop:pointcut id="point" expression="execution(* cn.itsource._07_springaop_xml.service.*.*(..))"/>
        <aop:aspect ref="manager">
            <!--前置通知-->
            <aop:before method="begin" pointcut-ref="point"/>
            <!--由于出异常不执行此通知,此通知可以用来做事务提交-->
            <aop:after-returning method="commit" pointcut-ref="point"/>
            <!--异常通知-->
            <aop:after-throwing method="rollback" pointcut-ref="point"/>
            <!--后置置通知-->
            <aop:after method="close" pointcut-ref="point"/>
        </aop:aspect>
    </aop:config>

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cn/itsource/_07_springaop_xml/ApplicationContext.xml")
public class Test07 {
    @Autowired
    private IUserService service;

    @Test
    public void test() throws Exception{
        service.test();
    }
}

运行结果:
在这里插入图片描述

正常运行情况下,异常通知不会执行。

下面将UserServiceImpl类修改为:

@Service
public class UserServiceImpl implements IUserService {
    @Override
    public void test() {
        System.out.println("执行方法");
        int i=1/0;
    }
}

运行结果:

在这里插入图片描述

可以看到,当出了异常的时候,spring会自动调用异常通知。

2-4.2.使用环绕通知

将模拟事务类修改为

/**
 * @author young
 * @date 2020/4/18
 */
public class TransactionManager {
    public void begin() {
        System.out.println("开启事务");
    }

    public void commit() {
        System.out.println("提交事务");
    }

    public void rollback() {
        System.out.println("回滚事务");
    }

    public void close() {
        System.out.println("关闭资源");
    }

    public void around(ProceedingJoinPoint point) {
        try {
        	//开启事务
            this.begin();
            //执行目标方法
            point.proceed();
            //提交事务
            this.commit();
        } catch (Throwable throwable) {
        	//回滚事务
            this.rollback();
        } finally {
        	//关闭资源
            this.close();
        }
    }
}


xml修改为:

<!--    配置bean-->
    <bean id="manager" class="cn.itsource._07_springaop_xml.TransactionManager"/>
<!--    扫描包-->
    <context:component-scan base-package="cn.itsource._07_springaop_xml.service"/>

    <aop:config>
        <aop:pointcut id="point" expression="execution(* cn.itsource._07_springaop_xml.service.*.*(..))"/>
        <aop:aspect ref="manager">
            <aop:around method="around" pointcut-ref="point"/>
        </aop:aspect>
    </aop:config>

正常执行结果:

在这里插入图片描述

异常执行结果:

在这里插入图片描述

可以看到,环绕通知也可以实现相同的效果。

以上基本了解了spring的AOP功能,接下来我们看一下Spring的事务管理

3.事务管理:

3-1。简介:

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

关于事务可以看之前的JPA的文章里面有详细介绍,此处只写Spring事务的用法

3-2.编程式事务与声明式事务:
3-2.1编程式事务
  • ⾃⼰⼿动控制事务,就叫做编程式事务控制。

  • Jdbc代码:Conn.setAutoCommite(false); // 设置⼿动控制事务

  • JPA代码:entityManager.getTransaction().begin()

  • 特点:细粒度的事务控制: 可以对指定的⽅法、指定的⽅法的某⼏⾏添加事务控制(⽐较灵活,但开发起来⽐较繁琐: 每次都要开启、提交、回滚.)

3-2.2声明式事务:
  • 事务控制代码已经由 spring 写好.程序员只需要声明出哪些方法需要进行事务控制和如何进行事务控制.

  • 声明式事务都是针对于 ServiceImpl 类下方法的

  • 事务管理器基于通知(advice)的.

3-3在spring 配置文件中配置声明式事务
3-3.1:声明式事务中属性解释
  • name=”” 哪些方法需要有事务控制

    • 支持*通配符
  • readonly=”boolean” 是否是只读事务.

    • 如果为 true,告诉数据库此事务为只读事务.数据化优化,会对性能有一定提升,所以只要是查询的方法,建议使用此数据.
    • 如果为 false(默认值),事务需要提交的事务.建议新增,删除,修改.
  • propagation 控制事务传播行为.

    • 当一个具有事务控制的方法被另一个有事务控制的方法调用后,需要如何管理事务(新建事务?在事务中执行?把事务挂起?报异常?)
    • REQUIRED (默认值): 如果当前有事务,就在事务中执行,如果当前没有事务,新建一个事务.
    • SUPPORTS:如果当前有事务就在事务中执行,如果当前没有事务,就在非事务状态下执行.
    • MANDATORY:必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务,报错.
    • REQUIRES_NEW:必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,把当前事务挂起.
    • NOT_SUPPORTED:必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起.
    • NEVER:必须在非事务状态下执行,如果当前没有事务,正常执行, 如果当前有事务,报错.
    • NESTED:必须在事务状态下执行.如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务.
  • isolation=”” 事务隔离级别

    在多线程或并发访问下如何保证访问到的数据具有完整性的.

    • DEFAULT: 默认值,由底层数据库自动判断应该使用什么隔离界别
    • READ_UNCOMMITTED: 可以读取未提交数据,可能出现脏读,不重复读,幻读.
      • 效率最高.
    • READ_COMMITTED:只能读取其他事务已提交数据.可以防止脏读,可能出现不可重复读和幻读.
    • REPEATABLE_READ: 读取的数据被添加锁,防止其他事务修改此数据,可以防止不可重复读.脏读,可能出现幻读.
    • SERIALIZABLE: 排队操作,对整个表添加锁.一个事务在操作数据时,另一个事务等待事务操作完成后才能操作这个表.
      • 最安全的
      • 效率最低的.
  • rollback-for=”异常类型全限定路径”

    • 当出现什么异常时需要进行回滚
    • 建议:给定该属性值.
      • 手动抛异常一定要给该属性值.
  • no-rollback-for=””

    • 当出现什么异常时不滚回事务.

此处orm框架为JPA (非SpringDataJpa):

<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">



    <!--扫描包-->
    <context:component-scan base-package="top.young.dao,top.young.service"/>

    <!--导入properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--    配置数据库连接池-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--    配置entityManagerFactory-->
    <bean  id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!--        指定数据库连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--        指定实体类包-->
        <property name="packagesToScan" value="top.young.domain"/>
        <!--        指定实现厂商-->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!--                显示SQL-->
                <property name="showSql" value="true"/>
                <!--                创建表-->
                <property name="generateDdl" value="false"/>
                <!--                配置方言-->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
            </bean>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
<!--    配置声明式事务-->
    <tx:advice id="txManager" transaction-manager="transactionManager">
        <tx:attributes>
<!--            哪些方法需要有事务控制-->
            <tx:method name="save"/>
            <tx:method name="update"/>
            <tx:method name="delete"/>
        </tx:attributes>
    </tx:advice>
<!--    范围直接设置为serviceImpl里面的所有类的所有方法。-->
    <aop:config>
        <aop:pointcut id="myPointcut" expression="execution(* top.young.service.impl.*.*(..))"/>
    </aop:config>

</beans>

3-4使用注解方式配置:
@Transactional(readOnly = true)
public class BaseServiceImpl<T> implements IBaseService<T> {

    @Autowired
    private IBaseDao<T> dao;

    @Transactional(readOnly = false)
    @Override
    public void save(T t) {
        dao.save(t);
    }

    @Override
    @Transactional(readOnly = false)
    public void update(T t) {
        dao.update(t);
    }

    @Override
    @Transactional(readOnly = false)
    public void delete(Long id) {
        dao.delete(id);
    }

    @Override
    public T find(Long id) {
        return dao.find(id);
    }

    @Override
    public List findAll() {
        return dao.findAll();
    }

    @Override
    public Long getTotal() {
        return dao.getTotal();
    }

    @Override
    public PageInfo findByPage(Integer pageNumber, Integer pageSize) {
        PageInfo pageInfo=new PageInfo();
        pageInfo.setTotal(dao.getTotal());
        pageInfo.setRows(dao.findByPage(pageNumber, pageSize));
        pageInfo.setPageNumber(pageNumber);
        pageInfo.setPageSize(pageSize);
        return pageInfo;
    }
}

CTF实战:Wireshark数据包分析从入门到精通(附经典题型解析) 本文详细介绍了Wireshark在CTF比赛中的数据包分析技巧,从基础抓包到高级协议解析,涵盖HTTP流量分析、USB键盘数据还原等实战案例。通过经典题型解析,帮助读者掌握精准过滤、文件提取等核心技能,提升CTF竞赛中的网络流量分析能力。 阅读详情

相关推荐

Dify社区版多工作空间功能解锁:源码修改与多租户架构解析

多租户架构是现代SaaS平台实现数据隔离与资源管理的核心技术,其核心原理是通过租户模型将用户、应用和数据在逻辑上隔离。在AI应用开发平台中,这种架构能有效支持多团队、多项目并行开发,确保不同业务线的数据安全与独立迭代。Dify作为开源AI应用构建平台,其底层已设计完善的多租户模型,但社区版默认限制了单用户单工作空间。本文通过精准修改两处关键代码——账户初始化逻辑与系统功能开关,释放了平台固有的多工作空间管理能力。该方案无需改动数据库结构,直接利用现有RBAC权限体系,实现了类似企业版的**多租户隔离**体验

weixin_27059669的博客 1055

Spring知识点总结 Spring基础到深入(持续更新)

Spring知识点总结【非常丰富】基础到深入

Code_Guan的博客 7240

开源代码分享(29)-基于拉丁超立方抽样的风光场景生成和削减

作为分层抽样方法的一 种,拉丁超立方抽样具有良好的抽样精度和效率[14]。本文使用多场景方法来描述可再生能源(风电、光伏)的不确定性。以风电功率为例,首先假定风电功率服从正态分布 N(μ, δ 2 ),μ 为预测值的期望值,δ 为其波动的百分比。接着,采用拉丁超立方抽样[21]生成大量服从概率分布约束的风电出力场景,并采用考虑 Kantorovich 距离[22]的场景削减技术处理该场景,进行场景削减。最后,导出具有相应概率的削减之后的场景。

配电网和matlab的博客 921

Spring相关知识点(全集)

1Spring概述 1.1Spring概述 1.spring是一个开源框架。 2.spring为简化企业级开发而生,使用spring,Javabean就可以实现很多以前要考EJB才能实现的功能。同样的功能,在EJB中要通过繁琐的配置和复杂的代码才能实现,而在spring中去表现的优雅和简介。 3.spring是一个IOC(DI)和AOP容器框架。 4.spring的优良特性 非侵入式:基于spring开发的应用中的对象可以不依赖与spring的API 依赖注入:DI--Dependency I

qq_54746841的博客 2199

STM32F407ZGT6开发板跑马灯实战:从原理图到烧录全流程(附FlyMcu配置)

本文以正点原子F4探索者开发板(STM32F407ZGT6)为例,手把手指导完成跑马灯实验。内容涵盖从原理图解读、GPIO驱动逻辑分析、HAL库工程搭建,到代码编写与FlyMcu串口烧录配置的全流程,帮助嵌入式开发新手快速实现第一个LED控制程序,打通软硬件开发链路。

weixin_29183637的博客 223

一篇把 Transport 做到可复制的实战指南:从 CTS 底层表到 LSMW、Variant、Layout、TABU、Query、SAPscript 全对象搬运

本文深入解析SAP系统中的Transport机制,将其视为可审计、可追溯的变更流水线。文章从CTS/Transport Organizer通用方法论和具体对象搬运手法两个层面展开,详细介绍了LSMW项目、程序Variant、屏幕/ALV Layout、表数据、ABAP Query、SAPscript和SO10标准文本等对象的传输策略。通过真实案例说明,代码对象往往能被正确传输,但"运行体验"和"业务配置"却常被遗漏,导致QAS测试正常而PRD环境异常。文章提供了一套可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 168

Spring的重点知识

spring是java应用程序开发的框架,使用此框架可以创建性能更好、易于测试、可重用的代码* Spring是一个开源的java平台* spring是轻量级的框架* spring框架的核心特性是可以用于开发任何java应用程序,但是在java EE平台上构建web应用程序是需要扩展的数据库事务就是一种SQL语句执行的缓存机制,不会单条执行完毕就更新数据库数据,最终根据缓存内的多条语句执行结果统一判定。* 一个数据库内所有语句成功,可以触发commit提交事务来结束事务,更新数据。

ggggggzzzzz的博客 1352

Spring知识点整理

spring知识点整理

weixin_37895026的博客 3689

部分旧版统信国产系统下载资源

注:全部自来网络查找,建议到官网下载最新版。

aggs1990的专栏 5223

《民机适航入门指南:从法规学习到项目实践的全面解析》

适航(Airworthiness)是指航空器、其发动机、螺旋桨和其他部件在规定条件下,能够安全飞行并满足有关航空法规规定的条件。简而言之,适航代表了航空器在任何时候都能安全运营的状态。适航在民用航空领域尤为关键,因为飞机必须经过严格的适航认证才能投入商用。这些认证的目标是确保飞机能够在广泛的运行条件下保持飞行安全,从而保护乘客、机组和地面人员的生命财产安全。适航法规覆盖了飞机的整个生命周期,包括设计、制造、测试、运营、维护和报废。

qq_41854911的博客 992

Spring知识点梳理

AOP切面编程:类似于一种拦截器,像一把刀一样选择一个方法为切入点,在这个方法执行的前后可以设置前置通知、后置通知、异常通知等,这些通知可以是对业务进行判断、日志记录、事务回滚等操作。CGLIB 就是第三方 Jar 包,它的作用是在程序运行时,动态生成新的 Java 类(目标类的子类),从而实现代理功能(比如在不修改原有代码的情况下,给某个类的方法增加额外逻辑,如日志、事务、权限控制等)。</</</</Bean就是Spring框架帮忙创建和管理的“对象镜像”、“clazz对象”,即代理对象;

410的博客 1438

YOLO + SubspaceAD:一张良品图,检出所有未知缺陷

当YOLO遇上子空间建模,工业质检正迎来从“见多识广”到“举一反三”的质变时刻。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 494

Spring知识点总结和归纳

什么是Spring? Spring是一个轻量级的开源框架,其采用的四种关键策略如下: 1.基于POJO的轻量级和最小倾入型编程 很多框架通过强迫应用继承它们的类或实现它们的接口从而导致应用与框架绑死(例如早期的EJB与早期版本的Struts、WebWork、Tapestry以及无数其他的Java规范和框架)。Spring竭力避免因自身的API而弄乱你的应用代码,Spring不会强迫你实现Spring规范的接口或继承Spring规范的类,相反,在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了

m0_46741750的博客 244

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

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring Security知识点归纳一

Spring Security:一个身份验证和访问控制框架。 简介: 基于Java EE的企业软件应用程序提供全面的安全服务。特别强调支持使用Spring Framework构建的项目。 最小的Spring Security的maven依赖: <dependency> <groupId>org.springframework.security</groupId&g...

qq_31883241的博客 475

STM32F407中文手册

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

Spring MVC 知识点归纳

1、Spring Controller方法返回值类型 1)、返回String类型 @RequestMapping("/returnString") public String returnString(){ //返回/WEB-INF/jsp/returnDemo/returnString.jsp页面 return "returnDemo/returnString"; } 2)、返回ModelAndView类型(可以携带参数) @RequestMapping("/returnModelAndView")

weixin_43741599的博客 281

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

学习Spring springmvc hibernate Struts遇到的一些知识点归纳

1.    谈一下MVC设计模式        Model(模型):数据模型,提供要展示的数据,包含数据和行为,可以认为是领域模型或者是JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据)和服务层(行为),也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。        View(视图):负责进行模型的展示,一般就是我们见到的用...

康小铭的博客 297

基于Spring AOP实现的声明式事务管理的知识点归纳

基于Spring AOP实现的声明式事务管理的知识点归纳 Spring 事务管理机制的实现原理 Spring学习之Spring AOP的底层实现技术

rogerlin0330的博客 319

springMVC常用知识点归纳(web.xml/spring-mvc.xml)

一、引入依赖 二、xml配置 1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLoca...

不止于代码 255

CYBER-VISION零号协议快速处理Java八股文:核心知识点归纳与记忆助手

本文介绍了如何利用星图GPU平台,一键自动化部署⚡ CYBER-VISION: 零号协议镜像,以高效复习Java面试知识。该AI助手能自动归纳JVM、多线程等核心知识点体系,生成结构化复习卡片,并进行模拟问答练习,帮助开发者快速构建个人化的面试复习方案。

weixin_30598047的博客 404

java开发简介知识点归纳思维导图_45k以上突击面试必备,redis+mysql+并发+spring+算法+导图等...

今天小编给大家带来的一篇关于Java面试相关的电子文档资源,介绍了关于Java、面试题方面的内容,本书是由Java官网出版,格式为DOC,资源大小62.5 MB,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.7。内容介绍《2020Java面试题整理》面试题含有redis,netty,mysql,kafka,并发编程,spring,dubbo,算法,以及思维导图学习笔记,适合20k以上突击。本...

weixin_33067503的博客 211

Java架构师独家面试题,归纳总结市面上的所有的Java面试题

为了能让大家有更好的面试资料去面试大厂的技术岗位,花费了2个多月的时间,把市面上的所有的Java面试题,做了一个归纳总结,整理了快200多页,够大家刷题好久了!好了,由于太多,暂时列举部分截图。史上最全的Java面试题独家整理。Java Spring面试题。Spring Boot试题题。SpringCloud30题。SpringBoot41题。SpringAOP16题。Java多线程面试题。最全Redis50题。Mybatis28题。

jj1245_的博客 1068

Java开发才不到3年,来面试开口要25K,面完连10K都不想给

我的好朋友兼大学同学老左家庭经济情况不错,毕业之后没两年自己存了点钱加上家里的支持,自己在杭州开了一家网络公司。由于公司不是很大所以公司大部分的开发人员都是自己面试的,近期公司发展的不错,打算扩招也面试了不少人。

javaAnPou的博客 1万+

阿里架构师整合出258W字Java全栈面试题,耗时一年,简直是堪称神迹!

这个是大概的目录内容这份Java高级全栈的面试题内容很多,面试题(含答案)的质量肯定是一点问题都没有的,但就是有一个很大的缺点,就是内容太多了!!!老师十分想给大家全部截图展示出来,奈何文章篇幅有限制,而且单一的截图方式也会让大家审美疲劳!所以呢,今天老师想换个方式为大家展示,老师花了一周的时间,基本上每道面试题的都刷了,根据各个模块的内容进行归纳整合出了大纲的的样式!什么意思呢?...

m0_73256420的博客 204

java面试题大概有哪些?史上最全的Java面试题独家整理

为了能让大家有更好的面试资料去面试大厂的技术岗位,花费了2个多月的时间,把市面上的所有的Java面试题,做了一个归纳总结,整理了快200多页,够大家刷题好久了

javaAnPou的博客 541

Spring归纳小结

比如,采用注解方式的话,就更加简单了,先在XML中开启AOP(),然后在增强方法上直接使用类似@Before(value=“execution(具体的表达式)”)即可;交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。)提供了不同的事务实现类。

m0_54828003的博客 190
上一篇: Velocity及基于Velocity的代码生成器
下一篇: 软件测试-mocha入门
Cola_可乐
博客等级 码龄8年 6粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值