Spring入门

一、Spring概述

1.Spring简介

1.1为什么要Spring

Spring 让每个人都可以更快、更轻松、更安全地编写 Java。Spring 对速度、简单性和生产力的关注 ,使其成为世界上最受欢迎的Java 框架。

1.2Spring是什么

Spring是以IOC(inverse of control控制反转)和AOP(aspect oriented progamming面向切面编程)为内核的轻量级、分层、松耦合的开源框架,提供了企业级复杂性的一站式解决方案,是整合的第三方开源技术的容器

紧耦合可以两个人绑在了一起, 行动起来相互限制。 两个人最好都别动。
松耦合可以比喻为两个人结队行动。 但是没有绳子连接着。行动不怎么受限

1.3Spring的组成

Spring的7大模块

核心容器:核心容器提供 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。

img

二、IOC简单理解

ioc控制反转是一种思想,以后就不需要我们自己去new一个对象,管理一个对象,这些事情全部交给spring去做,spring会自动帮我们去创建 、管理对象,我们只管使用就是。

三、快速入门一个Spring

3.1导入spring相关依赖

<packaging>jar</packaging>


<dependencies>
    <!--spring相关-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.18</version>
    </dependency>
    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>

    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>

3.2创建一个实体类

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    private Integer id;
    private String name;
    private String pwd;
}

3.3创建一个application.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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--注册bean交给spring管理创建、管理、分配  我们不需要做任何事情
    Ioc inverse of control 创建对象的角色反转
    -->
    <bean id="user" class="com.hq.hml.User"></bean>
</beans>

3.4测试

public void Test(){
    //加载配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
    //获取配置文件里面的bean
    Object user = context.getBean("user");
    System.out.println(user);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qkUleIK6-1661496067504)(C:\Users\huang\AppData\Roaming\Typora\typora-user-images\image-20220812152347464.png)]

四、对象的创建和获取

4.1对象的创建

 <bean id="student" name="stu" class="com.hq.hml.Student">
    <!--1.通过构造方法的名称构造-->
       <!-- <constructor-arg name="name" value="杨梅梅"/>
        <constructor-arg name="sex" value="女"/>-->

     <!--2.通过构造方法的索引进行初始化-->
<!--        <constructor-arg index="0" value="杨梅梅"/>-->
<!--        <constructor-arg index="1" value="nv"/>-->

     <!--3.通过构造方法的类型进行初始化-->
        <constructor-arg type="java.lang.String" value="杨梅梅"/>
        <constructor-arg type="java.lang.String" value=""/>
    </bean>

4.2对象的获取

 //加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //获取配置文件里面的bean对象
        //1.强制类型转换
        Student stu = (Student) context.getBean("stu");
        System.out.println(stu);

        //2.通过反射
        Student stu1 = context.getBean("stu", Student.class);
        System.out.println(stu1);

        //通过类型获取(不需要id)
        Student bean = context.getBean(Student.class);
        System.out.println(bean);
    }

五、依赖注入DI(就是赋值)

5.1通过构造方法注入

 <bean id="student" name="stu" class="com.hq.hml.Student">
    <!--1.通过构造方法的名称构造-->
       <!-- <constructor-arg name="name" value="杨梅梅"/>
        <constructor-arg name="sex" value="女"/>-->

     <!--2.通过构造方法的索引进行初始化-->
<!--        <constructor-arg index="0" value="杨梅梅"/>-->
<!--        <constructor-arg index="1" value="nv"/>-->

     <!--3.通过构造方法的类型进行初始化-->
        <constructor-arg type="java.lang.String" value="杨梅梅"/>
        <constructor-arg type="java.lang.String" value=""/>
    </bean>

5.2通过set注入

<bean id="user" name="u" class="com.hq.hml.User">
    <!--DI依赖注入  实际上是set注入
    将属性名首字母大写拼接set 找到set方法-->
    <property name="id" value="1"/>
    <property name="name" value="黄明亮"/>
    <property name="pwd" value="love"/>
    <!--对象注入-->
    <property name="date" ref="date"/>
    <!--数组注入-->
    <property name="list" >
        <list>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </list>
    </property>
    <!--空值注入-->
    <property name="nul"><null/></property>
    <property name="map">
        <map>
            <entry key="1" value="Huang"></entry>
            <entry key="2" value="dddd"></entry>
        </map>
    </property>
