spring框架学习笔记---[spring框架概念,初步上手使用spring,控制反转&依赖注入初步理解](代码片段)

小智RE0 小智RE0     2023-01-30     238

关键词:

spring官网 -->spring官网
spring5.3.12–>spring-framework
在线文档 --> Spring 5.3.12

1.Spring概论

Spring框架是2003年兴起的 一种非侵入式 ; IOC(控制反转)AOP(面向切面编程);的一站式开源的Java开发框架;主要是为简化企业的应用开发而生.

  • (1)轻量级

    它的jar包是比较小的;运行时消耗的内存资源也很小;运行效率高;核心包比较小

  • (2)非侵入式

    这个非侵入式体现在 ; 使用spring框架,不会侵入到核心的代码中;
    比如说要写一个用户的管理相关业务 (涉及到servlet控制 ;service服务;dao数据访问交互 );
    那么啥是侵入式开发呢;举个例子,之前写那个初级web—完成一个基础的学生表增删改查的时候;那个servlet要去继承HttpServlet;还要重写里面的方法然后再去调用数据访问层的代码方法,这样产生的关系,可以理解为一种侵入式

  • (3)IOC(控制反转)

    Inversion of Control;spring核心思想之一;在没有使用spring框架之前的时候;写的程序是需要主动创建对象(随处new 创建对象),控制权在我们这些写代码的开发者手中,而现在要把创建对象的权利交给spring容器去操作;

  • (4)AOP(面向切面编程)

    • Aspect Oriented Programming ;也是spring框架的核心思想之一;由预编译方式运行期间动态代理实现程序功能统一维护的一种技术;
    • 在之前,我们开发常用OOP(Object Oriented Programming面向对象编程) ; 而AOP就是对OOP的一种延续;
    • 举个栗子:比如说现在已经开发出了一套功能比较完善的产品项目;在某天突然又想去增加新的需求功能(和主要的业务关系不大;就比如说我想添加保存日志这个新功能) ; 那么首先想到的是要去更改项目的源代码;但是用AOP的思想处理的话;可以实现动态代理调用方法;
    • (初次看这种过于抽象概念的话,那必然是不好理解的)
  • (5)一站式开发框架
    看看这个体系结构;spring框架可以说是比较全面的框架了;它也提供了对数据服务层;Web层的管理;

    Core Container(核心容器):
    Beans: 管理 Beans
    Core: Spring 核心
    Context: 配置文件
    ExpressionLanguage: SpEL 表达式
    AOP(切面编程)
    Aspects(AOP 框架)
    Data Access(数据库整合):
    JDBC, ORM, OXM, JMS, Transaction
    Web(MVC Web 开发):
    Web, Servlet, Portlet, Struts
    Test(Junit 整合)

2.快速上手试试spring框架,测试一下

学spring这部分的话,由于要建的项目还是比较多的;
那么就先创建个总工程;然后在里面创建不同的module模块来创建不同的spring项目

首先创建一个普通的java项目;删掉src目录

还是选择这个javaEE模块的

直接下一步即可

从零开始,一步一步来;

清理一下自带的maven包

(1)首先是导包–Maven 导入 spring 核心基础 jar

pom.xml下的<dependencies>标签下

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

然后那个后面要进行测试的话,我推荐也导个测试的junit的jar包;

<!--junit测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <!--不会被打包-->
    <scope>provided</scope>
</dependency>

(2) 去创建一个实体类

在创建的pojo包下创建用户类User;

注意涉及到数值相关的类型,建议使用包装类引用类型;
之前学mybatis的时候也经历过;比如说你要在SQL中对传递的属性参数进行判断,用引用类型的话比较好处理

package com.xiaozhi.spring.pojo;

/**
 * @author by CSDN@小智RE0
 * @date 2021-11-09 20:28
 * 用户类
 */
public class User 
    //用户ID,姓名,密码;地址,备注信息;
    private Integer id;
    private String account;
    private String password;
    private String add_ress;
    private String info;
    //初始化;
    public User() 
        System.out.println("无参构造方法调用了");
    

    //注意这里构造方法不包括id;
    public User(String account, String password, String add_ress, String info) 
        System.out.println("有参构造方法调用了");
        this.account = account;
        this.password = password;
        this.add_ress = add_ress;
        this.info = info;
    

    //getter,setter 方法;
    public Integer getId() 
        return id;
    

    public void setId(Integer id) 
        this.id = id;
    

    public String getAccount() 
        return account;
    

    public void setAccount(String account) 
        this.account = account;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public String getAdd_ress() 
        return add_ress;
    

    public void setAdd_ress(String add_ress) 
        this.add_ress = add_ress;
    

    public String getInfo() 
        return info;
    

    public void setInfo(String info) 
        this.info = info;
    

    @Override
    public String toString() 
        return "User" +
                "id=" + id +
                ", account='" + account + '\\'' +
                ", password='" + password + '\\'' +
                ", add_ress='" + add_ress + '\\'' +
                ", info='" + info + '\\'' +
                '';
    

