框架学习笔记——Spring

2023-11-13

Spring

文章目录


1、Spring简介

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的开源容器框架
参考文档
中文文档

1.1 框架的主要特征

(1)轻量——完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

(2)控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。它的底层设计模式采用了工厂模式,所有的 Bean 都需要注册到Bean工厂中,将其初始化和生命周期的监控交由工厂实现管理。

(3)面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发

(4)容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。

1.2 Spring的主要特点

1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

1.3 组成

在这里插入图片描述
在这里插入图片描述

2、Spring之控制反转(IOC)


软件系统中耦合的对象

IOC解耦过程

2.1 百科

(1)控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低耦合度。

(2)最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。

(3)通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

2.2 两种方式

(1) 依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。
这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回
调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。

(2) 依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责
的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通
过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构
造函数参数传入的做法称为构造器注入(Constructor Injection)

2.3 依赖注入(推导)

2.3.1 新建一个User接口

public interface UserMapper {
    public void test();
}

2.3.2 新建一个User接口实现类

public class UserMapperImpl implements UserMapper {
    @Override
    public void test() {
        System.out.println("I am superman!");
    }
}

2.3.3 新建一个User业务接口

public interface UserService {
    public void test();
}

2.3.4新建一个User业务接口实现类

public class UserServiceImpl implements UserService {
	//创建一个User接口
    UserMapper userMapper;

	//通过set方法将User实例注入
    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

	//也可以通过构造器注入	
//    public UserServiceImpl(UserMapper userMapper) {
//        this.userMapper = userMapper;
//    }

    @Override
    public void test() {
        userMapper.test();
    }
}

2.3.5 测试

public class MyTest {
    public static void main(String[] args) {
        //将User实例注入
        //构造器注入
        //UserService userService = new UserServiceImpl(new UserMapperImpl());
        
        //set方法注入
        UserService userService = new UserServiceImpl();
        ((UserServiceImpl)userService).setUserMapper(new UserMapperImpl02());//接口不能使用实现类中特有的方法
        
        userService.test();
    }
}

2.4 IOC创建对象方式

2.4.1 创建一个测试类

public class User {
    private String name;
    public User(){
        System.out.println("无参构造器被调用!");
    }
    public User(String name){
        this.name = name;
    }
    public void test(){
        System.out.println(name);
    }
}

2.4.2 编写一个配置文件

applicationContext.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

2.4.3 将对象配置到applicationContext.xml中

  1. 通过无参构造器创建对象。
//这句话相当于  User user = new User;  id的值相当于对象名 class是对象的类型的全限定名(包名+类名)
<bean id="user" class="com.xlj.pojo.User"/>
  • 测试
   @Test
   public void test01(){
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       //getBean("xxx") 就是获取一个对象。括号内传入对象名也就是bean的id
       //这里可以显示设定对象类型 User user = context.getBean("user",User.class);
       User user = (User) context.getBean("user");//输出无参构造器被调用
   }
  1. 通过有参构造器创建对象
	//通过类型创建
    <bean id="u1" class="com.xlj.pojo.User">
        <constructor-arg type="java.lang.String" value="王老一"/>
    </bean>
    //通过参数名创建
    <bean id="u2" class="com.xlj.pojo.User">
        <constructor-arg name="name" value="王老二"/>
    </bean>
    //通过参数下标创建
    <bean id="u3" class="com.xlj.pojo.User">
        <constructor-arg index="0" value="王老三"/>
    </bean>
  • 测试
public void test02(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User u1 = context.getBean("u1", User.class);
        User u2 = context.getBean("u2", User.class);
        User u3 = context.getBean("u3", User.class);
        u1.test();//王老一
        u2.test();//王老二
        u3.test();//王老三
    }

2.5 Spring依赖注入(Dependency Injection,DI)

2.5.1 构造器注入(上面我们已经写过)

2.5.2 Setter 注入

要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .

