Spring笔记:Hello World
2021/12/2 6:07:44
本文主要是介绍Spring笔记:Hello World,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、Spring简介
关于Spring,多的不用说,但是需要记住并深入理解一句话“Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的框架”。IoC和AOP几乎是面试必问,所以需要在实际开发中深入理解它们的思想及其应用。
1. Spring优点
- Spring是一个开源的免费的框架。
- Spring是一个轻量级的、非入侵式的框架。(添加新功能而不会修改原来的代码)
- 控制反转(IoC),面向切面编程(AOP)。【重点】【核心】
- 支持事务的处理。
2. SSM
SSM(Spring + SpringMVC + MyBatis)是当下最流行的企业级应用开发框架组合,所以Spring其实是Java中非常基础但又是非常重要的一个框架。
3. IoC控制反转(Spring核心思想)
IoC(Inversion of Control)控制反转是Spring的核心思想,通俗快速地理解IOC思想:“不反转”的情况是,当我们创建一个对象之后,我们需要在使用到的地方去更改原来的代码,替换成我们创建的对象,比如在某行代码中我们使用了对象A,当我们想在这个地方换成使用对象B,那么我们在定义好类B之后,需要把对象A修改成对象B;也就是说从某种角度上讲,程序要使用哪个对象,甚至于程序的运行,取决于程序本身,因为程序的代码之前已经写死了,想要改变原来的使用对象或程序的运行行为,就需要更改原来的代码;这就像相当于是把程序运行的控制权交给了编程人员或者程序本身,如果想要“反转”这个控制权,使得我们新加了一个类之后,当我们想要使用这个类时,不用改动原来的代码就可以使用这个类创建的对象,或者说我们想要改变程序的行为时,不用修改原来的代码,只需要添加一个类就可以了,这样的话,程序运行的行为的控制权其实就不在程序本身了,而“反转”到了第三方程序(甚至是用户)上,根据业务需求由第三方程序添加或移除对应的类即可。这个描述不一定百分百准确,重点是理解“控制权”的反转,理解谁控制了什么,谁的控制权又反转到了谁的身上。IoC是一种思想,不仅限于某一种编程语言,当然,想要学习Spring,首先就需要了解IoC控制反转的思想。
其实IoC思想的实现方式有很多中,在Spring中实现IoC控制反转的是IoC容器,其实现方法是DI(Dependency Injection)依赖注入。
4. AOP面向切面编程
AOP面向切面编程,通俗一点讲,就是在不改变现有代码的情况下,自定义一些特殊方法,并让这些方法在指定的某个方法执行之前或之后执行,比如接收到请求之后我想在处理请求之前做一些过滤等操作,在响应返回到浏览器之前做一些格式化处理等。AOP面向切面编程会涉及一些术语,比如切入点、切面等,这些术语刚接触可能不太好理解,多多练习就好理解了。
5. Maven依赖注入
在学习或使用Spring时,可能会用到的一些Maven依赖,我列在这儿,免得到时候我忘了还有再去搜一遍 =_=!
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.12</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> </dependencies>
二、Hello World
1. Hello World示例
这个Hello world非常简单,需要重点理解其中应用到的IoC控制反转思想(参见代码注释)。
bean类定义:
public class MyBean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "MyBean{" + "name='" + name + '\'' + '}'; } }
beans.xml配置:
在IDEA中直接 new -> XML Configuration File -> Spring Config
就可以生成一个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就是一个对象,xml中的对象会由Spring来进行创建, 使用时直接在Spring容器中拿即可。 --> <bean id="myBean" class="com.yun.pojo.MyBean"> <!-- 可以使用property给创建之后的对象属性进行赋值, 但是前提是这个属性必须要有set方法--> <property name="name" value="zhangsan"/> </bean> </beans>
测试:
import com.yun.pojo.MyBean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { public static void main(String[] args) { // 创建Spring上下文对象(可以理解为一个容器,即Spring容器) ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); // 从容器中获取我们在xml中配置的对象,其实从这里就可以看出,我们自己的程序只是定义了一个类, // 然后在xml中配置了一个bean,并没有主动去代码中使用new关键字创建对象,所以IoC思想在这里就体现出来了, // 创建对象的控制权由传统编程思想中的程序本身“反转”到了第三方,即Spring, // 以后创建对象的控制权就交给Spring了,我们只需要在xml中进行配置bean即可。 MyBean myBean = (MyBean) context.getBean("myBean"); System.out.println(myBean); } }
2. Spring对象创建方式
无论使用Spring的那种方式来创建对象,在xml配置加载的时候,里面所有的bean对象都会被一起创建,并不是你去Spring容器里获取的时候才会创建你想要的那个对象。
2.1 默认使用无参构造方法创建对象
Spring默认采用无参构造方法来创建对象,我们知道定义类的时候如果没有定义构造方法,Java会提供一个默认的无参构造方法,但是如果类中定义了有参构造方法,那么Java就不会提供无参构造了,需要自己去定义。所以我们定义bean的时候没有定义构造方法的话,Spring就会使用默认的无参构造方法来创建对象。
bean类定义:
public class MyBean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "MyBean{" + "name='" + name + '\'' + '}'; } }
xml配置:
<bean id="myBean" class="com.yun.pojo.MyBean"> <!-- 可以使用property给创建之后的对象属性进行赋值, 但是前提是这个属性必须要有set方法--> <property name="name" value="zhangsan"/> </bean>
2.2 根据有参构造方法的参数列表index创建对象
如果类定义了有参构造方法,也可以在xml配置中使用有参构造方法的参数列表index创建对象。
bean类定义:
public class Student { private int id; private String name; private int age; public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
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="student" class="com.yun.pojo.Student"> <!-- 使用有参构造方法创建对象:constructor-arg标签表示在有参构造方法中给对象属性赋值, index表示的有参构造方法中参数列表的下标,从0开始 --> <constructor-arg index="0" value="0"/> <constructor-arg index="1" value="zhangsan"/> <constructor-arg index="2" value="18"/> </bean> </beans>
2.3 根据有参构造的参数名称创建对象
如果类定义了有参构造方法,也可以在xml配置中使用有参构造方法的参数名称创建对象。
bean类定义:
public class Student { private int id; private String name; private int age; public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
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="student" class="com.yun.pojo.Student"> <!-- 使用有参构造方法创建对象:constructor-arg标签表示在有参构造方法中给对象属性赋值, name表示的有参构造方法中对应参数的名称 --> <constructor-arg name="id" value="0"/> <constructor-arg name="name" value="zhangsan"/> <constructor-arg name="age" value="18"/> </bean> </beans>
3. Spring的xml配置
3.1 bean的name属性
bean的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"> <!-- name属性表示为myBean对象取别名,可以取多个别名,多个别名之间使用空格、逗号、分号等分隔(任何一种符号都可以)。 --> <bean id="myBean" class="com.yun.pojo.MyBean" name="myBean2 myBean3,myBean4;myBean5"> <property name="name" value="zhangsan"/> </bean> </beans>
3.2 alias标签
这是标签从名字就可以看出来,作用是取别名,但是因为bean标签的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="myBean" class="com.yun.pojo.MyBean"> <property name="name" value="zhangsan"/> </bean> <!-- 为对象myBean配置别名,通过Spring获取对象时,传入myBean和myBean2都是一样的 --> <alias name="myBean" alias="myBean2"/> </beans>
3.3 import标签
import标签的作用是将其他的xml配置文件中的内容合并到当前xml文件中,加载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="myBean" class="com.yun.pojo.MyBean"> <property name="name" value="zhangsan"/> </bean> <!-- 将其他xml配置中合入到当前文件中 --> <import resource="beans2.xml"/> <import resource="beans3.xml"/> <import resource="beans4.xml"/> </beans>
这篇关于Spring笔记:Hello World的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01Java部署教程:新手入门指南
- 2024-11-01Java部署教程:从入门到实践
- 2024-11-01Java订单系统教程:新手入门指南
- 2024-11-01Java分布式教程:新手入门指南
- 2024-11-01Java管理系统教程:新手入门详解
- 2024-11-01Java监控系统教程:从入门到实践
- 2024-11-01SpringCloud Alibaba入门:轻松搭建微服务架构
- 2024-11-01Swagger入门:新手必读指南
- 2024-11-01Swagger入门:轻松搭建API文档
- 2024-11-01uni-APP入门:新手快速上手指南