(3) 创建编写配置文件

resources资源目录下创建spring.xml配置文件;
初次搭建的话,比较简单;这里直接把User类配置到其中即可(交给spring去管理);其他的复杂配置啥的都不要着急去写;

<?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">
    
    <!-- id:在这里是唯一标识符  这边class的话,写刚才创建的用户User类的全类名路径-->
    <bean id="user"  class="com.xiaozhi.spring.pojo.User"> </bean>
</beans>

(4) 进行测试

package com.xiaozhi.spring.test;

import com.xiaozhi.spring.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author by CSDN@小智RE0
 * @date 2021-11-09 20:44
 */
public class DemoTest 

    //测试使用;
    @Test
    public void test01()
        //读取配置文件;
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
        //这里创建对象; 参数"user"就是之前在spring.xml配置文件的bean的对应id
        User user0 = (User) ac.getBean("user");
        User user1 = (User) ac.getBean("user");
        System.out.println(user0.hashCode());
        System.out.println(user1.hashCode());
    

这里也没有用new 构造方法的方式去创建对象,就是把类的地址放到那个xml配置文件里面了,它就创建了用户类对象;

测试;可注意到两个对象的哈希值是一样的;

无参构造方法调用了
352359770
352359770

这里在创建对象的时候,如果不想去强制转换为用户类对象,也行;
可以用这个getBean( )方法的另一种传参方式;在后面加上对用户类类型的反射;

//测试使用;
   @Test
 public void test02()
       //读取配置文件;
       ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
       //这里创建对象; 参数"user"就是之前在spring.xml配置文件的bean的对应id
      User user  = ac.getBean("user",User.class);
       User user2 = ac.getBean("user",User.class);
       System.out.println(user.hashCode());
     System.out.println(user2.hashCode());
  


(5)测试结束,再看看几个基本的配置属性

首先,那个bean标签中的id就不用说了,作为bean的标识符;
那么,其实也能用name 属性来标识bean标签 ;而且,这个name还不止能写一个,可以写多个,用,逗号隔开即可;
比如说,我这样配置

<bean  name="u1,u2,u3"  class="com.xiaozhi.spring.pojo.User"> </bean>

测试;也是可以创建用户对象


也可以使用alias配置别名的方式

<!--配置别名-->
    <alias name="user" alias="userqqqq"/>
    <bean id="user"  class="com.xiaozhi.spring.pojo.User"> </bean>

测试调用;


scope作用域属性

  • 默认就是singleton单例模式的;无论getbean几次,取得的都是同一个对象;
  • 也可配置为prototype原型模式的;getBean()的时候都会 new Bean();创建不同的对象;
  • request;每次 http 请求都会创建一个 bean, 仅用于 WebApplicationContext 环境
  • session同一个 http session 共享一个 Bean, 不同 Session 使用不同的 Bean, 仅用于 WebApplicationContext环境

singleton单例模式是默认的,上面测试的时候就已经发现创建的对象哈希值是一样的了;requestsession的话等进行到web部分时进行测试;
那就直接测试原型模式prototype;

<bean id="user"  class="com.xiaozhi.spring.pojo.User" scope="prototype"> </bean>

测试;注意到两次创建的对象不是同一个哈希值;


3.初步学习,看看IOC的知识

IOC是一种设计思想; IOC也称为DI(依赖注入) :Dependency Injection

初步理解的话,可以把IOC看做是用来创建对象的,而DI是为创建好的对象进行赋值

正控:若要使用某个对象,需要自己去负责对象的创建
反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,
不关心对象的创建过程,也就是把创建对象的控制权反转给了 Spring 框架.
目的:降低耦合度
底层实现方式: 解析 xml/扫描注解标签 + 工厂模式 + 反射机制

BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。

刚才的测试就用到了ApplicationContext接口;它是BeanFactory接口的子接口;

更容易与Spring的AOP功能集成
●消息资源处理(用于国际化)
●事件发布
●应用层特定的上下文,例如用于Web应用程序的WebApplicationContext
BeanFactory提供 了配置框架和基本功能ApplicationContext添加了 更多特定于企业应用的功能


