Spring学习(适合新人)

本文深入浅出地介绍了Spring框架的基本概念,包括其作为容器的特性、轻量级框架的优势、控制反转(IoC)、依赖注入(DI)、面向切面编程(AOP)、MVC框架、事务管理和异常处理等关键特性。同时,通过实例演示了如何在Maven项目中使用Spring,涵盖了创建实体类、配置Bean、以及验证单例和多例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有人私信我说,我写的博客有些肤浅,没有深究,在此我统一回复一下,这些博客大多都是概念性东西,是用通俗的例子让你理解这个技术或者知识到底是怎么一样原理。
所以我在后面都加着适合新人,我们都是从新人走过来的,知道初学者的那种迷茫,只会代码,不懂原理和含义,就比如,注解,你不去学习理解,初学者根本就不知道那是个什么东西,为什么要使用注解。
如果是资深大牛,那就不要看了,还是那句话,适合新人。
————————————————

1,Spring是什么?

Spring其实就是一个容器;
Spring就是把每个bean(实体类)与bean的关系全部交给第三方容器进行管理,这个容器就是Spring,管理整个对象的生命周期;

2,Spring的好处;

  1. 轻量级框架

    Spring是轻量级框架,基本的版本大约2M

  2. 控制反转

    Spring通过控制反转实现松散耦合,对象们给它们的依赖,而不是创建或者查找依赖的对象们;方便解耦,简化开发

  3. 面相切面的编程 AOP

    Spring支持面相切面的编程,并且把应用业务逻辑和系统分开

  4. 容器

    Spring 包含并管理应用中对象的生命周期和配置

  5. MVC框架

    Spring的WEB框架是个精心设计的框架,是WEB框架的一个很好的替代品

  6. 事务管理

    Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)

  7. 异常处理

    Spring 提供方便的API把具体技术的相关异常(比如由JDBC Hibernate or JDO 抛出的) 转化为一致的 unchecked异常

在我看来,Spring还有一个更大的好处,就是可以集合很多种框架;

3,Spring的核心

  1. ioc 控制反转(也就是创建对象)
  2. di 依赖注入 (可以说di与ioc是成对出现的,一个负责创建,一个负责注入)
  3. aop 面向切面编程

4, Spring的简单应用


> 1. 创建一个maven项目,要知道在公司,没有说是单独创建java或者web项目的;
> 2. 引入依赖,也就是加入jar包;
> 3. 创建一个实体类;
> 4. 创建Spring的Xml文件,并且创建一个bean
> 5. 创建测试类,
>            并且在main方法里面,
>         5.1 先加载Spring.xml,
>         5.2 然后根据bean的id,查找对象,
>         5.3 这个时候,对象就被创建出来了;

这是一个简单得思路;下面就是代码;

  1. 创建一个maven项目
  2. 引入依赖,也就是加入jar包;
  3. 创建一个实体类;
    前两个就不写了,太简单了,直接第三步
package entity;
public class UserEntity {
	private String name;
	private int age;
	//无参构造函数
	public UserEntity(){
		System.out.println("这是一个无参构造函数!");
	}
	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;
	}
}
  1. 创建Spring的Xml文件,并且创建一个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"  
		xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd">
        <!-- 创建了一个bean -->
        <bean id="userEntity" class="entity.UserEntity"></bean>
</beans>
  1. 创建测试类
import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.UserEntity;

/**
 * 
* 项目名称:Spring  
* 类描述:(Spring学习)
* 创建人:莫参商 
* 创建时间:2020-1-19 下午2:43:44  
* 修改人:acer     
* @version   
*   
 */
public class SpringTest {
		public static void main(String[] args) {
			//1.先加载Spring容器
			ClassPathXmlApplicationContext Context = new ClassPathXmlApplicationContext("Spring002.xml");
			//根据bean的id,查找对象
			UserEntity bean = (UserEntity) Context.getBean("userEntity");
			//这个时候,就可以用了
			System.out.println(bean);
		}
}

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

5,Spring默认是单例

怎么证明是不是单例呢?
只要构造多次调用,但是构造函数之运行一次,就是单例,这是最好得证明;

那我们现在就证明一下,Spring默认是单例的;

更新上面的测试类代码:

import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.UserEntity;

/**
 * 
* 项目名称:Spring  
* 类描述:(Spring学习)
* 创建人:莫参商 
* 创建时间:2020-1-19 下午2:43:44  
* 修改人:acer     
* @version   
*   
 */
public class SpringTest {
		public static void main(String[] args) {
			//1.先加载Spring容器
			ClassPathXmlApplicationContext Context = new ClassPathXmlApplicationContext("Spring002.xml");
			System.out.println("---------------------------------");
			//根据bean的id,查找对象;这里创建两个对象
			UserEntity bean1 = (UserEntity) Context.getBean("userEntity");
			UserEntity bean2 = (UserEntity) Context.getBean("userEntity");
			System.out.println(bean1);
			System.out.println(bean2);
			//这个时候,就可以用了,测试一下两个对象的内存路径是否相同
			System.out.println(bean1==bean2);
		}
}

在这里插入图片描述
看结果就知道,这个实体类被new创建了两次,但是构造方法只调用了一次,并且两个对象的引用是相同的;可以说明,Spring默认是单例;

6,Spring怎么改成多例的呢?

单例有单例的好处,多例有多例的好处;
想要将单例改成多例其实很简单。

在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"  
		xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd">
       
        <bean id="userEntity" class="entity.UserEntity" scope="prototype"></bean>
</beans>

然后测试一下

import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.UserEntity;

/**
 * 
* 项目名称:Spring  
* 类描述:(Spring学习)
* 创建人:莫参商 
* 创建时间:2020-1-19 下午2:43:44  
* 修改人:acer     
* @version   
*   
 */
public class SpringTest {
		public static void main(String[] args) {
			//1.先加载Spring容器
			ClassPathXmlApplicationContext Context = new ClassPathXmlApplicationContext("Spring002.xml");
			System.out.println("---------------------------------");
			//根据bean的id,查找对象
			UserEntity bean1 = (UserEntity) Context.getBean("userEntity");
			System.out.println(bean1);
			UserEntity bean2 = (UserEntity) Context.getBean("userEntity");
			System.out.println(bean2);
			//这个时候,就可以用了
			System.out.println(bean1==bean2);
		}
}

在这里插入图片描述
这个时候,就变成了多例。

7,Spring简单的生命周期介绍;

  1. singleton 单例;
  2. singleton prototype 多例;
  3. singleton request web项目种会遇到,不常用;
  4. singleton session web项目会用到,不常用;
<think>好的,我现在需要帮助用户比较Python和Java哪个更适合编程初学者。首先,我得回顾一下用户提供的引用内容,看看里面有什么有用的信息。引用1提到Python的语法更直接易懂,适合初学者和需要快速开发的项目,而Java语法更冗长,但结构更明确,类型安全。引用3推荐了一本Python入门书籍,说明Python的学习资源友好。引用4详细讲了Python的环境配置,特别是虚拟环境的使用,这可能对新手有帮助。而引用2则列出了Java的教程和书籍,显示Java也有系统的学习资源,但可能门槛较高。 接下来,我应该从几个方面来比较这两种语言:语法复杂度、学习曲线、应用场景、社区资源和工具支持。用户是初学者,所以需要强调容易上手和减少挫败感。Python的简洁语法和动态类型可能让新手更容易写出可运行的代码,快速看到成果,增强学习动力。例如,打印“Hello World”在Python中只需要一行,而Java需要类和方法的结构。 另外,引用1提到Java的类型安全和显式结构,这对培养良好的编程习惯有帮助,但可能会让初学者一开始感到困惑。动态类型虽然灵活,但可能在项目变大时难以维护,不过这对新手来说可能不是主要问题。 应用场景方面,Python在数据科学、机器学习、Web开发(如Django)和脚本编写中应用广泛,而Java更多用于企业级应用、安卓开发和大型系统。用户如果对特定领域感兴趣,比如移动应用开发,可能更适合Java,但如果是广泛的入门学习,Python的多样性更有利。 工具和环境配置方面,引用4提到Python安装和虚拟环境的配置,虽然可能有些复杂,但有很多教程指导。Java的环境配置,尤其是类路径和JVM,可能对新手来说更麻烦。比如,Java需要配置JDK,而Python通常安装后即可使用。 还要考虑学习资源和社区支持。Python有像《Learn Python the Hard Way》这样的书籍,社区活跃,问题容易解决。Java虽然也有好的教程,但可能更偏向于系统性的学习适合有耐心的人。 总结起来,Python更适合大多数编程初学者,因为它语法简单,资源丰富,能快速上手,而Java适合那些对类型安全和结构严谨性有需求,或者目标明确想进入安卓或企业开发的人。不过,最终选择还要看用户的具体兴趣和目标。</think>### Python vs Java 对编程初学者的适用性分析 #### 一、语法复杂度对比 1. **Python** - 语法简洁,采用动态类型系统,例如: ```python x = 5 # 无需声明类型 print("Hello World") # 单行输出 ``` - 代码结构依赖缩进而非显式符号(如`{}`),强制培养代码规范习惯[^1]。 - 示例:快速排序仅需约10行代码(见用户提供的代码示例)。 2. **Java** - 语法更冗长,需显式声明类型和结构: ```java public class Main { public static void main(String[] args) { System.out.println("Hello World"); // 需包裹在类和方法中 } } ``` - 类型安全和静态检查减少了运行时错误,但增加了初学者的认知负担[^1]。 #### 二、学习曲线与早期成就感 - **Python**: 通过简单的语法可快速实现功能(如数据可视化、网页爬虫),增强学习信心。例如,用`matplotlib`绘制图表仅需5行代码。 - **Java**: 需先理解面向对象编程(OOP)、编译过程等概念,初学者可能需要数周才能完成第一个完整项目。 #### 三、应用场景与职业发展 1. **Python的优势领域** - 数据科学(Pandas、NumPy) - 机器学习(TensorFlow、PyTorch) - 脚本自动化与Web开发(Django、Flask)[^3] 2. **Java的核心应用** - 企业级后端开发(Spring框架) - Android应用开发 - 高性能分布式系统(如Hadoop) #### 四、工具链与开发环境 - **Python**: 安装简单(引用4中提到的`conda`或原生安装),支持Jupyter Notebook交互式学习。 - **Java**: 需配置JDK、IDE(如IntelliJ IDEA)和构建工具(如Maven),对新手门槛较高[^2]。 #### 五、总结建议 | 对比维度 | Python | Java | |----------------|---------------------------------|---------------------------------| | **适合人群** | 希望快速上手、注重实践的新手 | 追求代码严谨性、目标企业开发的新手 | | **学习资源** | 《Learn Python the Hard Way》 | 《Thinking in Java》[^2] | | **长期发展** | 更适合新兴领域(如AI) | 更适配传统软件工程岗位 | **推荐结论**: 若初学者目标为**快速入门编程逻辑**或**探索数据科学/人工智能领域**,优先选择Python;若明确以**安卓开发**或**大型系统开发**为方向,则建议Java。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值