</bean>
<bean id="date" class="java.util.Date"/>

5.3通过p和c注入

需要导入依赖

xmlns:p=“http://www.springframework.org/schema/p”

xmlns:c=“http://www.springframework.org/schema/c”

<!-- p空间注入 等价于set注入 -->
<bean id="user1" name="u1" class="com.hqyj.entity.User" p:userName="zhang3"/>
<!-- c空间注入 等价于构造方法注入,构造方法注入必须为每个参数赋值 --> 

<bean id="user2" name="u2" class="com.hqyj.entity.User" c:id="1" 

c:userName="li4" c:password="123"/> 

六、自动装配

自动装配:spring会在应用(配置文件)的上下文中为某个组件寻找其依赖的bean。

本质:

组件扫描(component scanning): spring会自动发现配置文件上下文中所创建的bean。

自动装配(autowiring):spring会自动装配满足bean之间的依赖关系。

6.1byName通过名称自动装配

原理:

​ 查找实体类中属性set方法

​ 将set方法拆分为set+属性,将属性首字母变小写得到字符串

​ 根据字符串寻找spring容器中的id

​ 如果有则装配,如果没有则为null

<bean id="people" class="com.hqyj.entity.People" autowire="byName"> 
<property name="name" value="li4"/> 
</bean> 	

6.2 byType方式通过类型装配

通过类型装配,必须保证spring容器中的类型是唯一的,如果不唯一则会报

<bean id="people" class="com.hqyj.entity.People" autowire="byType">
<property name="name" value="li4"/> 
</bean>

6.3通过注解进行装配

首先开启注解支持并注册三个bean

   <!--开启注解支持-->
    <context:annotation-config></context:annotation-config>

    <!--注册三个bean-->
    <bean id="person" class="com.hq.hml.entity.Person"/>
    <bean id="son" class="com.hq.hml.entity.Son"/>
    <bean id="father" class="com.hq.hml.entity.Father"/>
private String name;
@Autowired//通过byType进行自动装配
@Qualifier("son")//指定name 不能单独使用
private Son son
@Resource(name = "father")//如果没有指定name按照byType装配,等价于 @Autowired和qualifier的结合体
private Father father;

@Qualifier和@Autowired配合使用可以选择id自动装配【推荐】

注意:@Qualifier不能单独使用

七、注解开发

/*为了分层开发的友好 提供了额外的注解
* Repository dao层
* Service  service层
* Controller  controller层
* */
@Component(value = "user")//在xml文件中注册了一个bean value="" 设置别名
public class User {
    @Value("1") //初始化
    private Integer userId;
    @Value("黄明亮")
    private String userName;
    @Value("love")
    private String passWord;
}

只需要在xml文件中开启扫描包即可

<!--开启扫描包-->
<context:component-scan base-package="com.hq.hml.entity"/>

八、spring整合junit

首先在pom文件中导入spring-test 不要忘记刷新maven

         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.8</version>
            <scope>test</scope>
        </dependency>

<dependency> 
    <groupId>junit</groupId>
    <artifactId>junit</artifactId> 
    <version>4.13</version>
    <scope>test</scope>
</dependency>

直接进行测试

@RunWith(SpringJUnit4ClassRunner.class)//以junit方式启动
@ContextConfiguration(locations = "classpath:user.xml")//指定位置
public class TestJunit1 {
    @Autowired//自动装配
    private User user;
    @Test
    public void Test1(){
        System.out.println(user);
    }
}

ersion>4.13
test


直接进行测试

```java
@RunWith(SpringJUnit4ClassRunner.class)//以junit方式启动
@ContextConfiguration(locations = "classpath:user.xml")//指定位置
public class TestJunit1 {
    @Autowired//自动装配
    private User user;
    @Test
    public void Test1(){
        System.out.println(user);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值