ssm框架
Spring Boot VS Servlet
使用Spring Boot 项目演示框架相比于servlet所具备的以下优点
- 无需配置tomcat 点击运行按钮就可以运行,(sb内置web容器)
- 快速添加外部jar包
- 快速发布项目(java -jar方式)
- 对象自动装配
Spring Framework系统架构
coew cintainer 核心容器
AOP
Aspects
IoC(inversion of control 控制反转)/DI(dependency inject 依赖注入)
依赖注入
spring是什么?
- 它是包含了多个工具方法的ioc容器,对象的创建和销毁的权利都交给了spring来管理,它本身又具备了存储对象和获取对象的能力
- spring提供了一个容器,称为ioc容器,用来充当ioc思想中的“外部”
功能
- 将对象存入容器
- 从容器中取出对象
IoC和DI是啥,有什么区别?
IoC
- 控制反转,由上级对象创建并控制下级对象,而是下级对象注入当前对象中,当下级发生改变,当前类都是不受影响的
- 使用对象时,主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部
DI
-通过setter方法注入
-通过构造方法注入
bean:
bean 对象 带有某种特征的对象 bean对象默认为单例
适合交给容器进行管理的bean
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
不适合交给容器进行管理的bean
-封装实体的域对象
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- bean 标签配置bean-->
<!-- id属性给bean起名字-->
<!-- class属性表示给bean定义类型 一般为所需对象的实现类的路径-->
<bean id="我的第一个商品" class="com.hututu.ioc3.EmptyClass" />
<!-- 注册新的类,并且进行构造方法注入 -->
<bean id="我的第二个商品" class="com.hututu.ioc3.SecondClass">
<!-- 请用 "我的第一个商品" 的对象,注入我的构造方法参数中 -->
<constructor-arg ref="我的第一个商品" />
</bean>
<!-- setter 方法注入 -->
<!-- property表示配置当前bean属性 -->
<!-- name表示配置具体哪一个属性-->
<!-- ref表示参考哪一个bean-->
<bean id="我的第三个商品" class="com.hututu.ioc3.ThirdClass" >
<property name="emptyClass" ref="我的第一个商品" />
<property name="secondClass" ref="我的第二个商品" />
</bean>
</beans>
spring通过反射机制去实现的,所以当类为private时也可以正常被调用
bean实例化
- 通过构造方法
- 静态工厂
- 实例工厂
==FactoryBean==
public class FactoryBean implements org.springframework.beans.factory.FactoryBean<BookService> {
// 代替原始实例工厂中创建对象的方法
public BookService getObject() throws Exception {
return new BookServiceImpl();
}
@Override
public Class<?> getObjectType() {
return BookService.class;
}
@Override
public boolean isSingleton() {
return true; //单例
// return false; 非单例
}
}
构造方法
package com.hututu.impl;
/**
* @author hututu
* @date 2022/08/12 16:23
**/
public class BookServiceImpl implements BookService{
private BookServiceImpl() {
System.out.println("Bookservice构造方法");
}
@Override
public void save() {
System.out.println("bookservice被调用了");
}
}
静态工厂
public class StaticFactory {
public static Bean createBean(){
return new Bean();
}
}
实例工厂
public class instance_factory {
//无参构造
public instance_factory(){
System.out.println("实例化工厂");
}
public Bean createBean(){
return new Bean();
}
}
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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--构造方法-->
<bean id="bean1" class="com.hututu.static_factory.Bean" />
<!-- 静态工厂-->
<bean id="bean2" class="com.hututu.static_factory.StaticFactory" factory-method="createBean"/>
<!-- 实例工厂-->
<bean id="instance" class="com.hututu.static_factory.instance_factory" />
<bean id="bean3" factory-bean="instance" factory-method="createBean" />
</beans>
bean生命周期
-
初始化容器
1创建对象
2执行构造方法
3执行属性注入
4bean初始化方法 -
使用bean
-
关闭/销毁容器
bean销毁:
手工关闭容器 configurableApplicationContext接口close()操作
注册关闭钩子 在虚拟机退出前先关闭容器再退出虚拟机 configurableApplicationContext接口registerShutdownHook()操作
注解注册
注解(@componment)修饰类
<!-- 扫描这个包的下所有类 -->
<context:component-scan base-package="com.hututu.ioc2" />
@Component 被修饰的类全部注册进spring容器中(实例化过程全部交给spring)
@component
@Controller MVC的C部分(控制器)
@Service 中间数据整合
@Repository 数据获取操作
@Configuration 配置
以上都是可以将类注册进spring中
@Configuration
public class AppConfig {
@Bean
// <bean id="方法名" factory-bean="appConfig" factory-method="hututu"
public String hututu(){
return "胡图图";
}
}
总结
- 直接调用context.getBean(…)
- 使用bean注入 (IoC/DI 广泛使用)
- 构造方法 (推荐)
- setter方法
- 属性直接注入
<!-- 注册新的类,并且进行构造方法注入 -->
<bean id="我的第二个商品" class="com.hututu.ioc2.SecondClass">
<!-- 请用 "我的第一个商品" 的对象,注入我的构造方法参数中 -->
<constructor-arg ref="我的第一个商品" />
</bean>
<!-- setter 方法注入 -->
<bean id="我的第三个商品" class="com.hututu.ioc2.ThirdClass">
<property name="emptyClass" ref="我的第一个商品" />
<property name="secondClass" ref="我的第二个商品" />