目录

  • 前言
  • 大纲总结
  • 1. 概念详解
    • 1.1 IOC与AOP
    • 1.2 IOC与DI
    • 1.3 接口区别
  • 2. 注入方式
    • 2.1 基本类型
    • 2.2 复杂类型
  • 3. 配置属性
  • 4. 注解注入
  • 5. AOP

前言

在看完上一篇文章每个知识点的时候
Spring框架从入门到学精(全)

大部分人对spring还是有些懵懂
可能是知识点比较凌乱所导致
以下这篇文章将带你二刷spring框架
本篇文章主要是理清思路逻辑,有个大纲
学习其细节还需要到上面的文章进行学习

大纲总结

  • IOC方便解耦,简便开发
  • AOP不改变源代码,增加其功能
@Test
    public void testCollection1() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean1.xml");
        类名 对象名 = context.getBean("对象名", 类名.class);
        对象名.test();
    }

1.BeanFactory,只有创建对象才会getBean
2.ApplicationContext是BeanFactory子接口,加载配置就会创建对象
3.ApplicationContext有一些特别的实现类
特别是ClassPathXmlApplicationContext,在src目录下可以写文件名
如果是FileSystemXmlApplicationContext,在src目录下,必须写绝对路径

工厂bean
spring有两种类型,一种是上面的普通bean,另一种是工厂bean
普通bean,在配置文件中,定义的bean类型就是返回类型
而工厂bean返回类型可以不同
1.创建类,让这个类作为工厂bean,实现接口FactoryBean
2.实现接口内的方法,定义返回的bean类型

public class MyBean implements FactoryBean<Course> {

    //定义返回bean
    @Override
    public Course getObject() throws Exception {
        Course course = new Course();
        course.setCname("abc");
        return course;
    }
}

bean作用域scope
singleton 单实例对象,默认是这个。加载spring配置的时候就会创建对象
prototype 多实例对象。调用getBean方法的时候就会创建对象。

外部属性文件引入
引入context的名称空间,用于jdbc.url等
还有<context:component-scan base-package="com.bao"></context:component-scan>扫描包名

xmlns:context="http://www.springframework/schema/context"

注入注解
@Autowired:根据属性类型自动装配
@Qualifier(value=" "):根据属性名称自动注入
@Resource:可根据属性类型或者名称注入
@Value:注入普通类型的注入

切入点切入面
ref为实际增强的类,method为方法名,pointcut-ref为切入点与切入面连接的点

<aop:config>
    <!--切入点-->
    <aop:pointcut id="p" expression="execution(* 全限定名称路径名.buy(..))"/>
    <!--配置切面-->
    <aop:aspect ref="类名">
        <!--增强作用在具体的方法上-->
        <aop:before method="方法名" pointcut-ref="p"/>
    </aop:aspect>
</aop:config>

事务
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败

<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--注入数据源-->
    <property name="dataSource" ref="dataSource"></property>
</bean>

开启事务注解引入名称空间 tx

<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

没有隔离会发生以下三种情况:脏读、不可重复读、虚(幻)读

脏读:一个未提交事务读取到另一个未提交事务的数据(事件回滚,导致A读取B还未提交的事务,应该读取原始数据)
不可重复读:一个未提交的事务,获取到了一个已经提交修改的事务(A读取B提交的事务,正常来说都提交了才能读取)
幻读:一个未提交的数据获取到了另一个事务添加数据

1. 概念详解

1.1 IOC与AOP

主要的核心是IOC(控制反转)和AOP(动态代理)
而这两个核心也是面试的时候经常问的问题

  • IOC:控制反转,也就是控制权反转,传统的方式自个创建对象以及依赖关系等。反转之后,变成了可以由spring自行创建以及依赖关系的注入。总体来说就是反转对象创建方式,将创建的方式提交给spring也就是程序自已来执行。(以前都是自已去new,现在只需要告诉中介需求,中介给你送过来)

  • AOP:动态代理,实现代码增强的功能,而不会显得冗余复杂
    每个代码模块各司其职,灵活组合,达到一种可配置的、可插拔的程序结构

