Spring框架学习笔记(1) ---[spring框架概念 , 初步上手使用Spring , 控制反转 依赖注入初步理解 ]
spring官网 -->spring官网
spring5.3.12–>spring-framework
在线文档 --> Spring 5.3.12
文章目录
- 1.Spring概论
- 2.快速上手试试spring框架,测试一下
- (1)首先是导包--Maven 导入 spring 核心基础 jar
- (2) 去创建一个实体类
- (3) 创建编写配置文件
- (4) 进行测试
- (5)测试结束,再看看几个基本的配置属性
- 3.初步学习,看看IOC的知识
- 4. springXML方式进行依赖注入
- (1)构造方法注入
- name:按照构造方法的参数名注入
- type: 通过构造方法参数的类型注入
- index : 通过构造方法参数的下标注入
- (2) set方法注入
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的思想处理的话;可以实现动态代理调用方法; - (初次看这种过于抽象概念的话,那必然是不好理解的)
- Aspect Oriented Programming ;也是spring框架的核心思想之一;由
(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;}@Overridepublic 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 {//测试使用;@Testpublic void test01(){//读取配置文件;ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");//这里创建对象; 参数"user"就是之前在spring.xml配置文件的bean的对应idUser 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( )
方法的另一种传参方式;在后面加上对用户类类型的反射;//测试使用;@Testpublic void test02(){//读取配置文件;ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");//这里创建对象; 参数"user"就是之前在spring.xml配置文件的bean的对应idUser 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
单例模式是默认的,上面测试的时候就已经发现创建的对象哈希值是一样的了;request
和session
的话等进行到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);
}
有参构造方法调用了
User{id=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;}@Overridepublic 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><value>菜月昴</value><value>爱蜜莉雅</value><value>蕾姆</value></list></property>
</bean>
测试
Spring框架学习笔记(1) ---[spring框架概念 , 初步上手使用Spring , 控制反转 依赖注入初步理解 ]相关推荐
- Spring 的控制反转/依赖注入
第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...
- Spring框架学习笔记07:基于XML配置方式使用Spring MVC
文章目录 一.Spring MVC概述 1.MVC架构 2.Spring MVC 3.使用Spring MVC的两种方式 二.基于XML配置与注解的方式使用Spring MVC (一)创建Spring ...
- Spring.NET学习笔记13——AOP的概念(基础篇) Level 200
上篇我们简单的了解了AOP的应用场景,知道AOP编程的重要性.这篇我们先看一段代码,来开始今天的学习. 回顾与上篇类似的代码:SecurityService类的IsPass判断用户名为"ad ...
- 控制反转/依赖注入概念
控制反转概念 控制反转是影响广泛的设计模式,其主要目的就是为了管理对象之间的关系,为对象之间解除耦合,把对象生命周期的管理和关系的管理这些和对象个体无关的公共任务交给公共容器处理. 控制反转有如下好处 ...
- Spring框架学习笔记08:基于Java配置方式使用Spring MVC
文章目录 一.基于Java配置与注解的方式使用Spring MVC 1.创建Maven项目 - SpringMVCDemo2020 2.在pom.xml文件里添加相关依赖 3.创建日志属性文件 - l ...
- Celery 框架学习笔记(分布式框架)
在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...
- 【Spring实战学习笔记】第4章 面向切面的Spring
目录 4.1 什么是面向切面编程 4.2 通过切点来选择连接点 4.3 使用注解创建切面 4.4 在XML中声明切面 4.5 注入AspectJ切面 4.6 小结 在软件开发中,散布于应用中多处的功 ...
- Spring.NET学习笔记——目录(原)
目录 前言 Spring.NET学习笔记--前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1--控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- JeeSite 框架学习笔记
JeeSite 框架学习笔记 目录 JeeSite 框架学习笔记 一.全局配置 1. 获取 Resource资源实际路径 DefaultResourceLoader 2. 配置前端 js css 二. ...
最新文章
- 目标检测中如何定义正负样本,和正负样本在学习过程中loss计算起的作用
- 『ExtJS』01 001. ExtJS 4 类的定义
- python pandas rename_使用Pandas重命名文件
- 如何造出逼真图像?南洋理工Zheng博士论文《基于深度生成学习的逼真图像合成》197页pdf阐述视觉合成工作...
- .net core项目部署到centos7
- PostgreSQL数据库服务端监听设置及客户端连接方法教程
- 【POJ】1742 coins 【背包问题】
- python xlwings追加数据_大数据分析Python库xlwings提升Excel工作效率教程
- Flask框架(一)
- 对C#中的Close()和Dispose()的浅析
- 使用 Visual Studio 发布 .NET 控制台应用程序
- 睿智的目标检测26——Pytorch搭建yolo3目标检测平台
- 【转载】批量维护(创建/修改)客户主数据函数 SD_CUSTOMER_MAINTAIN_ALL BP自定义屏幕 数据维护
- 计算机网络:随机访问介质访问控制之ALOHA协议
- 投票服务器维护时间,【维护】4月1日官方维护公告(正式服)
- Android 实现分割线的几种方式
- 国标28181:什么是RTP协议与RTCP协议
- 共享出行的最后一片战场
- n个企业的古诺模型中的纳什均衡
- ArcGIS三维网络分析
热门文章
- 摇骰子计算骰子点数之和(骰子个数可改变)
- 数理逻辑:证明与反驳
- 在线培训系统搭建,简单成熟的部署方式,助力企业拥有培训平台
- 2022-2027年中国女性向游戏行业发展监测及投资战略研究报告
- 用c语言对文件的写入和保存,C++_C语言中对文件最基本的读取和写入函数,C语言read()函数:读文件函数( - phpStudy...
- 软件工程在20世纪80年代以来获得的主要成果有CASE Computer-Aided Software Engineering产品,软件工程的概念?
- 持续绩效管理带来的积极反馈文化
- 阴阳师魂土简单循环(思路篇)
- 免费试用Windows Azure云平台(无须提供信用卡)
- bugku-writeup-web-文件包含