bean | ref | idref | list | set | map | props | value | null

  • 常量注入
 //常量注入
 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
 </bean>
  • Bean注入
<bean id="addr" class="com.kuang.pojo.Address">
     <property name="address" value="重庆"/>
 </bean>
 
 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
     <!--此处的值是一个引用,用ref-->
     <property name="address" ref="addr"/>
 </bean>
  • 数组注入
<bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
     <property name="address" ref="addr"/>
     <property name="books">
         <array>
             <value>西游记</value>
             <value>红楼梦</value>
             <value>水浒传</value>
         </array>
     </property>
 </bean>
  • List注入
<property name="hobbys">
     <list>
         <value>听歌</value>
         <value>看电影</value>
         <value>爬山</value>
     </list>
 </property>
  • Map注入
<property name="card">
     <map>
         <entry key="中国邮政" value="456456456465456"/>
         <entry key="建设" value="1456682255511"/>
     </map>
 </property>
  • Set注入
<property name="games">
     <set>
         <value>LOL</value>
         <value>BOB</value>
         <value>COC</value>
     </set>
 </property>
  • null注入
<property name="wife"><null/></property>
  • Properties注入
<property name="info">
     <props>
         <prop key="学号">20190604</prop>
         <prop key="性别"></prop>
         <prop key="姓名">小明</prop>
     </props>
 </property

2.5.3 命名空间注入

  • P命名空间注入
<!--导入约束 : xmlns:p="http://www.springframework.org/schema/p"-->

 <!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
 <bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>
  • C命名空间注入
<!--导入约束 : xmlns:c="http://www.springframework.org/schema/c"-->

 <!--C(构造: Constructor)命名空间 , 实际是通过构造器注入-->
 <bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>

2.6 Bean的作用域

在这里插入图片描述

3、自动装配Bean

autowire属性

通过bean标签中的autowire属性,可以实现自动装配,底层也是通过set方法。

  • byName
    byName,查找类(User)中所有的set方法名(setDog),获得除去set后首字母小写的字符串(dog),然后在spring容器中匹配是否有一样id的bean。如果有,则将dog对象取出装配到user中。
    <bean id="dog" class="com.xlj.pojo.Dog"/>
    <bean id="cat" class="com.xlj.pojo.Cat"/>
    <bean id="user" class="com.xlj.pojo.User" autowire="byName">
        <property name="name" value="老王"/>
    </bean>
  • byType
    byType,按照类型自动装配。需要保证容器中同一类型唯一。
    <bean id="dog" class="com.xlj.pojo.Dog"/>
    <bean id="cat" class="com.xlj.pojo.Cat"/>
    <bean id="user" class="com.xlj.pojo.User" autowire="byType">
        <property name="name" value="老王"/>
    </bean>

使用注解

jdk1.5开始支持注解,spring2.5开始全面支持注解。

  1. 需要导入spring-aop包
  2. 需要在spring配置文件applicationContext.xml中引入context文件头
   http://www.springframework.org/schema/context 
   https://www.springframework.org/schema/context/spring-context.xsd
  1. 在applicationContext.xml中开启属性注解支持
<context:annotation-config/>
  1. 在需要装配的字段或者set方法上写一个@Autowired注解
    @Autowired是按类型自动装配的,可以不需要set方法。
    @Autowired(required=false) 说明:false,对象可以为null;true,对象必须存对象,不能为null。
public class User {
    private String name;
    @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    }
  1. 此时applicationContext.xml中只需要注册bean即可
<bean id="dog" class="com.xlj.pojo.Dog"/>
<bean id="cat" class="com.xlj.pojo.Cat"/>
<bean id="user" class="com.xlj.pojo.User" autowire="byType"/>

@Qualifier

@Qualifier注解是和@Autowired注解配合使用,加上@Qualifier注解后,可以让@Autowired注解通过byName的方式自动装配属性。