4. springXML方式进行依赖注入

方式有两种;一种是通过构造方法注入;一种是通过set方法注入

(1)构造方法注入

name:按照构造方法的参数名注入

<!--先试试构造方法依赖注入-->
<!--(1)试试name; 构造方法的参数名;  后面的value进行赋值-->
<bean id="user"  class="com.xiaozhi.spring.pojo.User" scope="prototype">
<constructor-arg name="account" value="小智RE0"/>
<constructor-arg name="password" value="lzq123"/>
<constructor-arg name="add_ress" value="陕西汉中"/>
<constructor-arg name="info" value="暂时没有备注"/>
</bean>

测试一下

//测试构造方法注入 ;
@Test
public void test06()
    //读取配置文件;
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    //这里创建对象;
    User user  = ac.getBean("user",User.class);
    System.out.println(user);

有参构造方法调用了
Userid=null, account='小智RE0', password='lzq123', add_ress='陕西汉中', info='暂时没有备注'

type: 通过构造方法参数的类型注入

<!--先试试构造方法依赖注入-->
<!--(2)试试 type 构造方法的参数类型-->
<bean id="user"  class="com.xiaozhi.spring.pojo.User" scope="prototype">
    <constructor-arg type="java.lang.String" value="小智RE0"/>
    <constructor-arg type="java.lang.String" value="lzq123"/>
    <constructor-arg type="java.lang.String" value="陕西汉中"/>
    <constructor-arg type="java.lang.String" value="二次备注"/>
</bean>

测试;也是可以注入的;

index : 通过构造方法参数的下标注入

注意,这个index的下标是从0开始的;

<!--先试试构造方法依赖注入-->
<!--(3)试试 type 构造方法的参数类型-->
<bean id="user"  class="com.xiaozhi.spring.pojo.User" scope="prototype">
    <constructor-arg index="0" value="小智RE0"/>
    <constructor-arg index="1" value="lzq123"/>
    <constructor-arg index="2" value="陕西汉中"/>
    <constructor-arg index="3" value="三次备注"/>
</bean>

测试;这样注入也是可行的

(2) set方法注入

首先,要注意的是,用set方法注入,那个实体类里面要先写上属性的setter方法;

<!--试试set方法注入-->

<bean id="user"  class="com.xiaozhi.spring.pojo.User" scope="prototype">
    <property name="account" value="小智"/>
    <property name="password" value="123654"/>
    <property name="add_ress" value="陕西汉中"/>
    <property name="info" value="备注"/>
</bean>

测试

你要是把setter方法删了,它就没办法注入了;

类型是集合list类型的话;
首先暂时给用户类写上属性

//集合类型的属性;
    private List<String> re0;

    public List<String> getRe0() 
        return re0;
    

    public void setRe0(List<String> re0) 
        this.re0 = re0;
    
    
    @Override
    public String toString() 
        return "User" +
                "id=" + id +
                ", account='" + account + '\\'' +
                ", password='" + password + '\\'' +
                ", add_ress='" + add_ress + '\\'' +
                ", info='" + info + '\\'' +
                ", re0=" + re0 +
                '';
    

set注入的话,直接按list注入

<bean id="user"  class="com.xiaozhi.spring.pojo.User" scope="prototype">
    <property name="account" value="小智"/>
    <property name="password" value="123654"/>
    <property name="add_ress" value="陕西汉中"/>
    <property name="info" value="备注"/>
    <property name="re0">
        <list>
    

java学习笔记:spring框架

1.什么是Spring?  1.1spring是一个开源框架  1.2spirng为简化企业级应用开发而生,使用spring可以使简单的JavaBean实现以前只有EJB才能实现的功能  1.3spring是一个IOC(DI)和AOP容器框架2.Spring入门示例     2.1HelloWorld.javapacka... 查看详情

spring框架学习笔记——配置bean

1、属性注入(1)根据setter方法属性注入,这里使用的是property标签。需要bean属性提供对应的setter方法,比如笔记(1)里的HelloWorld使用的就是这种方法。<!--根据setter方法属性注入--><beanid="helloworld"class="com.broadtext.beans.Hello... 查看详情

学习笔记--spring框架

//概述轻量级,一站式,开发框架IoC,InversionofControl,控制反转DI,DependencyInjection,依赖注入AOP,Aspect-OrientedProgramming,面向切面编程:业务逻辑与非业务逻辑分离,如日志、安全...IoC容器:对象创建、装配对象生命周期管理上... 查看详情

