Spring5笔记1 - IOC、AOP

思维导图:
在这里插入图片描述

目录

1、课程内容介绍 1

1、Spring框架概述
2、IOC容器
(1)IOC底层原理
(2)IOC接口(BeanFactory)
(3)IOC操作Bean管理(基于xml)
(4)IOC操作Bean管理(基于注解)
3、Aop
4、JdbcTemplate
5、事务管理
6、Spring5新特性

1、Spring5 框架概述 1

1、Spring是轻量级的开源的JavaEE框架
2、Spring可以解决企业应用开发的复杂性
3、Spring有两个核心部分:IOC和Aop
(1)IOC:控制反转,把创建对象过程交给Spring进行管理
(2)Aop:面向切面,不修改源代码进行功能增强
4、Spring特点
(1)方便解耦,简化开发
(2)Aop编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(6)降低API开发难度
5、现在课程中,选取Spring版本 5.x

1、Spring5 入门案例 2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、IOC(概念和原理) 5

在这里插入图片描述
在这里插入图片描述

IOC(BeanFactory 接口) 5

在这里插入图片描述

IOC 操作 Bean 管理(概念) 5

1、什么是Bean管理
(0)Bean管理指的是两个操作
(1)Spring创建对象
(2)Spirng注入属性
2、Bean管理操作有两种方式
(1)基于xml配置文件方式实现
(2)基于注解方式实现

IOC 操作 Bean 管理(基于 xml 方式) 6

1、基于xml方式创建对象
2、基于xml方式注入属性
3、第一种注入方式:使用set方法进行注入
4、第二种注入方式:使用有参数构造进行注入
5、p名称空间注入(了解)

1、基于xml方式创建对象

在这里插入图片描述

IOC 操作 Bean 管理(xml 注入其他类型属性)7

1、字面量

(1)null值 <!--null值--> <property name="address"> <null/> </property>
(2)属性值包含特殊符号 <![CDATA[<<南京>>]]>

2、注入属性-外部bean

(1)创建两个类 service类和dao类
(2)在service调用dao里面的方法
(3)在spring配置文件中进行配置

接口

package com.atguigu.spring5.dao;

public interface UserDao {
    
    
    public void update();
}

创建对象不能直接new UserDao,要new 接口的实现类创建对象

实现接口

package com.atguigu.spring5.dao;

public class UserDaoImpl implements UserDao {
    
    

    @Override
    public void update() {
    
    
        System.out.println("dao update...........");
    }
}

service代码

package com.atguigu.spring5.service;

import com.atguigu.spring5.dao.UserDao;
import com.atguigu.spring5.dao.UserDaoImpl;

public class UserService {
    
    

    //创建UserDao类型属性,生成set方法
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
    
    
        this.userDao = userDao;
    }

    public void add() {
    
    
        System.out.println("service add...............");
        userDao.update();
    }
}

测试输出
service add…
dao update…

 @Test
    public void testBean1() {
    
    
        //1 加载spring配置文件
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean2.xml");

        //2 获取配置创建的对象
        UserService userService = context.getBean("userService", UserService.class);

        userService.add();
    }

3、注入属性-内部bean

(1)一对多关系:部门和员工

一个部门有多个员工,一个员工属于一个部门
部门是一,员工是多

(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

在这里插入图片描述

(3)在spring配置文件中进行配置

在这里插入图片描述

4、注入属性-级联赋值 9

(1)第一种写法 (外部bean)

在这里插入图片描述

(2)第二种写法

在这里插入图片描述
在这里插入图片描述

IOC 操作 Bean 管理(xml 注入集合属性)10

1、注入数组类型属性

2、注入List集合类型属性

3、注入Map集合类型属性

(1)创建类,定义数组、list、map、set类型属性,生成对应set方法

在这里插入图片描述

(2)在spring配置文件进行配置

在这里插入图片描述
在这里插入图片描述

4、在集合里面设置对象类型值

Stu类加点东西

//学生所学多门课程
    private List<Course> courseList;
    public void setCourseList(List<Course> courseList) {
    
    
        this.courseList = courseList;
    }

新建个course类

package com.atguigu.spring5.collectiontype;

//课程类
public class Course {
    
    
    private String cname; //课程名称
    public void setCname(String cname) {
    
    
        this.cname = cname;
    }

    @Override
    public String toString() {
    
    
        return "Course{" +
                "cname='" + cname + '\'' +
                '}';
    }
}

在这里插入图片描述

5、把集合注入部分提取出来

(1)在spring配置文件中引入名称空间 util

在这里插入图片描述

(2)使用util标签完成list集合注入提取

package com.atguigu.spring5.collectiontype;

import java.util.List;

public class Book {
    
    
    private List<String> list;
    public void setList(List<String> list) {
    
    
        this.list = list;
    }

    public void test() {
    
    
        System.out.println(list);
    }
}

 <!--1 提取list集合类型属性注入-->
    <util:list id="bookList">
        <value>易筋经</value>
        <value>九阴真经</value>
        <value>九阳神功</value>
    </util:list>

    <!--2 提取list集合类型属性注入使用-->
    <bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>

IOC 操作 Bean 管理(FactoryBean)12

1、Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)

2、普通bean:在配置文件中定义bean类型就是返回类型

3、工厂bean:在配置文件定义bean类型可以和返回类型不一样

第一步 创建类,让这个类作为工厂bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的bean类型
在这里插入图片描述

IOC 操作 Bean 管理(bean 作用域) 12

1、在 Spring 里面,设置创建 bean 实例是单实例还是多实例

2、在 Spring 里面,默认情况下,bean 是单实例对象

单实例对象:两个对象地址一样
多实例对象:两个对象地址不一样

在这里插入图片描述

3、如何设置单实例还是多实例

