首页
留言板
友链
关于
Search
1
内测“合金弹头”嘿嘿
1,053 阅读
2
Nginx搭建一个简易的图床
1,012 阅读
3
Kettle循环遍历结果集作为参数传入转换
935 阅读
4
Maven3.3.9的安装与配置
504 阅读
5
Maven打包插件与idea
469 阅读
知识库
好奇猫
日常说
笔记本
登录
/
注册
Search
标签搜索
maven
Spring
vue
Java
Java代码
前端
idea
帆软
MySQL
git
CSS
游戏
Bootstrap
生活
网上冲浪
邮件配置
说说
Nginx
Excel
数据库调优
龙流
累计撰写
61
篇文章
累计收到
18
条评论
首页
栏目
知识库
好奇猫
日常说
笔记本
页面
留言板
友链
关于
搜索到
4
篇与
Spring
的结果
2022-09-22
Spring与Junit整合编写测试类
相关依赖<!-- Spring测试相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-fest</artifactId> <version>5.3.1</version> </dependency> <!--junit测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1</version> </dependency>大概思路Spring框架集成的测试环境,不在需要去获取IOC容器,再通过ioc容器获取容器中的组件,然后再使用组件;通过Spring集成的junit,直接使用依赖注入,注入所需要的组件创建测试类//指定当前测试类在Spring的测试环境中执行,此时就可以通过注入的形式直接获取IOC容器中的bean @RunWith(SpringJunit4ClassRunner.class) //设置Spring测试环境的配置文件 @ContextConfiguration(class:spring*.xml) public class Test01(){ @Autowired private Xxx xxx; @Test public void TestMethod(){ xxx.method(); } }
2022年09月22日
96 阅读
0 评论
0 点赞
2022-08-23
Spring框架知识点(最基础的实现)
Spring的优点性能好、易于测试、代码可重用高。Spring,是轻量级的框架,其基础版本只有2MB左右的大小。Spring框架的核心特性是可以用于开发任何Java应用程序,但是在JavaEE 平台上构建web应用程序是需要扩展的。Spring框架的目标是使J2EE开发变得更容易使用,通过启用基于POJO编程模型来促进良好的编程实践。思想:例如在jdbc中实现事务控制,无法实现代码的封装,因为使用jdbc控制事务是面向对象的思想,操作事务的提交、事务的回滚是分布在业务执行过程不同条件下的;而Sping的声明式事务是基于AOP面向切面的编程思想,Spring FrameworkSpring基础框架,可以视为Spring基础设施,基本上任何其他Spring项目都是以Spring Framework为基础的。Spring Framework特性·非侵入式: 使用Spring Framework开发应用程序时,Spring对应用程序本身的结构影响非常小。对领域模型可以做到零污染; 对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将组件结构进一步简化。 这就使得基于Spring Framework开发应用程序时结构清晰、简洁优雅。 ·控制反转IOC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。 ·面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。 ·容器: Spring IOC是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。 ·组件化: Spring实现了使用简单的组件配置组合成一个复杂的应用。在Spring中可以使用XML和Java注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。 ·声明式: 很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。 ·一站式: 在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且Spring旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在Spring Framework的基础上全部使用Spring,来实现。获取IOC,通过IOC获取管理的对象案例假如新建一个空项目 -> 要实现案例目标,获取IOC容器中的对象 -> 最基础的实现方式,用配置文件的方式,所以要新建配置文件,在resource目录下右键新建xml,如果idea右键菜单栏中没有Spring配置的xml可选项,是因为pom中还未引入spring-context的Dependency导入maven坐标如下:spring-context 5.2.10.RELEASE稳定版<dependencies> < !--基于Maven依赖传递性,导入spring-context依赖即可导入 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency> <!--junit测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </ dependencies>1、首先配置对象到IOC容器中,有xml和注解两种方式xml: 在Spring的xml配置文件,名字约定俗成叫applicationContext.xml,在配置文件中使用bean标签,配置id属性、class属性<bean id="xxxx" class="全类名"></bean>注解:@Component @Controller @Service @Repository @RestControler更多详细2、测试用例public class HelloWorld(){ public void sayHello(){ System.out.println("hello world!"); } }@Test public void test(){ //获取IoC容器 ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取IoC容器中的bean HelloWorld helloworld = (HelloWorld)ioc.getBean("helloworld"); helloworld.sayHello();Spring获取bean的三种方式1、通过name获取 2、通过class type获取 3、同时通过name和type获取 如果组件类实现了接口,根据接口类型可以获取bean吗? 可以,前提是bean唯一 如果一个接口有多个实现类,这些实现类都配置了bean,根据接口类型可以获取bean吗? 不行,因为bean不唯—依赖注入之setter注入如我们将对象注入Spring容器中时,可以通过对象属性的getter()为属性设置属性值如实际配置如下:可以为Student类中的属性设置属性值<bean id="studentTwo" class="com.hlongliu.spring.pojo.Student"> <property name="sid" value="1001"></property> <property name="sname" value="张三"></property> <property name="age" value="23"></property> <property name="gender" value="男"></property> </bean>依赖注入之构造器注入如 实际配置如下:<bean id="studentThree" class="com.hlongliu.spring.pojo.Student"> <constructor-arg value="1002"></constructor-arg> <constructor-arg value="李四"></constructor-arg> <constructor-arg value="24"></constructor-arg> <constructor-arg value="女" name="gender"></constructor-arg> </bean>代理模式场景public class CalculatorImpl implements calculator { @Override public int add(int i, int j){ System.out.println(日志,方法: add,参数:"+i+","+j); int result = i + j; System.out.println("方法内部,result: "+result); system.out.println("日志,方法:add,结果:"+result); return result; } @Override public int sub(int i, int j) { System.out.println("日志,方法: sub,参数:"+i+","+j); int result - i - j; System.out.println("方法内部,result: "+result); system.out.println("日志,方法:sub,结果:"+result); return result; } }①现有代码缺陷针对带日志功能的实现类,我们发现有如下缺陷:·对核心业务功能有干扰,导致程序员在开发核心业务功能时分散了精力·附加功能分散在各个业务功能方法中,不利于统一维护②解决思路解决这两个问题,核心就是:解耦。我们需要把附加功能从业务功能代码中抽取出来。③困难解决问题的困难:要抽取的代码在方法内部,靠以前把子类中的重复代码抽取到父类的方式没法解决。所以需要引入新的技术。代理模式概念:二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来一一解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。静态代理创建静态代理类public class CalculatorStaticProxy implements Calculator { //将被代理的目标对象声明为成员变量 private Calculator target; public CalculatorStaticProxy(Calculator target) { this.target = target; } @Override public int add(int i, int j){ //附加功能由代理类中的代理方法来实现 System.out.println("[日志] add 方法开始了,参数是:" +i + ","+ j); //通过目标对象来实现核心业务逻辑 int addResult = target.add(i,j); System.out.println(" [日志] add方法结束了,结果是: " + addResult); return addResult; } }静态代理确实实现了解耦,但是由于代码都写死了,完全不具备任何的灵活性。就拿日志功能来说,将来其他地方也需要附加日志,那还得再声明更多个静态代理类,那就产生了大星重复的代码,日志功能还是分散的,没有统一管理。提出进一步的需求:将日志功能集中到一个代理类中,将来有任何日志需求,都通过这一个代理类来实现。这就需要使用动态代理技术了。动态代理动态代理有两种:1、jdk动态代理,要求必须有接口,最终生成的代理类和目标类实现相同的接口在com.sun.proxy包下,类名为$proxy22、cglib动态代理,最终生成的代理类会继承目标类,并且和目标类在相同的包下/** *目标类接口 */ public interface Calculator{ int add(int i, int j); int sub(int i, int j); } /** *目标类 */ public class CalculatorImpl implments Calculator { @Override public int add(int i, int j){ return i+j; } @Override public int sub(int i, int j){ return i-j; } } /** 动态代理核心 *生产代理对象 */ public class GenerateProxy(){ private Object target; public GenerateProxy(Object target){ this.target = target; } public Object getProxy(){ /** *newProxyInstance():创建一个代理实例 *共有三个参数 * ClassLoad 类加载器 Class<?>[] 目标对象 */ ClassLoad classLoad = this.getClass().getClassLoad(); Class<?>[] interfaces = target.getClass().getInterface(); InvocationHandler h = new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //proxy代表代理对象,method代表要执行的方法,args代表执行方法的参数 Object result = method.invoke(target,args); return result; } } return Proxy.newProxyInstance(classLoad,interfaces,h); } } /** *测试 */ public class ProxyTest{ @Test public void testProxy(){ GenerateProxy generateProxy = new GenerateProxy(new CalculatorImpl()); Calculator proxy = (Calculator)generateProxy.getProxy(); proxy.add(1,2); } } 使用Maven快速创建基础Java项目,不选择骨架设置项目基本信息生成webapp资源路径设置配置web项目配置文件web.xmlweb.xml内容<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- 加载spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>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" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 包扫描 --> <context:component-scan base-package="com.dldata.home.service.impl,com.dldata.home.dao"/> <!-- 导入数据库配置文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据库 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <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> <!-- 创建session工厂--> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <!-- 告诉spring mybatis接口位置--> <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.dldata.home.dao"/> </bean> <!-- 事务管理--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> </beans>
2022年08月23日
88 阅读
0 评论
0 点赞
2022-08-10
将对象交由Spring管理
Spring框架的两大主要功能:IOC容器、AOP面向切面编程。在spring里采用注解方式@Service、@Component这些,实际上管理的是类,把这些类交给spring来负责实例化。把对象交给spring管理,举个例子:最常见的在配置文件里定义一个bean,或者JavaConfig的方式就是在@Configure标签 标注的类里的 @Bean对象。这些Bean已经new出来了。这些对象往往是与业务无关的基础组件。比如datasource的bean、redis连接池的bean。个数是有限的。方法一:XML配置bean经典配置场景就是在xml配置文件中配置数据库和数据库连接池配置<bean ...> </beam>方法二:Spring Boot中常用@Bean注解本质和XML配置方法相同。所有用XML配置文件的方法都可以用这个方法改写。@Bean 作业在方法上 //此处返回的是一个Spring的配置Bean,与xml的等价方法三:BeanFacoty registerSingleton这时候大家是否会有个疑问,XML配置Bean是传统的spring mvc里常用的将对象交给spring来管理的方法,@Bean是spring boot里将对象交给spring来管理的方法。那为什么还要有这个先实现BeanFactoryPostProcessor的方法呢?因为这种方法可以用来做这件事情,但是不仅仅可以做这件事情。它神通广大,不仅可以将一个对象交给spring管理,还可以将已经交给spring管理的对象拿出来进行修改,还有其他各种的spring初始化的干预都可以做。所以用它来仅仅注册一个Bean有点杀鸡用牛刀的味道。详细文档参考如下关于@Component与@Controller、@Service、Repository后三个注解他们的作用和属性与Component是一模一样,负责把类交给spring,让spring来负责实例化@Controller:一般用在表现层@Service:一般用在业务层@Repository:一般用在持久层属性value的值,用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母为小写用于注入的注解 @Autowired:作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功@Qualifier:作用:在按照类型注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以(为什么?)@Resource:作用:直接按照bean的id注入。它可以独立使用用于改变作用范围的 @Scope:作用:用于指定bean的作用范围属性value:指定范围的取值。常用取值:singleton prototype在Spring框架中遇到的错误记录
2022年08月10日
232 阅读
0 评论
0 点赞
2022-04-07
Spring集成web环境 SpringMVC
Spring提供获取应用上下文的工具1、分析: Spring提供了一个监听器ContextLoaderListener,上面的分析不用手动实现,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中。 Spring提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。2、使用: 我们需要做两件事①在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标)②使用WebApplicationContextUtils获得应用上下文对象ApplicationContext3、实例:<!--导入spring-web坐标--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.5.RELEASE</version> </dependency>配置web.xml<!--全局初始化参数--> <context-param> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--配置监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</1istener-class> </listener>配置算是完成了开始使用:ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); Object obj = applicationContext.getBean ("id"); SpringMVC 统一管理处理Servlet1、分析: SpringMVC通过DispatcherServlet全局的Servlet称之为前端控制器,根据请求资源地址然后映射到具体的Controller。 视图和模型(ModelAndView),每个Controller中的每个方法根据需求进行返回,可以只返回文字信息,可以返回视图模型信息。①用户发送请求至前端控制器DispatcherServlet。②DispatcherServlet收到请求调用HandlerMapping处理器映射器。③处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。④DispatcherServlet调用HandlerAdapter处理器适配器。⑤HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。⑥Controller执行完成返回ModelAndView。⑦HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。⑧DispatcherServlet将ModelAndView传给ViewReslover视图解析器。⑨ViewReslover解析后返回具体View。⑩DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户。2、使用:①导入SpringMVC相关坐标②web.xml配置SpringMVC核心控制器DispathcerServlet③配置SpringMVC核心文件 spring-mvc.xml④创建Controller类和视图页面⑤使用注解配置Controller类中业务方法的映射地址⑥客户端发起请求测试关于content-type类型Content-Type(内容类型)一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。该字符串通常被格式化为类型/子类型,其中类型是常规内容范畴而子类为特定内容类型。有关支持内容类型的完整列表,请参阅 Web 浏览器文档或当前的 HTTP 规格说明。ContentType属性指定响应的 HTTP内容类型。如果未指定 ContentType,默认为TEXT/HTML。SpringMVC的视图控制器在请求只需要跳转页面时,可以在配置文件中(spring mvc配置文件中)只需要通过一个标签配置,即可处理请求路径映射地址,不必在编写Controller处理方法配置标签如下:<!-- 若设置视图控制器,则只有视图控制器所设置的请求会被处理,其他的请求将全部404 此时必须在配置一个标签:<mvc:annotation-driven/> 开启mvc的注解驱动 --> <mvc:annotation-driven/> <mvc:view-controller path="/" view-name="index"></mvc:view-controller> <!--请求根路径/时,直接跳转的index页面-->
2022年04月07日
87 阅读
0 评论
0 点赞