目录
一、Spring最基本的使用
1.创建Maven项目(不需要模板)
2.添加Spring框架支持
3.添加启动类(没啥可说的符合规范即可)
4.创建bean对象
5.将bean对象注册到Spring中
(a)先在resources文件夹中创建一个xml文件(注意:是test文件用了.xml后缀 不是直接创建一个xml文件)
(b)然后在文件中复制配置代码
(c)然后就可以进行正式的注册bean了
6.取出(使用)bean对象
(a)获取上下文对象
(b)取出bean对象
(c)使用(运行结果)
getbean()的三种用法
1.根据id获取bean(一个String参数)
2.根据class获取bean(一个class参数)
3.根据id和class获取bean(一个String参数和一个class参数)
ApplicationContext和BeanFactory的共同点和不同点
共同点:
不同点:
二、快速存储bean对象
1.创建Maven项目
2.添加Spring框架支持
3.添加启动类
4.创建bean对象
5.复制配置代码
6.添加注解
7.取出bean对象
五大注解
@Bean注解
@Bean的改名功能
三、Bean读取(对象装配\对象注入)
1.属性注入
2.Setter注入
3.构造注入
@Resource注解
Bean的六种作用域:
Spring的主要执行流程
Bean的生命周期
一、Spring最基本的使用
1.创建Maven项目(不需要模板)
注意路径要全英文,路径带中文可能会导致不可预知的错误
2.添加Spring框架支持
在pom.xml文件中添加依赖
可直接复制以下代码
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
注意复制依赖后 不要忘记手动导入
IDEA中直接点击这个
3.添加启动类(没啥可说的符合规范即可)
4.创建bean对象
就是创建一个普通的类
5.将bean对象注册到Spring中
(a)先在resources文件夹中创建一个xml文件(注意:是test文件用了.xml后缀 不是直接创建一个xml文件)
(酱紫操作)
(b)然后在文件中复制配置代码
<?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">
</beans>
(c)然后就可以进行正式的注册bean了
每注册一个bean 就在这加一行标签
id是自定义的名称 class是要注册的bean类名
6.取出(使用)bean对象
在主类中取出对象
(a)获取上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
这个参数就是我们上一步中自己创建的xml文件名
(b)取出bean对象
Test test = (Test)context.getBean("bro");
这个参数是我们自己规定的id
这个类名就是步骤4中自己写的类名
(c)使用(运行结果)
可以看出已经成功了
getbean()的三种用法
1.根据id获取bean(一个String参数)
Test test = (Test)context.getBean("bro");
2.根据class获取bean(一个class参数)
Test test = context.getBean(Test.class);
已经知道它的类型了就不用强转类型了
注意如果同一个类(bean)被注册多次的话会报错
3.根据id和class获取bean(一个String参数和一个class参数)
Test test = context.getBean("bro",Test.class);
ApplicationContext和BeanFactory的共同点和不同点
共同点:
都用来获取Spring上下文对象
不同点:
1.继承关系和功能: ApplicationContext属于BeanFactory 子类,ApplicationContext具备了BeanFactory 所有的功能和能力。BeanFactory只具备最基础访问Bean 的能力。ApplicationContext 具备更多能力,比如国际化支持、资源访问支持等...
2.性能和加载方式: BeanFactory 按需加载,当需要使用Bean 的时候再加载; ApplicationContext一次性加载所有的Bean。
二、快速存储bean对象
1.创建Maven项目
2.添加Spring框架支持
3.添加启动类
4.创建bean对象
前四步和上面一样
5.复制配置代码
还是在resources中创建一个.xml文件(强调!和上次相同 是test格式文件 只是命名用.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:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="Beans"></content:component-scan>
</beans>
这个红色框出的是自定义参数:在哪个范围内搜索bean对象
我在java目录下创建了一个Beans包专门保存bean对象 所以这个参数填Beans
6.添加注解
在要注册的bean类上面加注解(有五种类注解 下面会详细介绍)
7.取出bean对象
我们这次没有在.xml文件里面指定id 那么我们怎么找到这个bean呢?
bean对象默认id为将类名首字母小写
如Test -> test
特殊情况:当类名首字母和第二个字母均为大写时 自动命名为原类名
TEst -> TEst
启动类上是要引用对应类的
五大注解
@Controller [控制器]验证前端传递的参数的(安全检查)
@Service [服务层] 服务调用的编排和汇总
@Repository [仓库(数据仓库....) ](直接操作数据库)
@Component [组件] 通用化的工具类
@Configuration [配置]项目的所有配置
这五大注解的用法都是一样的,功能上没有本质差异,使用不同的注解只是代码规范,增加可读性而已
@Controller、@Service、@Repository、@Configuration都是基于@Component实现的
@Bean注解
@Bean注解是方法注解要和五大注解搭配使用 且适用于有返回对象的方法
首先我们先创建一个想要使用的类
public class Test {
public void hello(){
System.out.println("hello");
}
}
然后在用另一个类去实现Bean注解把它存在Spring中
package Beans;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
@Controller
public class BeanTest {
@Bean
public Test test(){
return new Test();
}
}
然后在运行类里面调用
@Bean的改名功能
那么我们绕这么多弯弯 实现了原来的功能 这有什么意义呢?
那么久引出了@Bean注解的特殊功能! 改名!
还是原来的程序,在@Bean后面加了参数
运行时就会报错
把运行类的getBean参数改成 @Bean的参数
运行成功!
@Bean的参数有三种写法
@Bean(name = "test1")
@Bean("test1") (相较于上一种省略了name=)
@Bean(name = {"test1","test2"}) (一个Bean起多个名字)
三、Bean读取(对象装配\对象注入)
把Bean存入Spring之后的使用,要比获取上下文对象再getbean简单
1.属性注入
在一个类中 把bean作为类对象注入
@Controller
public class Demon1 {
@Autowired
private Test test;
public void mysout(){
test.hello();
}
}
创建了一个Demon类 在里面属性注入test
启动类中调用Demon1 运行成功
(如果你是在其他包中创建的另一个类 记得在.xml中包含新的包)
属性注入优点:简单!
缺点: 1.不能注入final修饰的属性
2.只适用于IoC容器
3.因为简单,滥用风险大(容易违背单一设计原则)
2.Setter注入
(直接右键生成一个Setter方法 在上面加@Autowired)
优点:符合单一设计原则(一个Setter只针对一个对象)
缺点:
1.不能注入一个不可变对象(final)
2.注入对象可能被改变
3.构造注入
右键生成大法万岁!
构造方法是官方推荐的注入方法!
优点:
1.可以注入final修饰的(final自身决定的 可以在两种情况下赋初值1.创建时 2.构造方法 也就解释了为什么前两种不可以)
2.注入对象不会被修改(构造方法只调用一次)
3.依赖对象在被使用前一定会被初始化
4.通用性好,因为构造方法是JDK自带的
没有缺点!如果注入太多参数是程序员的问题(?)
@Resource注解
@Resource注解可以实现属性注入和Setter注入,不能实现构造注入(使用方法)
@Autowired注解是Spring提供的,@Resource是来自JDK下的注解,所以@Resource的通用性更好 @Resource有更多的参数设置
Bean的六种作用域:
作用域就是生命周期,默认情况下 作用域是singleton(单例模式)
1.singleton(单例模式) 只有一个全局对象
单例模式会出现一种问题,就是有一个类,这个类本身的内容是A,这时候甲同学根据自己的需求把它修改成了B,然后乙同学再去使用这个类 它的内容就改变了
2.prototype(原型模式) 每次访问都会创建一个对象
3.request(请求作用域)(只能在Spring MVC中使用) 每次Http请求都会创建一个对象
4.session(会话作用域)(只能在Spring MVC中使用) 每次会话都会创建一个对象(即使是同一个用户)
5.application(全局作用域)(只能在Spring MVC中使用)一个http servlet context中共享一个对象
6.websocket:Http WebSocket作用域(只能在WebSocket中使用)
Bean的作用域设置
一、枚举
枚举方式好一点 因为有自动补全机制
二、参数
Spring的主要执行流程
1.启动容器(启动类运行、加载配置容器)
2.Bean初始化(对配置文件中的Bean进行扫描 只扫描带有注解的)
3.将Bean对象注入到容器中
4.使用Bean
5.Spring销毁
Bean的生命周期
1.实例化(分配内存空间 不是初始化)
2.设置属性(依赖注入)
3.初始化
执行各种通知(方法)(各种 Aware 方法,如 BeanNameAware、BeanFactoryAware、 ApplicationContextAware 的接口方法)
执行前置方法(BeanPostProcessor )
初始化方法(@PostConstruct和init-method )
初始化后置方法(BeanPostProcessor)
4.使用Bean
5.销毁Bean(执行destroy-method|@PreDestroy)