public class User {
    private String name;
    @Autowired
    @Qualifier("cat1")
    private Cat cat;
    @Autowired
    @Qualifier("dog1")
    private Dog dog;
    }

@Resource

  1. @Resource 默认是以变量属性名来匹配bean的id,如果指定了name属性,则是以定义的name属性来匹配。如果都没有匹配到,则通过byType的方式装配(只能有一个同类型的对象,且不能bean的id)
public class User {
    private String name;
    @Resource
    private Cat cat;
    @Resource(name = "dog2")
    private Dog dog;
    }
  1. @Resource的装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

小结 @Autowired 和 @Resource 的区别

  • 共同点
    二者都可以写在字段和setter方法上。两者如果都写在字段上,那么就可以不需要再写setter方法。
  • 不同点
    @Autowired
1.是为Spring提供给的注解,需要导入spring-aop包。
2.按照byType的方式装配依赖对象。默认情况下依赖对象不能为null,如果允许为null值,可以设置rqeuired属性为false。
3.如果想通过byName的方式装配对象,可以搭配@Qualifier注解一起使用。

@Resource

1.是J2EE提供的,需要导入javax.annotation.Resouce包
2.默认是按照byName的方式装配依赖对象。
3.@Resource有两个重要的属性:name 和 type;如果设置了name值,则是按照byName的方式自动注入;如果设置了type的值,则是按照byType的方式自动注入;如果都没有设置,将通过反射机制使用byName的方式自动注入。

4、使用注解注册bean

之前我们都是通过bean标签来注册bean,但实际开发中都是通过注解来注册的。

Bean的实现

  • 导入依赖和context约束

上面我们已经完成了导入了注解需要的依赖和引入context约束

  • 配置扫描包下的注解
    applicationContext.xml
<!--组件扫描-->
<context:component-scan base-package="com.xlj.pojo"/>
  • 在指定的包下编写类,增加注解
package com.xlj.pojo;

import org.springframework.stereotype.Component;

//相当于在配置文件中配置<bean id=user(类名首字母小写) class=com.xlj.pojo.User>
//可通过@Component的value属性自定义bean的id
@Component
public class User {
    public String str = "222";
}
@Test
    public void test04(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //bean的id默认是类名的首字母小写
        User user = context.getBean("user", User.class);
        System.out.println(user.str);//222
    }

属性注入

使用@value注解注入

  1. 在属性字段上面使用@value,这样可以不需要写setter方法
@Component(value = "User")
public class User {
    @Value("该笔")
    private String name;
}
  1. 在setter方法上使用@value
@Component(value = "User")
public class User {
    private String name;
    
    @Value("该笔")
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}
  1. 引用类型注入同样是使用@Autowired 和 @Resource注解

衍生注解

  • @Component: 定义Bean, 不好归类时使用.
  • @Repository: 定义dao层Bean
  • @Service: 定义service层Bean
  • @Controller: 定义controller层Bean

上面四个注解的作用都是定义Bean

5、动态代理

5.1 动态代理的两种方式

JDK动态代理:
利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

CGLIB动态代理:
利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

区别:
JDK动态代理只能对实现了接口的类生成代理,而不能针对类。
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。

5.2 JDK动态代理

5.2.1 动态代理类

Java动态代理类位于Java.lang.reflect包下
一般主要涉及到以下两个类:接口InvocationHandler 和 类Proxy(该类即为动态代理类)

5.2.2 接口InvocationHandler

	InvocationHandler 是代理实例的调用处理程序 实现的接口。
	每个代理实例都具有一个关联的调用处理程序。
	对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。

5.2.3 类Proxy(动态代理类)

	Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。 

	创建某一接口 Foo 的代理:      
     Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { Foo.class },
                                          handler);

5.3 动态代理实现

5.3.1 创建一个接口

public interface Actor {
	public void acting();
}

5.3.2 创建一个Actor实现类

