Spring
Spring系统架构
1.核心层
Core container核心容器,是Spring最核心的模块
2.AOP层
AOP面向切面的编程思想,Aspects是对AOP思想的具体实现
3.数据层
数据访问:spring中对数据访问的具体实现技术
数据集成:spring支持整合其他的数据层解决方案
transactions:spring中事务管理是AOP的一个具体实现
4.web层:SpringMVC框架
5.Test层,Spring主要整合了Junit进行单元测试
Spring核心概念
IOC、IOC容器,Bean、DI
- IOC容器负责对象的创建和初始化,被创建和管理的对像称为Bean
- 依赖注入:建立Bean与bean之间依赖关系的整个过程
AOP思想
AOP
@EnableAspectJAutoProxy
- 配置类上方,开启注解格式的AOP功能
@Aspect
- 切面类定义上方,设置当前类为OAP切面类
@Pointcut
- 设置切入点方法,value()切入点表达式,切入点依托一个不具有实际意义的方法进行
- 切入点表达式:execution(public User com.project.service.UserService.findById(int))
- execution(* com.project.*.Service.find(…))
方法参数里面为"…"匹配任意参数的方法
五种通知类型
- @Before
- 通知方法再原始切入点方法前运行
- @After
- 通知方法再原始切入点方法后运行
- @Around
- 通知方法再原始切入点方法前后运行
- 方法参数里加入ProceedingJoinPoint pjp,调用pjp.proceed()执行原始操作
- @AfterRuturning
- 原始点正常执行完毕后执行
- @AfterThrowing
- 抛出异常后执行
AOP事务管理
- 在数据层或业务层保障一系列数据库操作的同成功同失败
- 平台事务管理器PlantformTransactionManager
- commit
- rollback
- @EnableTransectionManagement
- 配置类上方开启注解式事务支持
- @Transactional
- 业务层接口 业务类实现类 业务方法上方
- 为当前业务方法添加事务
- 事务配置
- readOnly
- 设置是否只读事务
- timeout
- 设置事务超时时间,-1永不超时
- rollbackFor
- 出现指定异常事务回滚(class)
- rollbackForClassName
- 出现指定异常事务回滚(String)
- noRollbackFor
- 不回滚异常
- noRollbackForClassName
- 不回滚异常
- isolation
- 设置事务隔离级别:默认隔离级别
- READ_UNCOMMITTED:读未提交
- READ_COMMITTED:读已提交
- REPEATABLE_READ:重复读取
- SERIALIZABLE: 串行化
- propagation
- 设置事务传播行为
- 设置事务管理员对所携带事务的处理态度
- readOnly
注解开发
注解开发定义Bean
- Bean注解
- @Component
- @Controller
- 控制层、表现层
- @Service
- 用于业务逻辑层
- @Repository
- 用于持久层、dao层
- @Bean
- 设置方法的返回值作为spring管理的Bean
- Bean作用范围
- @Scope
- Bean生命周期
- @PostConstruct
- 设置方法为初始化方法
- @PreDestroy
- 设置方法为销毁方法
- @PostConstruct
注解开发依赖注入
- 引用类型注入
- @Autowired
- 写在属性上,按照类型自动进行注入
- @Qulifier
- 按名称进行注入,必须跟@Autowried一起使用
- @Autowired
- 简单类型注入
- @value
- 注意数据格式要匹配
- 使用@value(“${value}”)获取配置文件value的值
- @value
纯注解开发模式
- 使用配置类SpringConfig.class代替配置文件SpringConfig.xml
- 配置类的注解
- @ComponentScan
- 记载使用注解定义的Bean
- @Configuration
- 设置该类为spring配置类
- @PropertySource({“xxx.properties”,“xxx.properties”})
- 加载properties文件
- @Import
- 引入需要加载的配置类,有多个配置类使用数组格式一次导入
- @ComponentScan
引入外部配置类
- 第三方bean写在springconfig配置类中不利于分类管理,因此需要按照类别将这些bean配置到不同的配置类中
- @Import
- 引入需要加载的配置类
spring整合
- spring整合Mybatis
- mybatis配置文件
- * 初始化属性数据 * 使用@propertySource,交给spring管理
- * 初始化类型别名 * 为SqlSessionFactory服务的交给spring管理
- * 初始化DataSource
- * 初始化映射配置 * 获取到sqlsession以后执行具体操作时候用的,需要spring单独管理
- mybatis配置文件
- spring整合Junit
- @Runwith(SpringJunit4ClassRunner.class)
- 测试类定义上方,设置Junit运行器
- @ContextConfiguration
- 配置文件
- @ContextConfiguration(classes = 配置类.class)
- 配置类
- @ContextConfiguration(locations={配置文件名,…})
- 配置文件
- @Runwith(SpringJunit4ClassRunner.class)
配置开发
添加SpringConfig文件
Bean相关内容
- 在配置文件中完成Bean的配置
- id:属性表示给bean起名字
id必须唯一 - class:表示给bean定义类型
不能写接口类型,因为接口无法创建对象 - name:定义bean的别名可定义多个,使用逗号、分号、空格分隔
- scope:作用范围
singleton:单例(默认)
prototype:非单例- 单例可避免对象的频繁创建与销毁,达到对bean对象的复用,如果bean对象是有状态对象,成员变量可以存储东西,存在线程安全问题
- id:属性表示给bean起名字
- bean实例化
- 构造方法实例化(常用)
- 底层采用反射,使用类的无参数构造方法
- 静态工厂实例化
- bean里面运行类的class改为工厂类类名,”factory-mehod“工厂类中创建对象的方法名
- 工厂类中静态方法创建运行类
- 实例工厂与FactoryBean
- 实例工厂
- 工厂类中普通方法创建运行类
- 工厂类bean和运行类bean,运行类bean中添加factory-method和factory-bean
- FactoryBean
- 工厂类实现FactoryBean接口,重写getObject()、getObjectType()、isSingleton()方法
isSingleton()设置是否单例
- 工厂类实现FactoryBean接口,重写getObject()、getObjectType()、isSingleton()方法
- 实例工厂
- bean生命周期
- 初始化容器
- 创建对象
- 执行构造方法
- 执行属性注入
- 执行Bean初始化方法
- 方法①:Bean中添加ini-method属性指定初始化方法
- 方法②:实现接口InitializingBean中的afterPropertiesSet方法
- 使用Bean
- 关闭销毁容器
- ClassPathXmlApplicationContext的close()、registerShutdownHook()方法用来关闭容器,close()在调用时关闭,另一个JVM退出前关闭
- Bean销毁时执行的方法
- 方法①:Bean中添加destory-method属性指定销毁方法
- 方法②:实现DisposableBean接口中的destory方法
- 初始化容器
- 构造方法实例化(常用)
DI依赖注入
- setter注入
- 方法
- 在需要注入的Bean中添加若干property标签,name表示配置的属性名称,ref表示参照哪个bean
- 注入引用数据类型:
- 注入简单数据类型:
- 方法
- 构造器注入
- 在需要注入的类中添加带属性的构造方法,在Bean中添加若干constructor-arg标签,name表示配置的属性名称,ref表示参照哪个bean
- 注入多个引用类型,构造方法中有几个属性写几个constructor-arg标签
- 注入简单数据类型,ref改成value
- 自动配置
- 删除property标签,在bean标签中添加autowire属性,只能对引用类型进行注入,不能对简单类型注入
- byType(推荐)
- 保证容器中相同类型的bean唯一
- byName(不推荐)
- 保证容器中有指定名称的bean,耦合度较高
- 集合注入
* 数组
<property name="array">
<array>
<value>100</value>
</array>
</property>
* list
<property name="list">
<list>
<value>100</value>
</list>
</property>
* map
<property name="map">
<map>
<entry key="country" value="china"/>
</map>
</property>
* properties
<property name="properties">
<props>
<prop key="country">china</prop>
</props>
</property>