本周学习了Spring框架,对Spring的思想有了初步的理解,掌握了简单的使用方法,使用Typora简略的整理了学习过程中的笔记。
Spring架构
IoC概念
IoC控制反转:对象的创建控制权由程序转移到外部,即不要主动的new对象,要由外部提供对象
Bean
别名配置
作用范围
bean默认为单例。
适合交给容器进行管理的bean:表现层对象,业务层对象,数据层对象,工具对象
不适合的:封装实体的域对象
Bean实例化
- 使用构造方法,调用默认的无参构造函数
- 静态工厂(了解)
- 实例工厂(了解)
- 使用FactoryBean*****
生命周期
生命周期控制
- 使用生命周期控制方法
- 实现接口
经历阶段
- 初始化容器:创建对象,执行构造方法,执行属性注入(set),执行bean初始化方法
- 使用bean:执行业务操作
- 关闭容器:执行bean销毁方法
关闭容器方法
依赖注入
setter注入
- 引用类型注入
- 基本类型注入
构造器注入
- 引用类型注入
- 基本类型注入
注入方式选择
自动装配
- 自动装配用于引用类型注入,不能对简单类型操作
- 使用byType必须保证容器中相同类型的bean唯一,推荐使用
- 使用byName必须保证容器内有指定名称的bean,因变量名与配置耦合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配失效
配置中使用bean
标签的autowire
属性设置自动装配的类型,byType
按类型,byName
按名称
集合注入
array
<property name="array">
<array>
<value>1</value>
<value>2</value>
</array>
</property>
list
<property name="list">
<list>
<value>a</value>
<value>b</value>
</list>
</property>
set
<property name="set">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
map
<property name="map">
<map>
<entry key="a" value="1"/>
<entry key="b" value="2"/>
</map>
</property>
properties
<property name="properties">
<props>
<prop key="a">1</prop>
<prop key="b">2</prop>
</props>
</property>
加载properties文件
注意事项:
容器
容器是什么
从代码上:一个Spring容器就是某个实现了ApplicationContext接口的类的实例。也就是说,从代码层面,Spring容器其实就是一个ApplicationContext(一个实例化对象)。
- Java项目中:实现了
org.springframework.context.ApplicationContext
接口的实现类 - Web项目中:使用spring.xml——Spring的配置文件
创建容器方式
获取bean方式
容器类层次结构
注解开发
注解开发定义Bean
实现类中:
@Component("bookDao")
public class bookDaoImpl implements bookDao{}
配置文件中:
<context:component-scan base-package="com.cywscs"/>
@Component
注解的衍生注解:
@Controllor
用于表现层Bean的定义@Service
用于业务层Bean的定义@Repository
用于数据层Bean的定义
纯注解开发
使用配置类代替xml配置文件
@Configuration //设定当前类为配置类
@ComponentScan(com.cywscs) //设定扫描路径,只能添加一次,多个数据用数组格式
Bean的属性指定
@Scope //指定Bean的单例,非单例模式
@PostConstruct //指定Bean初始化方法
@PreDestroy //指定Bean销毁方法
依赖注入(自动装配)
引用类型
使用@Autowired
注解开启自动装配模式
@Service("bookService")
public class bookServiceImpl implements bookService {
@Autowired
private bookDao bookDao;
}
- 自动装配基于反射设计创建使用对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
- 自动装配建议使用无参构造函数创建对象
使用@Qualifier
注解为指定名称装配Bean
@Service("bookService")
public class bookServiceImpl implements bookService {
@Autowired
@Qualifier("bookDao")
private bookDao bookDao;
}
基本类型
使用@Value
注解
加载properties文件
第三方Bean管理
将独立的配置类加入SpringConfig核心配置:
- 导入式
- 扫描式
第三方Bean的依赖注入
- 基本类型:传入成员变量
- 引用类型:传入方法形参
XML与注解对比
整合MyBatis
- 导入坐标
- 编写配置类
整合Junit
-
导入
junit
spring-test
坐标 -
添加测试类,进行配置
AOP
面向切面编程,在不惊动原始设计的基础上为其进行功能增强
核心概念
图例:
入门
- 导入坐标
- 定义通知类,编写通知
- 定义切入点
- 绑定切入点与通知的关系,并指定通知添加到原始连接点的具体执行位置
public class myAdvice{
@Pointcut("execution(void com.cywscs.bookDao.save())")
private void pt(){}
@Before("pt()")
public void before(){
}
}
- 为通知类添加
@Component
@Aspect
注解,定义当前类受Spring容器管理,定义为切面类 - 为Spring配置类添加
@EnableAspectJAutoProxy
注解,开启AOP注解支持
AOP工作流程
- Spring容器启动
- 读取所有切面配置的切入点
- 初始化Bean,判定Bean对应的类中的方法是否匹配到任意接入点
- 匹配失败,创建对象
- 匹配成功,创建原始对象的代理对象
- 获取bean执行方法
- 获取bean,调用方法并执行
- 获取的bean为代理对象时,根据代理对象的运行模式运行原始方法与增强的内容
SpringAOP本质:代理模式
切入点表达式
切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述方式
按接口描述:
execution(void com.cywscs.dao.BookDao.update())
按实现类描述:
execution(void com.cywscs.dao.impl.BookDaoImpl.update())
切入点表达式标准格式
动作关键字(访问修饰符 返回值 包名.类/接口.方法名(参数)异常名)
访问修饰符、异常名可省略
通配符描述
书写规范
AOP通知类型
前置通知
后置通知
环绕通知
注意事项: