Spring全家桶(一)HelloWorld与入门基础

简介: 一、认识Spring1.1 Spring简介 Spring是一个开源框架,为简化企业级应用而生,是一个IOC(DI)和AOP容器框架。

一、认识Spring

1.1 Spring简介

Spring是一个开源框架,为简化企业级应用而生,是一个IOC(DI)和AOP容器框架。
IOC和AOP不太好理解,这里有一篇文章值得参考 IOC和AOP的一些基本概念

IOC(Inversion of Control):

反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,容器适时返回资源作为回应。应用IOC之后,容器主动地讲资源推送给它所管理的组件,组件要做的就是选择一种合适的方式接受资源,这种行为也被称为查找的被动形式。

DI(Dependency Injection):

IOC的另一种表述方式,即组件以一些预先定义好的方式(比如setter方法)接受来自容器的资源注入。相对于IOC而言,DI在表述上更直接。

这里写图片描述

1.2 Spring特点

  1. 轻量级:Spring是非入侵的,基于Spring开发的应用中的对象可以不依赖Spring的API
  2. 依赖注入
  3. 面向切面编程
  4. 容器:Spring是一个容器,它包含并且管理应用对象的生命周期
  5. 框架:Spring使用简单的组件配置组合成一个复杂的应用,在Spring中可以使用XML和Java注解组合这些对象
  6. 一站式:Spring是一个一站式的框架,在IOC和AOP的基础上可以整合企业应用的开源框架和第三方类库。使用Spring可以把Java EE中的知识点都包括起来,Spring等同于Java EE。

1.3 Spring模块

Spring框架包含了大约20个模块,如下图所示。这些模块再细分成Core Container, Data Access/Integration, Web, AOP (Aspect Oriented Programming), Instrumentation, Messaging, and Test。

这里写图片描述

二、Spring HelloWorld

2.1 搭建开发环境

在IDEA中新建Maven工程,选择maven-archetype-webapp。

这里写图片描述

在pom.xml中添加spring的maven依赖:

 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.8.RELEASE</version>
 </dependency>

导包完成以后,在External Libraries目录下可以看到新导入的五个jar包:spring-aop、spring-beans、spring-contex、spring-core、spring-expression.

这里写图片描述

在src/main目录下新建Directory,设置资源文件夹。

这里写图片描述

在java目录下新建一个包,再增加一个HelloWorld类。HelloWorld类中设置了一个私有域name,一个setName方法和一个sayHello方法。

package com.stuspring;

/**
 * Created by bee on 17/4/22.
 */
public class HelloWorld {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void sayHello(){
        System.out.println("Hello:"+name);
    }
}

在新增一个Main类做测试,创建一个HelloWorld对象,设置name,调用sayHello方法:

package com.stuspring;

/**
 * Created by bee on 17/4/22.
 */
public class Main {
    public static void main(String[] args) {
        HelloWorld hw1=new HelloWorld();
        hw1.setName("Doraemon");
        hw1.sayHello();
    }
}

运行结果:

Hello:Doraemon

上面是传统的创建对象的方法,下面通过Spring来创建HelloWorld的对象。

2.2 使用Spring管理对象

首先创建Spring的配置文件,点击resources文件夹,右键->New->XML Configuration File->Spring Config,如下如所示。文件名为beans,

这里写图片描述
这里写图片描述

点击OK以后,会在resources目录下生成beans.xml。
在beans.xml定义一个新的HelloWorld对象,方式如下:

<?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="hw2" class="com.stuspring.HelloWorld">
        <property name="name" value="Timmy" />
    </bean>

</beans>

这里写图片描述

在Main类中获取id为hw2的HelloWorld对象:

package com.stuspring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by bee on 17/4/22.
 */
public class Main {
    public static void main(String[] args) {

        //1.创建一个HelloWorld对象
        HelloWorld hw1=new HelloWorld();
        //2.对name属性赋值
        hw1.setName("Doraemon");
        //3.调用sayHello方法
        hw1.sayHello();


        //1.创建IOC容器对象
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");

        //2.从IOC容器中获取对象
        HelloWorld hw2= (HelloWorld) ctx.getBean("hw2");
        //3.调用sayHello方法
        hw2.sayHello();
    }
}

再次运行,打印结果:

Hello:Doraemon
Hello:Timmy

ClassPathXmlApplicationContext用于加载CLASSPATH下的配置文件,传入参数问文件名,这里就是加载resources目录下的beans.xml,通过ApplicationContext对象的getBean方法获取对象,传入参数为配置文件中bean的id。

在创建IOC容器对象的时候,所有Bean实例都已经初始化完成。可以通过一个简单的方法进行测试,在HelloWorld类的setName方法中打印一行提示信息,增加一个无参构造方法:

package com.stuspring;

/**
 * Created by bee on 17/4/22.
 */
public class HelloWorld {
    private String name;

    public void setName(String name) {
        System.out.println("setName:"+name);
        this.name = name;
    }

    public void sayHello(){
        System.out.println("Hello:"+name);
    }

    public HelloWorld(){
        System.out.println("HelloWorld的无参构造方法!");
    }
}

在Main类的Main函数中只创建一个ApplicationContext对象:

package com.stuspring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by bee on 17/4/22.
 */
public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
    }
}

运行,打印结果如下:

HelloWorld的无参构造方法!
setName:Timmy

三、Bean配置细节

Bean的配置形式:

  1. 基于XML文件的方式
  2. 基于注解的方式

Bean的配置方式:

  1. 通过全类名(反射)
  2. 通过工厂方法(静态工厂方法、实例工厂方法)
  3. FactoryBean

依赖注入的方式:

  1. 属性注入
  2. 构造器注入

Spring容器:

  1. BeanFactory:IOC容器的基本实现,是Spring框架的基础设施,面向Spring本身
  2. ApplicationContext:提供了更高级的特性,是BeanFactory的子接口,面向Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory。

3.1 构造器注入

新建一个Car类,四个属性、2个重载的构造方法、一个toString()方法。

package com.stuspring;

/**
 * Created by bee on 17/4/23.
 */
public class Car {

    private String brand;
    private String corp;
    private double price;
    private int maxSpeed;

    public Car(String brand, String corp, int maxSpeed) {
        this.brand = brand;
        this.corp = corp;
        this.maxSpeed = maxSpeed;
    }

    public Car(String brand, String corp, double price) {
        this.brand = brand;
        this.corp = corp;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", corp='" + corp + '\'' +
                ", price=" + price +
                ", maxSpeed=" + maxSpeed +
                '}';
    }
}

配置bean:

    <!--使用构造器注入属性可以指定参数的位置和参数的类型以区分重载的构造器-->
    <bean id="car1" class="com.stuspring.Car">
        <constructor-arg name="brand" value="Ford" index="0"/>
        <constructor-arg name="corp" value="ShangHai" index="1"/>
        <constructor-arg name="price" value="100000" index="2" />
    </bean>

    <!--属性值可以通过Value子节点进行配置,特殊字符可以使用<![CDATA[]]>包裹-->
    <bean id="car2" class="com.stuspring.Car">
        <constructor-arg name="brand" value="Audi"/>
        <constructor-arg name="corp" >
            <value><![CDATA[<Shanghai>]]></value>
        </constructor-arg>
        <constructor-arg name="maxSpeed" value="280"/>
    </bean>

    <bean id="car3" class="com.stuspring.Car">
        <constructor-arg value="DaZhong"/>
        <constructor-arg value="ShangHai"/>
        <constructor-arg  type="int">
            <value>300</value>
        </constructor-arg>
    </bean>

3.2 Bean之间的引用

应用程序之间的Bean经常需要相互协作以完成应用程序的功能,要使Bean之间能相互访问,就必须在Bean配置文件中指定对Bean的引用。可以通过ref属性指定Bean的引用。

新建一个Person类,有姓名、年龄、拥有的汽车三个属性:

package com.stuspring;

/**
 * Created by bee on 17/4/24.
 */
public class Person {
    private String name;
    private int age;
    private Car car;
    //省略setter、getter和toString()方法

    public Person() {
    }

    public Person(String name, int age, Car car) {
        this.name = name;
        this.age = age;
        this.car = car;
    }
}

在beans.xml中创建Person对象:

    <bean id="person1" class="com.stuspring.Person">
        <property name="name" value="LiHua"/>
        <property name="age" value="28"/>
        <property name="car" ref="car1"/>
    </bean>
    <bean id="person2" class="com.stuspring.Person">
        <property name="name" value="ZhaoHua"/>
        <property name="age" value="29"/>
        <property name="car">
            <ref bean="car2"/>
        </property>
    </bean>

    <!--内部bean,不能被外部引用,只能在内部使用-->
    <bean id="person3" class="com.stuspring.Person">
        <property name="name" value="LiSi"/>
        <property name="age" value="31"/>
        <property name="car">
            <bean class="com.stuspring.Car">
                <constructor-arg name="brand" value="Ford"/>
                <constructor-arg name="corp" value="ShangHai"/>
                <constructor-arg name="price" value="20000"/>
            </bean>
        </property>
    </bean>
    <bean id="person4" class="com.stuspring.Person">
        <constructor-arg name="name" value="Jerry"/>
        <constructor-arg name="age" value="25"/>
        <constructor-arg name="car" ref="car3"/>
    </bean>

    <!--测试null值-->
    <bean id="person5" class="com.stuspring.Person">
        <constructor-arg name="name" value="John"/>
        <constructor-arg name="age" value="31"/>
        <constructor-arg name="car"><null/></constructor-arg>
    </bean>

     <!--级联属性赋值,需要对相应的属性提供setter方法。注意:属性需要先初始化以后再为级联属性赋值-->
    <bean id="person6" class="com.stuspring.Person">
        <constructor-arg name="name" value="Linda"/>
        <constructor-arg name="age" value="33"/>
        <constructor-arg name="car" ref="car1"/>
        <property name="car.maxSpeed" value="240"/>
    </bean>

3.2 Bean的集合属性

集合属性赋值:在xml中可以通过内置的xml标签,例如<List>、<set>、<map>来配置集合属性。

3.2.1 Set属性赋值

一个Person有多个汽车,改进Person类:

package com.stuspring.collections;
import com.stuspring.Car;

import java.util.List;

/**
 * Created by bee on 17/4/24.
 */
public class Person {
    private String name;
    private int age;
    private List<Car> cars;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    public Person() {
    }

    public Person(String name, int age, List<Car> cars) {
        this.name = name;
        this.age = age;
        this.cars = cars;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cars=" + cars +
                '}';
    }


}

在beans.xml中创建bean:

    <bean id="person7" class="com.stuspring.collections.Person">
        <property name="name" value="Mike"/>
        <property name="age" value="29"/>
        <property name="cars">
            <list>
                <ref bean="car1"/>
                <ref bean="car2"/>
                <bean class="com.stuspring.Car">
                    <constructor-arg value="DaZhong"/>
                    <constructor-arg value="ShangHai"/>
                    <constructor-arg type="int">
                        <value>300</value>
                    </constructor-arg>
                </bean>
            </list>
        </property>
    </bean>

把集合独立出来,可以共享被多个bean引用(需要导入util命名空间):

    <!--导入util命名空间 -->
    <util:list id="cars">
        <ref bean="car1"/>
        <ref bean="car2"/>
    </util:list>

    <bean id="person9" class="com.stuspring.collections.Person">
        <property name="name" value="NewPerson"/>
        <property name="age" value="29"/>
        <property name="cars" ref="cars"></property>
    </bean>

3.2.2 Map属性赋值

package com.stuspring.collections;

import com.stuspring.Car;

import java.util.Map;

/**
 * Created by bee on 17/4/24.
 */
public class NewPerson {
    private String name;
    private int age;

    private Map<String,Car> cars;
    //省略setter、getter、无参构造方法、有参构造方法和toString方法

}

配置bean:

    <bean id="person8" class="com.stuspring.collections.NewPerson">
        <property name="name" value="Tina"/>
        <property name="age" value="26"/>
        <property name="cars">
            <map>
                <entry key="AA" value-ref="car1"/>
                <entry key="BB" value-ref="car2"/>
            </map>
        </property>
    </bean>

3.2.3 Properties属性赋值

新建一个DataSource类模拟数据库连接:

package com.stuspring.collections;

import java.util.Properties;

/**
 * Created by bee on 17/4/24.
 */
public class DataSource {

    private Properties properties;

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public Properties getProperties() {
        return properties;
    }

    @Override
    public String toString() {
        return "DataSource{" +
                "properties=" + properties +
                '}';
    }
}

在beans.xml中新建bean:

    <!-- 配置properties-->
    <bean id="dataSource" class="com.stuspring.collections.DataSource">
        <property name="properties">
            <props>
                <prop key="user">root</prop>
                <prop key="password">123456</prop>
                <prop key="jdbcUrl">jdbc:mysql:///test</prop>
                <prop key="driverClass">com.mysql.jdbc.Driver</prop>
            </props>
        </property>
    </bean>

四、命名空间

Spring整合了各种工具,为了简化操作,spring提供了对各种工具的xml scheme 的配置方式。各种命名空间以及相应的定义文件地址:http://www.springframework.org/schema/

导入util和p命名空间,xsi:schemaLocation 指定了用于解析和校验xml的定义文件(xsd)的位置。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-4.3.xsd">
目录
相关文章
|
人工智能 Java API
Spring AI 实战|Spring AI入门之DeepSeek调用
本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。
4627 71
Spring AI 实战|Spring AI入门之DeepSeek调用
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
2635 0
|
11月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
821 2
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
960 1
|
前端开发 Java API
基于 Spring Boot 3 与 React 的 Java 学生信息管理系统从入门到精通实操指南
本项目基于Spring Boot 3与React 18构建学生信息管理系统,涵盖前后端开发、容器化部署及测试监控,提供完整实操指南与源码,助你掌握Java全栈开发技能。
690 0
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
1340 0
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
2990 0
|
存储 安全 Java
Spring Security 入门
Spring Security 是 Spring 框架中的安全模块,提供强大的认证和授权功能,支持防止常见攻击(如 CSRF 和会话固定攻击)。它通过过滤器链拦截请求,核心概念包括认证、授权和自定义过滤器。配置方面,涉及密码加密、用户信息服务、认证提供者及过滤器链设置。示例代码展示了如何配置登录、注销、CSRF防护等。常见问题包括循环重定向、静态资源被拦截和登录失败未返回错误信息,解决方法需确保路径正确和添加错误提示逻辑。
1078 2
Spring Security 入门
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
1212 7
Spring Boot 入门:简化 Java Web 开发的强大工具