spring学习笔记

1.Spring框架的描述   1.Spring是一个开源框架   2.Spring为简化企业级应用开发而生   3.Spring是一个IoC/DI和AOP容器框架2.具体描述Spring   1.轻量级:Spring是非侵入式的-基于Spring开发的应用中的对象可以不依赖于Spring的API   2.... 查看详情

spring框架学习笔记---[spring框架概念,初步上手使用spring,控制反转&依赖注入初步理解](代码片段)

spring官网-->spring官网spring5.3.12–>spring-framework在线文档-->Spring5.3.12文章目录1.Spring概论2.快速上手试试spring框架,测试一下(1)首先是导包--Maven导入spring核心基础jar(2)去创建一个实体类(3)创建编写配置文件(4)进行测试(5)测试结... 查看详情

spring学习笔记

spring课堂笔记框架:一个java应用程序的半成品项目,该项目中对java的软件开发进行了一部分的封装和定义标准,我们使用时 只需要学习框架,则会学会使用该框架开发新项目,再开发中使用框架可以提高开发效率,有利于团队... 查看详情

spring框架学习笔记---[spring框架整合mybatis框架](代码片段)

文章目录Spring框架整合Mybatis框架(1)导入需要使用的maven包(2)实体类,数据访问层,服务层,以及数据访问映射文件📢创建实体类Person📢数据访问接口PersonMapper📢服务层PersonService📢数据访问映射文件PersonMapper.xml(3)不... 查看详情

hspspring学习笔记

一、Spring是什么及快速入门案例1、spring纵跨三层spring纵跨web层、业务层、dao层,接管这三层,配置bean,维护bean关系(1)Struts是web框架(jsp/action/actionform)(2)hibernate是orm框架,处于持久层(3)spring是容器框架,用于配置bean... 查看详情

spring学习笔记--环境搭建和初步理解ioc

  Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hibernate等其他众多的框架.  下面介绍环境的搭建,首先下载好spring的完... 查看详情

spring讲解笔记:spring框架学习的要点总结

...手动创建对象(也就是new)的操作,反转到由spring容器来进行创建并进行管理。目的:解耦。*****DI依赖注入,由spring容器根据所管理的bean之间的依赖关注,自动进行注入赋值,替代了原来手动给对象... 查看详情

《一头扎进spring4》学习笔记简介与helloworld实现

第一讲问候Spring4第一节简介Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。1、框架特征轻量——从大小与开销... 查看详情

spring源码学习笔记

Spring源码学习笔记(七)  前言--    最近花了些时间看了《Spring源码深度解析》这本书,算是入门了Spring的源码吧。打算写下系列文章,回忆一下书的内容,总结代码的运行流程。推荐那些和我一样没接触过SSH框架源码... 查看详情

spring学习笔记01

1.Spring简介     Spring是为企业提供的一个轻量级的解决方案,包括:基于依赖注入的核心机制,基于AOP的声明式事务管理,与多种持久层技术的集合以及优秀的WEBMVC框架等。Spring框架的组成结构:   &... 查看详情

spring框架学习——aop的认识与使用(代码片段)

文章目录Spring框架学习(八)——AOP的认识与使用一、SpringAOP常用概念及铺垫二、通知的介绍(1)before前置通知(2)after后置通知(3)around环绕通知(4)afterReturning返回后通知(5) 查看详情

spring框架学习笔记---[在spring中初步上手使用注解开发;以及jdbc的初步使用](代码片段)

spring官网-->spring官网spring5.3.12–>spring-framework在线文档-->Spring5.3.12文章目录1.初步上手注解开发(1)首先试试xml进行配置的方式(2)快速上手注解开发过程2.其他的注解使用(1)==@Component(value="user")==;(2) 查看详情

spring学习笔记(代码片段)

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。Spring一.SpringFrameworkSpring是一个轻量级框架,目的是为了让对象之间的耦合性降低(解耦),方便后期代码的维护;Spring... 查看详情

spring学习笔记(代码片段)

参考狂神说视频学习Spring框架Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度... 查看详情

一周掌握flask框架学习笔记flask概念及基础(代码片段)

Flask概念及基础为什么要用Web框架Web应用程序的本质使用WEB框架的优点Flask简介:Flask与Django对比框架之间的差别Flask安装环境1、创建目录用来存放虚拟环境2、打开~/.bashrc文件,并添加如下:3、运行4、进入虚拟环境5... 查看详情