1.2 IOC与DI

上面讲解了IOC的主要概念,现在开始理清DI的概念区别
IOC的控制反转向spring中索取,也就是向中介管理索取
DI 正是实现 IoC 的方法和手段

一个重要特征是反射,它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入

  • 注入方式: 1.set方式注入 2.构造方法注入 3.字段注入
  • 注入类型: 1.值类型注入 2.引用类型注入

1.3 接口区别

  • BeanFactory,Spring内部使用接口,不提供给开发人员,加载配置xml解析不会创建,只有创建对象才会getBean
  • ApplicationContext是BeanFactory子接口,功能强大,开发人员可使用,加载配置就会创建对象

ApplicationContext有一些特别的实现类

  • ClassPathXmlApplicationContext,在src目录下可以写文件名
  • FileSystemXmlApplicationContext,在src目录下,必须写绝对路径

2. 注入方式

2.1 基本类型

set方式注入
值类型用value注入
引用类型用ref注入
无参构造

有参数构造
constructor-arg是有参构造函数的属性

p名称空间注入
set注入,spring特有,为了简化<property>写法
引用名称空间p
xmlns:p="http://www.springframework/schema/p"

注入其他属性

2.2 复杂类型

数组注入

列表注入

set类型注入

map类型注入

注入对象属性

测试文件
以上读取的测试文件通过获取xml文件

3. 配置属性

其中主要通过bean来进行配置
具体各个属性概念大致如下

  • bean元素:spring容器管理对象
  • name属性:对象名字,获得对象时getBean(“name值”)
  • class属性:对象的完整类名
  • id属性:与name属性一样,但该id不可重复

spring中的配置属性具体概念如下
本身默认的时候是单实例
通过测试代码也可得知

所谓的单实例或者是多实例
主要通过配置bean标签内部的scope属性

  • singleton 单实例对象,默认是这个。加载spring配置的时候就会创建对象
  • prototype 多实例对象。调用getBean方法的时候就会创建对象。

还有一个属性是自动装配

bean标签属性autowire,配置自动装配
autowire属性常用两个值:
byName根据属性名称注入 ,注入值bean的id值和类属性名称一样
byType根据属性类型注入

bean生命周期
具体生命周期的步骤如下
从创建对象到对象销毁的过程

1.为构造器创建bean的实列(无参构造)
2.为bean的属性设置和对其他bean引用(调用set方法)
3.bean初始化配置
4.获取bean
5.销毁bean

4. 注解注入

创建对象提供注解
@Component: 游戏中普通的注解
@Service :业务逻辑层以及Service层
@Controller: 外部层
@Repository :dao层即持久层
功能是一样的,都可以用来创建对象,只不过把每个对象用在不同地方,以便查看

以上都要开启组件扫描
通过context的名称空间

而且可以通过该标签设置可过滤还是不可过滤的东西

通过值的注入
@Autowired:根据属性类型自动装配
@Qualifier(value=" "):根据属性名称自动注入
@Resource:可根据属性类型或者名称注入
@Value:注入普通类型的注入

基于注解类,没有了xml,那么就不是扫描xml文件
而是注解类的函数
主要用法如下

5. AOP

动态代理,也就是只增强代码部分

基本的概念

  • 连接点:类中有哪些方法可以被增强,这些方法称之为连接点
  • 切入点:实际被增强的方法
  • 通知(增强):实际增强的逻辑部分称之为通知(增强)
  • 通知有多种类型:前置通知、后置通知、环绕通知(前后执行)、异常通知(只有异常才会通知)、最终通知(类似finally)
  • 切面:把通知应用到切入点的过程,是一个动作的过程

主要通过代理类来实现代码增强的功能
两个最主要的类为

代码截图如下

更多推荐

Spring框架梳理总结(适合多刷)