Spring

目录

Day1

导包

spring框架
所需jar包
所需jar包2
所需jar包3

spring快速搭建:

  1. 创建一个对象
    在这里插入图片描述
  2. 书写配置注册对象到容器中
    在这里插入图片描述
    导入约束
    在这里插入图片描述
    (class为完整类名,name不做定义,一般为对象名)
  3. 代码测试
    在这里插入图片描述
    (这里ClasspathXmlApplicationContext形参是以src为根目录下的applicationContext路径)

Spring概念

ioc和di概念

Ioc:
在这里插入图片描述
IOC底层原理:xml解析、工厂模式、反射
在这里插入图片描述
Spring提供IOC容器实现两种方式:(两个接口)
(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用

  • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象

(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用

  • 加载配置文件时候就会把在配置文件对象进行创建

di:
在这里插入图片描述
a p p l i c a t i o n C o n t e x t \color{red}{applicationContext} applicationContext B e a n F a c t o r y \color{red}{BeanFactory} BeanFactory两种方式创建容器。
   BeanFactory接口:是spring原始接口.针对原始接口的实现类功能较为单一,BeanFactory接口实现类的容器.特点是每次在获得对象时才会创建对象。
   ApplicationContext:每次容器启动时就会创建容器中配置的所有对象.并提供更多功能,从类路径下加载配置文件: C l a s s P a t h X m l A p p l i c a t i o n C o n t e x t \color{red}{ClassPathXmlApplicationContext} ClassPathXmlApplicationContext,还可以从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext(“d:/xxx/yyy/xxx”)。
   结论:web开发中,使用applicationContext. 在资源匮乏的环境可以使用BeanFactory。
在这里插入图片描述

Spring配置详解

Bean元素:

在这里插入图片描述

spring创建对象的方式(有3种)

1. 空参构造方法 \color{red}{1. 空参构造方法} 1.空参构造方法

在这里插入图片描述

2. 静态工厂(了解)

在这里插入图片描述
在这里插入图片描述

3. 实例工厂(了解)

在这里插入图片描述
在这里插入图片描述
(这种就是先在String中注入工厂对象,由Spring来调用工厂对象创建user对象)

Bean元素进阶

scope属性:

s i n g l e t o n ( 默认值 ) : 单例对象 . 被标识为单例的对象在 s p r i n g 容器中只会存在一个实例。 \color{red}{singleton(默认值):单例对象.被标识为单例的对象在spring容器中只会存在一个实例。} singleton(默认值):单例对象.被标识为单例的对象在spring容器中只会存在一个实例。

p r o t o t y p e : 多例原型 . 被标识为多例的对象 , 每次再获得才会创建 . 每次创建都是新的对象 . 整合 s t r u t s 2 时 , A c t i o n B e a n 必须配置为多例的 . \color{red}{prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的.} prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2,ActionBean必须配置为多例的.

r e q u e s t : w e b 环境下 . 对象与 r e q u e s t 生命周期一致 . \color{green}{request:web环境下.对象与request生命周期一致.} request:web环境下.对象与request生命周期一致.

s e s s i o n : w e b 环境下 , 对象与 s e s s i o n 生命周期一致 . \color{green}{session:web环境下,对象与session生命周期一致.} session:web环境下,对象与session生命周期一致.

生命周期属性(了解) \color{green}{生命周期属性(了解)} 生命周期属性(了解)

   init-method:配置一个方法作为生命周期初始化方法.spring会在对象创建之后立即调用.
   destroy-method:配置一个方法作为生命周期的销毁方法.spring容器在关闭(spring容器的关闭是调用ClassPathXmlApplicationContext中的close方法)并销毁所有容器中的对象之前调用.
在这里插入图片描述

Spring的分模块配置:

在这里插入图片描述

Spring属性注入

(属性注入就是在applicationContext中对容器中的对象设置对该对象中的属性注入值)
注入方式:(有四种)

1. s e t 方法注入(很重要) s e t 方法注入的属性一定要有该属性的 s e t 方法 \color{red}{set方法注入(很重要)set方法注入的属性一定要有该属性的set方法} set方法注入(很重要)set方法注入的属性一定要有该属性的set方法

在这里插入图片描述
在这里插入图片描述

2. 构造函数注入(重要) \color{red}{构造函数注入(重要)} 构造函数注入(重要)

在这里插入图片描述

3. p 名称空间注入 \color{green}{p名称空间注入} p名称空间注入

在这里插入图片描述

4. s p e l 注入 \color{green}{spel注入} spel注入

在这里插入图片描述

5. 复杂类型注入 \color{red}{复杂类型注入} 复杂类型注入:数组、List、Map、Properties(这里的name值对应属性中的对象名)。

数组:

在这里插入图片描述
在这里插入图片描述

List:

在这里插入图片描述
在这里插入图片描述

Map:

在这里插入图片描述

Properties:

在这里插入图片描述

练习:将spring容器应用到struts-crm项目

管理容器在项目中的生命周期
在这里插入图片描述
这是错误的示范.导致每次请求都创建新的容器,所以我们需要一个ServletContext域来和ApplicationContext绑定到一起,使每次项目只需要创建一次就可以使用容器,这就需要监听器来将这两个对象绑定到一起,这一点spring已经帮我们把这个监听器写好了,为ContextLoaderListener,但要导包才能用。
在这里插入图片描述
web.xml中配置容器随项目启动
在这里插入图片描述
然后再在Action中获得容器(这要启动web服务器才能创建Spring容器)
在这里插入图片描述

Day2

使用注解配置spring

步骤:

  1. 为主配置文件引入新的命名空间(约束)
  2. 开启使用注解代理配置文件(在applicationContext.xml中)
    在这里插入图片描述
  3. 在类中使用注解完成配置

将对象注册到Spring容器中:

在这里插入图片描述
这四种效果都一样,只是下面3种用来区分所作用的区域(@Component(“user”)这样写相当于在applicationContext.xml中)

修改对象的作用范围:

在这里插入图片描述
(作用:相当于配置文件中的中的Scope属性功能,不写默认为单例生成)

值类型注入:

在这里插入图片描述通过反射的Field赋值,破坏了封装性,推荐在set方法上写该注解
在这里插入图片描述通过set方法赋值,推荐使用.
@Value还有个用法就是能够取出perproties文件中键对应的值,条件是perproties文件必须先配置在spring配置文件中,如下图:
在这里插入图片描述
在这里插入图片描述在properties文件中的内容
在这里插入图片描述在代码中取值的方式

引用类型注入:

在这里插入图片描述 第一种方式 \color{green}{第一种方式} 第一种方式:它会从Spring容器中找Car对象是否已经注册到容器当中,如果注册了,则自动将Car对象赋值上去。但这种方式有缺点:如果Spring容器中存在注册多个同样类型的类,这种自动装配则不知如何对应上。(但当要注入的属性变量名有和注册在spring容器中的name值一样则不会报错)
在这里插入图片描述
第二种方式 \color{green}{第二种方式} 第二种方式:解决了第一种方式所存在的问题。
在这里插入图片描述
第三种方式 \color{red}{第三种方式} 第三种方式:因为第二种方式要写两步,所以诞生出第三种方式,推荐使用第三种。

初始化|销毁方法:
在这里插入图片描述

spring与junit整合测试

  1. 导包4+2+aop+test:
    在这里插入图片描述
  2. 配置注解:
    在这里插入图片描述
    @RunWith(SpringJUnit4ClassRunner.class)会帮我们创建容器,无需再在方法里写创建容器对象的代码。
  3. 测试:
    在这里插入图片描述

Spring中的aop

spring实现aop(切面编程)的原理
  动态代理(优先):被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术
  cglib代理(没有接口):第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理.


aop名词学习:
在这里插入图片描述

spring中的aop演示

Spring能够为容器中管理的对象生成动态代理对象
步骤:
  1. 导包4+2
在这里插入图片描述
  2. 准备目标对象(这里选用UserServiceImpl作为目标对象)
在这里插入图片描述
  3. 准备通知
在这里插入图片描述
在这里插入图片描述
  4. 配置进行织入,将通知织入目标对象中(配置在一个applicationContext.xml中)
在这里插入图片描述
在这里插入图片描述
(<aop:pointcut expression=… id=…/>作为切入点(要增强的方法),<aop:aspect>为配置通知)

下面是 注解配置 \color{red}{注解配置} 注解配置(可以代替xml配置)前三步都一样
  4. 配置进行织入,将通知织入目标对象中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(有两种配置方式, 第一种 \color{red}{第一种} 第一种是在每一个通知方法前配置相应的注解,然后把表达式写上去,这样有不妥的地方就是你会在每一个通知方法上的注解里写相同的表达式,比较冗余。 第二种 \color{red}{第二种} 第二种是抽取出来,随便定义一个方法,这里以pc方法为例,然后在pc方法上注解配置表达式,后面在其他通知方法上如果要使用,表达式直接写为”MyAdvice.pc()”,如上图)

相关链接:自定义注解实现(spring aop)

Day3

Spring源码

相关链接

spring-beans重点类说明
Spring源码系列- Spring Beans - 核心类的基本介绍
(一)Spring - beans 的两个核心类

FactoryBean

工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型

public class MyBean implements FactoryBean<Course> {
	 //定义返回 bean
	 @Override
	 public Course getObject() throws Exception {
		 Course course = new Course();
		 course.setCname("abc");
		 return course;
	 }
	 @Override
	 public Class<?> getObjectType() {
	 	return null;
	 }
	 @Override
	 public boolean isSingleton() {
	 	return false;
	 }
}
<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean">
</bean>
@Test
public void test3() {
	 ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
	 Course course = context.getBean("myBean", Course.class);
	 System.out.println(course);
}

FactoryBean的作用:假设你依赖一个第三方的类 A,而我们又不能修改第三方的类,并且这个对象创建比较复杂,那么你就可以创建一个 bean 来封装它

obtainFreshBeanFactory方法

这个方法是做什么的?
XmlBeanDefinitionReader是什么作用?

spring启动的顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值