目录
- Day1
- 导包
- spring快速搭建:
- Spring概念
- Spring配置详解
- Spring属性注入
- 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值对应属性中的对象名)。
- 练习:将spring容器应用到struts-crm项目
- Day2
- Day3
- Spring源码
Day1
导包
spring快速搭建:
- 创建一个对象
- 书写配置注册对象到容器中
导入约束
(class为完整类名,name不做定义,一般为对象名) - 代码测试
(这里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
步骤:
- 为主配置文件引入新的命名空间(约束)
- 开启使用注解代理配置文件(在applicationContext.xml中)
- 在类中使用注解完成配置
将对象注册到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整合测试
- 导包4+2+aop+test:
- 配置注解:
@RunWith(SpringJUnit4ClassRunner.class)会帮我们创建容器,无需再在方法里写创建容器对象的代码。 - 测试:
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是什么作用?