前言

本文是我根据B站狂神(秦疆老师)的Spring5最新完整教程一视频整理得来,借鉴了秦老师的讲课内容。读者们也可以去B站看秦老师的其他精品教程,讲解的都非常详细到位,而且都是免费的。

视频链接:https://www.bilibili.com/video/BV1WE411d7Dv?spm_id_from=333.999.0.0

1、Spring概述

1.1、简介

  • Spring : 春天 —->给软件行业带来了春天
  • 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。
  • 2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。
  • 很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
  • Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术

官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/index.html

官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/

GitHub : https://github.com/spring-projects

1.2 、优点

  • Spring是一个开源免费的框架 , 容器 .

  • Spring是一个轻量级的框架 , 非侵入式的 ,不会对原有的类造成影响 .

  • 控制反转 IoC , 面向切面 Aop

  • 对事物的支持 , 对框架的支持

  • 一句话概括:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

1.3、 组成

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式 .

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器: 核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文: Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP: 通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO: JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM: Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块: Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架: MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

1.4 、拓展

Spring Boot与Spring Cloud

  • Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务;
  • Spring Cloud是基于Spring Boot实现的;
  • Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;
  • Spring Boot使用了约束优于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置 , Spring Cloud很大的一部分是基于Spring Boot来实现,Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。
  • SpringBoot在SpringClound中起到了承上启下的作用,如果你要学习SpringCloud必须要学习SpringBoot。

2、 IoC基础

新建一个Maven项目

2.1、案例分析

需求:Service层调用不同的Dao层接口。

新建一个dao层接口

package com.princehan.dao;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 14:43*/
public interface UserDao {void getUser();
}

实现dao层接口

package com.princehan.dao;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 14:43*/
public class UserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("默认实现");}
}
package com.princehan.dao;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 16:31*/
public class UserMySQLImpl implements UserDao{@Overridepublic void getUser() {System.out.println("MySQL实现");}
}
package com.princehan.dao;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 16:32*/
public class UserSQLServerImpl implements UserDao{@Overridepublic void getUser() {System.out.println("SQLServer实现");}
}

新建一个service层接口

package com.princehan.service;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 14:44*/
public interface UserService {void getUser();
}

实现service接口

package com.princehan.service;import com.princehan.dao.UserDao;
import com.princehan.dao.UserDaoImpl;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 14:44*/
public class UserServiceImpl implements UserService{private UserDao userDao = new UserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
}

编写测试类

import org.junit.Test;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 16:39*/
public class MyTest {@Testpublic void test() {UserServiceImpl userService = new UserServiceImpl();userService.getUser();}
}

我们要调用不同的dao层接口,就要在UserServiceImpl修改dao的接口,因为UserServiceImpl实例化dao层接口的类型是固定的,也就是根据不同的需求我们需要修改不同的代码,这显然不符合常理。

我们换一种思路,在UserServiceImpl并不固定dao层接口的类型,而是提供修改dao层类型的一个接口,可以用set方法实现。

public void setUserDao(UserDao userDao) {this.userDao = userDao;
}

测试类

@Test
public void test() {UserServiceImpl userService = new UserServiceImpl();userService.setUserDao(new UserDaoImpl());userService.getUser();userService.setUserDao(new UserMySQLImpl());userService.getUser();userService.setUserDao(new UserSQLServerImpl());userService.getUser();
}

仔细观察两种方式的区别:

以前所有东西都是由程序去进行控制创建 , 而现在是由我们自行控制创建对象 , 把主动权交给了调用者 . 程序不用去管怎么创建,怎么实现了 . 它只负责提供一个接口 .

这种思想 , 从本质上解决了问题 , 程序员不再去管理对象的创建了 , 更多的去关注业务的实现 . 耦合性大大降低 . 这也就是IOC的原型 !

2.2、IoC本质

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法, 也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

IoC是Spring框架的核心内容, 使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

3、HelloSpring

3.1、编写第一个Spring程序

新建实体类

package com.princehan.pojo;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 18:18*/
public class Hello {private String str;public String getStr() {return str;}public void setStr(String str) {this.str = str;}@Overridepublic String toString() {return "Hello{" +"str='" + str + '\'' +'}';}
}

导入Spring的依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version>
</dependency>