在这里插入图片描述

IOC 操作 Bean 管理(bean 生命周期)13

1、生命周期

(1)从对象创建到对象销毁的过程

2、bean生命周期

(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)调用bean的初始化的方法(需要进行配置初始化的方法)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)

3、演示bean生命周期

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4、bean的后置处理器,bean生命周期有七步

(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
(4)调用bean的初始化的方法(需要进行配置初始化的方法)
(5)把bean实例传递bean后置处理器的方法 postProcessAfterInitialization
(6)bean可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)

5、演示添加后置处理器效果

(1)创建类,实现接口BeanPostProcessor,创建后置处理器
在这里插入图片描述
配置xml
在这里插入图片描述

在这里插入图片描述

IOC 操作 Bean 管理(xml 自动装配) 15

1、什么是自动装配

(1)根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入

2、演示自动装配过程

部门代码:

package com.atguigu.spring5.autowire;

public class Dept {
    
    
    @Override
    public String toString() {
    
    
        return "Dept{}";
    }
}

雇员代码

package com.atguigu.spring5.autowire;

public class Emp {
    
    
    private Dept dept;
    public void setDept(Dept dept) {
    
    
        this.dept = dept;
    }

    @Override
    public String toString() {
    
    
        return "Emp{" +
                "dept=" + dept +
                '}';
    }

    public void test() {
    
    
        System.out.println(dept);
    }
}

(1)根据属性名称自动注入

在这里插入图片描述

(2)根据属性类型自动注入

<!--实现自动装配 
    bean 标签属性 autowire,配置自动装配 
    autowire 属性常用两个值: 
        byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样 
        byType 根据属性类型注入 
--> 
<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byType"> 
    <!--<property name="dept" ref="dept"></property>--> 
</bean> 
<bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean> 

IOC 操作 Bean 管理(外部属性文件) 16

1、直接配置数据库信息(不常用)

(1)配置德鲁伊连接池
(2)引入德鲁伊连接池依赖jar包
在这里插入图片描述

2、引入外部属性文件配置数据库连接池(常用)

(1)创建外部属性文件,properties格式文件,写数据库信息
在这里插入图片描述

(2)把外部properties属性文件引入到spring配置文件中

  • 引入context名称空间
    在这里插入图片描述
  • 在spring配置文件使用标签引入外部属性文件
    在这里插入图片描述

IOC 操作 Bean 管理(基于注解方式) 17

1、什么是注解

(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化xml配置

2、Spring针对Bean管理中创建对象提供注解

(1)@Component
(2)@Service
(3)@Controller
(4)@Repository

  • 上面四个注解功能是一样的,都可以用来创建bean实例

3、基于注解方式实现对象创建

在这里插入图片描述
在这里插入图片描述
测试代码:

 @Test
    public void testService1() {
    
    
        ApplicationContext context
                = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    }

4、开启组件扫描细节配置

  • 只扫描Controller的注解
    在这里插入图片描述

  • 不扫描Controller的注解
    在这里插入图片描述

5、基于注解方式实现属性注入

第一个Autowired和第二个用的最多

在这里插入图片描述
在这里插入图片描述

针对上面四点,下边是接口和实现接口的类

接口代码:

package com.atguigu.spring5.dao;

public interface UserDao {
    
    
    public void add();
}

实现接口的代码:

package com.atguigu.spring5.dao;

import org.springframework.stereotype.Repository;

@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao {
    
    
    @Override
    public void add() {
    
    
        System.out.println("dao add.....");
    }
}

6、完全注解开发

在这里插入图片描述

AOP(概念)19

1、什么是 AOP

(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能

(3)使用登录例子说明 AOP
在这里插入图片描述

AOP(底层原理)20

在这里插入图片描述

AOP(JDK 动态代理) 20

1、使用JDK动态代理,使用Proxy类里面的方法创建代理对象

在这里插入图片描述

2、编写JDK动态代理代码

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

AOP(术语)22

连接点、切入点、通知(增强)、切面

在这里插入图片描述

AOP 操作(准备工作)23

1、Spring框架一般都是基于AspectJ实现AOP操作

AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spirng框架一起使用,进行AOP操作

2、基于AspectJ实现AOP操作

(1)基于xml配置文件实现
(2)基于注解方式实现(经常使用)

3、在项目工程里面引入AOP相关依赖

资料里的aop依赖文件夹

在这里插入图片描述

4、切入点表达式

在这里插入图片描述
在这里插入图片描述

AOP 操作(AspectJ 注解)重点掌握 24

1、创建类,在类里面定义方法

被增强的类:

在这里插入图片描述

2、创建增强类(编写增强逻辑)

(1)在增强类里面,创建方法,让不同方法代表不同通知类型
在这里插入图片描述

3、进行通知的配置

(1)在spring配置文件中,开启注解扫描

在这里插入图片描述

(2)使用注解创建User和UserProxy对象

在这里插入图片描述

(3)在增强类上面添加注解 @Aspect //增强的类

//增强的类
@Component
@Aspect  //生成代理对象

public class UserProxy {
    
    

(4)在spring配置文件中开启生成代理对象

也就是找有@Aspect 注解的类
在这里插入图片描述

4、配置不同类型的通知

(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置

注意:
after和afterreturning都是在方法后执行,但是after在方法之后就执行,afterreturning是方法返回结果之后再执行。
afeter有没有异常都执行,afterreturning有异常不执行。
在这里插入图片描述
在这里插入图片描述

5、相同的切入点抽取

在这里插入图片描述

6、有多个增强类多同一个方法进行增强,设置增强类优先级

在这里插入图片描述

7、完全使用注解开发

在这里插入图片描述

AOP 操作(AspectJ 配置文件)了解,重点掌握注解方法 26页

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_50736744/article/details/126190371