public Class ActorImpl implements Actor {
	@Override
	public void acting() {
		System.out.println("出演大明风华");
	}
}

5.3.3 创建一个生成代理类

public Class Agent implements InvocationHandler {
	//被代理的接口
    private Actor actor;

    //可以通过有参构造或者set方法注入被代理的类
    public void setActor(Actor actor) {
        this.actor = actor;
    }

    /**
     * 在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。 
     * @param proxy 调用该方法的代理实例
     * @param method 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
     * @param args 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    	singAContract();//代理实例执行代理方法
        return method.invoke(actor,args);//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
    }
	
	//获取代理类的方法封装
    public Object getAgent() {
        return Proxy.newProxyInstance
                (this.getClass().getClassLoader(),
                        actor.getClass().getInterfaces(),
                        this);
    }
	
	//代理类特有方法
	public void singAContract() {
		System.out.println("签约!");
	}

}

5.3.4 测试

public void main(String[] args) {
	Actor actor = new ActorImpl();
	Agent agent = new Agent();
	agent.setActor(actor);
	Actor actorImpl = (Actor) agent.getAgent();
	actorImpl.acting();
}
//输出 : 出演大明风华

6、Spring之面向切面(AOP)

6.1 什么是AOP?

百科

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。
  • 在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程。
  • 切面:简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
  • AOP 底层:动态代理。如果是接口采用 JDK 动态代理,如果是类则采用CGLIB 方式实现动态代理。

6.2 AOP相关名词解释

  • Aspect(切面):横切关注点 被模块化 的特殊对象。可以看作是一个类。
  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
  • Target(目标对象):织入 Advice 的目标对象.。
  • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程。

在这里插入图片描述

6.3 Spring实现AOP

通过Advice实现

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

框架学习笔记——Spring 的相关文章

随机推荐

  • LeetCode:动态规划中的0-1背包问题【快来直接套模板啦】

    PS 0 1背包问题无疑是动态规划题目里面的非常经典的一类题目了 下面给出这类题目的一种解题模板 本文是参考代码随想录做的一些笔记 完整版本请戳链接 标准0 1背包问题 二维数组求解 标准的背包问题 有n件物品和一个最多能背重量为w的背包
  • 106 letcode - 重建二叉树

    class Solution 内存条里 有两个区域 堆和栈 其中 栈是我们函数跳转的关键 顺序是先进后出 通过压栈出栈 可以实现递归 1 当到达递归终止条件时候 则开始返回 例如 先序遍历二叉树中 每个节点都要执行三个操作 根 左 右 当对
  • Java基于 SpringBoot 的车辆充电桩系统

    博主介绍 程序员徐师兄 7年大厂程序员经历 全网粉丝30W Csdn博客专家 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文章目录 1 效果演示 效果图 技术栈 2 前言介绍 完整源码请私聊 3 主
  • 关于今年五一调休。。

    作者主页 爱笑的男孩 的博客 CSDN博客 深度学习 YOLO 活动领域博主爱笑的男孩 擅长深度学习 YOLO 活动 等方面的知识 爱笑的男孩 关注算法 python 计算机视觉 图像处理 深度学习 pytorch 神经网络 opencv领
  • unity 渲染帧率优化-OnDemandRendering

    FixedUpdate更新速率设置 OnDemandRendering 相关的API 1 OnDemandRendering renderFrameInterval 3 解释说明 在一些静态UI的时候把OnDemandRendering r
  • Message": "请求的资源不支持 http 方法“GET”

    今天用postman测试后端api 总是报错 下面是问题解决方案 一 测试方法 public ApiResult Get int id ApiResult result new ApiResult result data 我是Get方法返回
  • Java调用jython

    Java调用jython 因为工作需要 需要在Java Jvm 进程内调用Python脚本 下了Jython练练手 脚本语言看着真别扭啊 若干年前写自动化测试工具时也用过python一小阵子 但基本忘光光了 好了 直奔主题 前提 1 sun
  • Linux如何给服务器增加白名单

    1 查看系统白名单配置 iptables L n 2 增加白名单 19 40 145 140 是需要增加的服务器IP iptables I INPUT s 19 40 145 140 32 p tcp j ACCEPT 注 I I是i的大写
  • oracle 函数使用方法----replace函数

    例 sql语句如下 select from cen sys TB DIC JDLX t 查询结果如下 需求 需要获取字段 PID 的值并 新增一个字段 PNAME PNAME的值为字段PID去掉 市平台前置机 剩下的字段 实现 select
  • 后端返回parentId,前端处理成children嵌套数据

    rouyi 的 vuetree函数结合elementui el table组件使用 把有parentId和id结构的数据处理成children嵌套数据 字段名称不一致 可以设置 vuetree函数 构造树型结构数据 param data 数
  • html 调用ActiveX

    html网页调用ActiveX控件时 要获取到ActiveX的ClassID 这个ClassID是注册到系统里的 而不是工程中的uuid 下图为uuid 正确的是在注册表的HKEY CLASSES ROOT中查找你的工程名的 项 找到后 其
  • flink state ttl 清理逻辑(截止到flink1.8之前的逻辑)

    在我们开发Flink应用时 许多有状态流应用程序的一个常见要求是自动清理应用程序状态以有效管理状态大小 或控制应用程序状态的访问时间 TTL Time To Live 功能在Flink 1 6 0中开始启动 并在Apache Flink中启
  • openwrt golang mysql_golang1.9编译openwrt运行程序 ,window7下liteide编译

    网上看了好多资料发现都很过时了 基本都是用的https github com gomini go mips32编译的 但是go1 9早就支持mips了 设置好编译参数 开始build 这时在go pkg下会出现linux mips目录 就是
  • Thumb / Thumb-2 / ThumbEE

    本文转载至 http zh wikipedia org wiki ARM E6 9E B6 E6 A7 8B Thumb 较新的ARM处理器有一种16 bit指令模式 叫做Thumb 也许跟每个条件式运行指令均耗用4位的情形有关 在Thum
  • 问题定位及解决方案

    1 视频沉浸页快速滑动后 必现不能向下划动 复现步骤 进入视频沉浸页 快速向下划动 滑动到第一页最后一个时 不能再向下划动 解决步骤 1 确定请求API mtop aliexpress ugc feed video list 2 找到触发请
  • uniapp开发小程序,编译时报错Cannot read property ‘forceUpdate‘ of undefined的解决方案

    1 这个报错 主要是没有在uniapp的开发平台为这个应用注册一个appid 2 登录uniapp开发平台 https dev dcloud net cn 注册成为开发者 并创建一个应用 此应用的名称要与本地的项目的名称一致 3 重现获取u
  • Android开发---Fragment可见/不可见时的生命周期回调函数

    Fragment可见 不可见时的生命周期回调函数 项目中经常会碰到 需要在fragment失去焦点和获得焦点的方法中进行一些设置 但是fragment没有onpause 和onResume 方法 你重写的这两个方法 都是fragment依附
  • python安装

    Python 环境搭建 本章节我们将向大家介绍如何在本地搭建Python开发环境 Python可应用于多平台包括 Linux 和 Mac OS X 你可以通过终端窗口输入 python 命令来查看本地是否已经安装Python以及Python
  • ORA-32021: parameter value longer than 255 characters 解决方法

    在增加节点完后 用dbca 添加数据库实例时 报ORA 32021 parameter value longer than 255 characters 错误 oraagent log 2011 10 24 09 18 32 724 USR
  • 框架学习笔记——Spring

    Spring 文章目录 Spring 1 Spring简介 1 1 框架的主要特征 1 2 Spring的主要特点 1 3 组成 2 Spring之控制反转 IOC 2 1 百科 2 2 两种方式 2 3 依赖注入 推导 2 3 1 新建一