编写Spring配置文件(beans.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean就是java对象 , 由Spring创建和管理--><!--id表示对象名 class表示类的路径property name表示属性名 value 表示属性值 value的值根据set方法获得--><bean id="hello" class="com.princehan.pojo.Hello"><property name="str" value="Spring"/></bean>
</beans>

编写测试类

import com.princehan.pojo.Hello;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @Description* @Author:PrinceHan* @CreateTime:2022/4/12 18:30*/
public class MyTest {@Testpublic void HelloSpring() {//获取Spring的上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//从Spring容器中获取对象Hello hello = (Hello) context.getBean("hello");System.out.println(hello.toString());}
}

3.2、思考

Hello 对象是谁创建的 ?

答:hello 对象是由Spring创建的

Hello 对象的属性是怎么设置的 ?

答:hello 对象的属性是由Spring容器设置的

这个过程就叫控制反转 :

  • 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的

  • 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .

依赖注入 : 就是利用set方法来进行注入的.

IOC是一种编程思想,由主动的编程变成被动的接收

可以通过new ClassPathXmlApplicationContext()去浏览一下底层源码 .

3.3、修改第二章的案例

<?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="daoImpl" class="com.princehan.dao.UserDaoImpl"/><bean id="mysqlImpl" class="com.princehan.dao.UserMySQLImpl"/><bean id="sqlServerImpl" class="com.princehan.dao.UserSQLServerImpl"/><bean id="userServiceImpl" class="com.princehan.service.UserServiceImpl"><!--value表示基本数据类型以及字符串 ref表示引用类型--><property name="userDao" ref="sqlServerImpl"/></bean>
</beans>
    @Testpublic void UserServiceTest() {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("userServiceImpl");userServiceImpl.getUser();}

4、IoC创建对象方式

4.1、通过无参构造方法来创建

实体类

public class User {private String name;public User() {System.out.println("user无参构造方法");}public void setName(String name) {this.name = name;}public void show() {System.out.println("name=" + name);}
}

编写配置文件

<?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="user" class="com.princehan.pojo.User"></bean>
</beans>

编写测试类

@Testpublic void NoArgsConstructor() {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");User user = (User) context.getBean("user");user.show();}


如果没有无参构造方法,这种方式会报错。

4.2、通过有参构造方法来创建

实体类

public class UserT {private String name;public UserT(String name) {this.name = name;}public void setName(String name) {this.name = name;}public void show() {System.out.println("name=" + name);}
}

编写配置文件

<!-- 第一种根据参数名字设置 name表示参数名-->
<constructor-arg name="name" value="张三"/>
<!-- 第二种根据参数下标设置 index从0开始-->
<constructor-arg index="0" value="李四"/>
<!-- 第三种根据参数类型设置 要求限定全类名-->
<constructor-arg type="java.lang.String" value="王五"/>

编写测试类

@Test
public void AllArgsConstructor() {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");UserT userT = (UserT) context.getBean("userT");userT.show();
}

5、Spring配置

5.1、 别名

alias 设置别名 , 为bean设置别名 , 可以设置多个别名

<!--设置别名:在获取Bean的时候可以使用别名获取-->
<alias name="userT" alias="userNew"/>

5.2、 Bean的配置

<!--bean就是java对象,由Spring创建和管理-->
<bean id="hello" name="hello2 h2,h3;h4" class="com.kuang.pojo.Hello"><property name="name" value="Spring"/>
</bean>
  • id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符
  • 如果配置id,又配置了name,那么name是别名
  • name可以设置多个别名,可以用逗号,分号,空格隔开
  • 如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;
  • class是bean的全限定名=包名+类名

5.3、 import

团队的合作通过import来实现 .

<import resource="{path}/beans.xml"/>

6、依赖注入(DI)

  • 依赖注入(Dependency Injection,DI)。

  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .

  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

环境搭建


public class Address {private String address;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

public class Student {private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String, String> card;private Set<String> games;private String wife;private Properties info;public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String[] getBooks() {return books;}public void setBooks(String[] books) {this.books = books;}public List<String> getHobbys() {return hobbys;}public void setHobbys(List<String> hobbys) {this.hobbys = hobbys;}public Map<String, String> getCard() {return card;}public void setCard(Map<String, String> card) {this.card = card;}public Set<String> getGames() {return games;}public void setGames(Set<String> games) {this.games = games;}public String getWife() {return wife;}public void setWife(String wife) {this.wife = wife;}public Properties getInfo() {return info;}public void setInfo(Properties info) {this.info = info;}public void show() {System.out.print("name=" + name+ "\naddress=" + address.getAddress()+ "\nbooks=");for (String book : books) {System.out.print("<<" + book + ">>\t");}System.out.println("\n爱好:" + hobbys);System.out.println("card:" + card);System.out.println("games:" + games);System.out.println("wife:" + wife);System.out.println("info:" + info);}
}

6.1、构造器注入

根据无参构造和有参构造注入。

6.2、set注入 (重点)

  1. 常量注入
<bean id="address" class="com.princehan.pojo.Address"><property name="address" value="河南"/>
</bean>
  1. Bean注入

注意点:这里的值是一个引用,ref

<bean id="address" class="com.princehan.pojo.Address"><property name="address" value="河南"/>
</bean>
<bean id="student" class="com.princehan.pojo.Student"><property name="name" value="王子"/><property name="address" ref="address"/>
</bean>
  1. 数组注入
<property name="books"><array><value>Java</value><value>JavaWeb</value><value>MyBatis</value><value>Spring</value><value>SpringMVC</value></array>
</property>
  1. list注入
<property name="hobbys"><list><value>听歌</value><value>看剧</value><value>敲码</value></list>
</property>
  1. map注入
<property name="card"><map><entry key="IDcard" value="56156156"/><entry key="StudentCard" value="45485"/></map>
</property>
  1. set注入
<property name="games"><set><value>王者</value><value>吃鸡</value></set>
</property>
  1. properties注入
<property name="info"><props><prop key="user">root</prop><prop key="pwd">0925</prop></props>
</property>
  1. 空指针注入
<property name="wife"><null/></property>

编写测试类

    @Testpublic void test2() {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) context.getBean("student");student.show();}

6.3、拓展注入实现

public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
<!--无参构造器-->
<bean id="user" class="com.princehan.pojo.User" p:name="张三" p:age="18"/>
<!--有参构造器-->
<bean id="user2" class="com.princehan.pojo.User" c:name="李四" c:age="19"/>

需要在xml中导入约束(头部)

xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"

6.4、Bean的作用域


在这里着重介绍单例模式和原型模式。

单例模式,在Spring IoC容器中只有一份示例,通过单例模式创造的对象是相同的,原型模式则相反。

<!--单例模式  默认开启-->
<bean id="userSingleton" class="com.princehan.pojo.User" c:name="王子" c:age="18" scope="singleton"/>
<!--原型-->
<bean id="userProtoType" class="com.princehan.pojo.User" c:name="王子" c:age="18" scope="prototype"/>
@Test
public void ScopeTest() {ApplicationContext context = new ClassPathXmlApplicationContext("userbean.xml");User userSingleton = context.getBean("userSingleton", User.class);User userSingleton1 = context.getBean("userSingleton", User.class);System.out.println("Singleton模式是否创建的是同一个对象:");System.out.println(userSingleton == userSingleton1);User userProtoType = context.getBean("userProtoType", User.class);User userProtoType1 = context.getBean("userProtoType", User.class);System.out.println("ProtoType模式是否创建的是同一个对象:");System.out.println(userProtoType == userProtoType1);
}

7、Bean的自动装配

  • 自动装配是使用spring满足bean依赖的一种方法
  • spring会在应用上下文中为某个bean寻找其依赖的bean。

Spring中bean有三种装配机制,分别是:

  1. 在xml中显式配置;
  2. 在java中显式配置;
  3. 隐式的自动装配。【重要】

7.1、测试环境搭建

实体类

public class Cat {public void shout() {System.out.println("喵");}
}
public class Dog {public void shout() {System.out.println("汪");}
}
public class People {private Cat cat;private Dog dog;private String name;public Cat getCat() {return cat;}public void setCat(Cat cat) {this.cat = cat;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "People{" +"cat=" + cat +", dog=" + dog +", name='" + name + '\'' +'}';}
}

编写bean

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.princehan.pojo.Cat"/><bean id="dog" class="com.princehan.pojo.Dog"/><bean id="people" class="com.princehan.pojo.People"><property name="name" value="王子"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>
</beans>

编写测试

@Test
public void test() {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");People people = context.getBean("people", People.class);people.getDog().shout();people.getCat().shout();
}

在上面的例子中我们需要显式的装配people的属性,如果使用自动装配,就不用显示装配属性。

7.2、byName和byType

自动装配两种类型:

  1. byName,根据需要装配属性的对象的属性名进行装配,属性名不符合就会装配失败。
  2. byName,根据需要装配属性的对象的类型名进行装配,类型名不符合就会装配失败。
<!--byType cat1不会报错-->
<bean id="cat1" class="com.princehan.pojo.Cat"/>
<bean id="dog" class="com.princehan.pojo.Dog"/>
<bean id="people" class="com.princehan.pojo.People" autowire="byType"><!--byName cat1会报错-->
<bean id="cat1" class="com.princehan.pojo.Cat"/>
<bean id="dog" class="com.princehan.pojo.Dog"/>
<bean id="people" class="com.princehan.pojo.People" autowire="byName"><!--报错 cat1和cat-->
<bean id="cat1" class="com.princehan.pojo.Cat"/>
<bean id="cat" class="com.princehan.pojo.Cat"/>
<bean id="dog" class="com.princehan.pojo.Dog"/>
<bean id="people" class="com.princehan.pojo.People" autowire="byType">
<!--能找到cat 不会报错-->
<bean id="cat1" class="com.princehan.pojo.Cat"/>
<bean id="cat" class="com.princehan.pojo.Cat"/>
<bean id="dog" class="com.princehan.pojo.Dog"/>
<bean id="people" class="com.princehan.pojo.People" autowire="byName">

7.3、使用注解装配

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

首先需要在beans.xml中开启注解的约束。

xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd

开启注解

<context:annotation-config/>

多写几个bean测试一下

    <bean id="cat" class="com.princehan.pojo.Cat"/><bean id="cat1" class="com.princehan.pojo.Cat"/><bean id="dog" class="com.princehan.pojo.Dog"/><bean id="dog1" class="com.princehan.pojo.Dog"/><bean id="people" class="com.princehan.pojo.People">

@Autowired

    @Autowiredprivate Cat cat;@Autowiredprivate Dog dog;
  • @Autowired 通过byType方式进行自动装配,可以作用在属性上,也可以作用在set方法上,使用 @Autowired 可以不用写set方法。
  • @Autowired 无法通过byType方式进行自动装配时,可以配合另一个注解 @Qualifier(value = "cat1") 进行byName方式装配
  • @Qualifier 不能单独使用。
    @Autowired@Qualifier(value = "cat1")private Cat cat;

@Resource

  • @Resource 如有指定的name属性,先按该属性进行byName方式查找装配;
  • 其次再进行默认的byName方式进行装配;
  • 如果以上都不成功,则按byType的方式自动装配。
  • 都不成功,则报异常。
    @Resourceprivate Cat cat;@Resource(name = "dog")private Dog dog;

7.4、小结

@Autowired@Resource 异同:

  • @Autowired 与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
  • @Autowired 默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
  • @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
  • 它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired 先byType,@Resource 先byName。

Spring学习第二天相关推荐

  1. Spring学习总结三

    Spring框架JdbcTemplate与事务 Spring学习总结三 0.需要的jar包 1.JdbcTemplate模板 1.1.JdbcTemplateAPI的操作 1.1.1.User类 1. ...

  2. Spring学习总结一

    Spring框架IoC与DI思想及应用 Spring学习总结一 1.Spring是什么 2.Spring的优点 2.1.关键概念 2.2.Spring的优点 3.Spring的架构图 3.1.核心容器 ...

  3. Spring学习(五)bean装配详解之 【XML方式配置】

    本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原 ...

  4. Spring学习笔记1

    前言 Spring框架的学习路线: Spring第一天:Spring的IOC容器之XML的方式,Spring框架与Web项目整合 Spring第二天:Spring的IOC容器之注解的方式,Spring ...

  5. spring学习笔记06-spring整合junit(出现的问题,解决的思路)

    spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...

  6. spring学习笔记02-spring-bean创建的细节问题

    spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...

  7. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  8. Spring学习笔记之MyBatis

    系列文章目录 Spring学习笔记 之 Springhttps://blog.csdn.net/weixin_43985478/article/details/124411746?spm=1001.2 ...

  9. 一箭双雕 刷完阿里P8架构师spring学习笔记+源码剖析,涨薪8K

    关于Spring的叙述: 我之前死磕spring的时候,刷各种资料看的我是一头雾水的,后面从阿里的P8架构师那里拿到这两份资料,从源码到案例详细的讲述了spring的各个细节,是我学Spring的启蒙 ...

最新文章

  1. Soft-to-Hard Vector Quantization for End-to-End Learning Compressible Representations
  2. Python学习笔记《Python核心编程》第4章Python对象
  3. 设计模式之_动态代理_02
  4. javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象...
  5. FreeSWITCH的TLS加密
  6. 脚本放在 body 元素的底部
  7. Java进阶:SpringMVC中放行静态资源
  8. js经典试题之数组与函数
  9. 《我喜欢生命本来的样子》周国平 .mobi .epub .pdf .azw3 电子版下载 读书笔记
  10. LittlevGL在AliOS thing上的应用
  11. 总结--看帖收“货”
  12. 解开Kafka神秘的面纱(二):Kafka的高效读写与消息安全
  13. Ant参考教程 ant教程
  14. 24口光纤配线架 cad块_24口光纤配线架定义
  15. 天翼光猫虚拟服务器怎么设置,电信光猫设置经验图解手把手教你(超级详细),换光猫怎么重新设置...
  16. ijkplayer播放器
  17. 什么是好的博客网站?
  18. 第七周项目四—队列数组
  19. CISP笔记 Cyrus
  20. “”与“==”的优先级谁更高?

热门文章

  1. int、long、longlong、double范围
  2. synchronized 修饰方法
  3. 手机电池的保护电路详细介绍
  4. 双上行链路的热备份网关冗余
  5. 微信公众号的分类与自定义菜单接口
  6. vue axios 请求不带cookie问题
  7. 哈工大2022春CSAPP大作业
  8. 短视频APP有什么优势?
  9. 献给工程师的英文课:坚持21天,读懂英文文档
  10. 英特尔® 傲腾™(Optane™)技术