Spring5

目录

1.IOC

1.什么是IOC

2.IOC实现原理

3.IOC(BeanFactory 接口)

4.IOC 操作 Bean 管理(概念)

1.什么事Bean管理

2.Bean管理操作的两种方式

(1).基于xml文件配置的方式

IOC 操作 Bean 管理(FactoryBean)

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

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

1.声明周期

2.Bean的生命周期

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

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

1.什么是自动装配

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

1.什么是注解

2.使用注解步骤

3.基于注解实现属性注入

4.完全注解开发

AOP

1.什么是AOP

2.AOP底层实现原理

第一种 有接口情况,使用 JDK 动态代理

AOP术语

1.连接点

2.切入点

3.通知(增强)

Spring事务

1.什么是事务

2.事务的四个特性

3.spring进行事务管理的两种方法


1.IOC

1.什么是IOC

(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
(2)使用 IOC 目的:为了耦合度降低

2.IOC实现原理

(1)xml 解析、工厂模式、反射

3.IOC(BeanFactory 接口)

1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
2、Spring 提供 IOC 容器实现两种方式:(两个接口)
(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
* 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人
员进行使用
* 加载配置文件时候就会把在配置文件对象进行创建
(3) 接口的两个主要实现类
ClassPathMLApplicationContext(主要用于相对路径)
FileSystemXmlApplicationContext(主要用于绝对路径)

4.IOC 操作 Bean 管理(概念)

1.什么事Bean管理

(0)Bean 管理指的是两个操作
(1)Spring 创建对象
(2)Spirng 注入属性

2.Bean管理操作的两种方式

(1).基于xml文件配置的方式

1.基于xml文件创建对象

        (1)在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
(2)在 bean 标签有很多属性,介绍常用的属性
* id 属性:唯一标识
* class 属性:类全路径(包类路径)
(3)创建对象时候,默认也是执行无参数构造方法完成对象创建

2.基于XML文件方式注入属性(DI)

        依赖注入也就是注入属性

3. 1.通过带参构造方法注入属性

<bean id="stu" class="cn.tedu.pojo12adAWD.Student">
<!--   构造器注入属性-->
   <constructor-arg name="add" value="张三"></constructor-arg>
   <constructor-arg name="name" value="张三"></constructor-arg>
   <constructor-arg name="age" value="张三"></constructor-arg>
</bean>

2.基于set方法注入属性

   <bean id="stu1" class="cn.tedu.pojo12adAWD.Student">
      <property name="name" value="张三"></property>
      <property name="add" value="李四"></property>
      <property name="age" value="王五"></property>
   </bean>

3.注入null值

 <bean id="stu2" class="cn.tedu.pojo12adAWD.Student">
      <property name="age" value="12"></property>
      <property name="add">
         <null/>
      </property>
   </bean>

4.注入特殊符号

 <bean id="stu3" class="cn.tedu.pojo12adAWD.Student">
      <property name="name">
         <value>
            <![CDATA[<<"上海">]]>

         </value>
      </property>
   </bean>

5.注入内部Bean

 <bean id="stu4" class="cn.tedu.pojo12adAWD.Student">
      <property name="name">
         <bean id="str" class="java.lang.String">
         </bean>
      </property>
   </bean>

6.注入外部Bean

<bean id="stu5" class="java.lang.String"></bean>
   <bean id="stu6" class="cn.tedu.pojo12adAWD.Student">
      <property name="name" value="stu"></property>
   </bean>
   <bean id="coll" class="cn.tedu.pojo12adAWD.TestApplicationCollection">

7.注入数组 集合

创建测试类

package cn.tedu.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.stereotype.Controller;

import java.util.*;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@Controller("a")
public class TestApplicationCollection {
    private List arrayList;
    private Set hashSet;
    private Map hashMap;
    private int a[];
}

xml文件

<bean id="coll" class="cn.tedu.pojo12adAWD.TestApplicationCollection">
      <!--数组-->
      <property name="a">
      <array>
         <value>1</value>
      </array>
      </property>
      <property name="arrayList">
   <!--      list集合-->
         <list>
            <value>张三</value>
         </list>
      </property>
      <!--set集合-->
      <property name="hashSet">
         <set>
            <value>张三</value>
         </set>
      </property>
     <!-- map集合-->
      <property name="hashMap">
         <map>
            <entry key="1" value="张三"></entry>
         </map>
      </property>
   </bean>

IOC 操作 Bean 管理(FactoryBean)

1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
2、普通 bean:在配置文件中定义 bean 类型就是返回类型
3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型

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

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

spring默认bean是单实例

2.、如何设置单实例还是多实例

(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象

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

1.声明周期

从创建到销毁的过程

2.Bean的生命周期

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

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

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

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

1.什么是自动装配

根据属性名字或类型自动注入

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

1.什么是注解

1.注解是java代码里面的一种标记

2.注解可以用在类上,方法上,属性上(@Target属性)

3.注解声明周期 (编译时,字节码文件中,运行时)

2.使用注解步骤

创建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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--注解开发只需要指定从哪个包开始扫描
使用了@Component注解的类,自动IOC
base-package需要指定一个包的路径-->
    <context:component-scan base-package="cn.tedu"></context:component-scan>
</beans>

创建用于测试的类

package cn.tedu.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.stereotype.Controller;

import java.util.*;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@Controller("a")
public class TestApplicationCollection {
    private List arrayList;
    private Set hashSet;
    private Map hashMap;
    private int a[];
}

创建测试类

package cn.tedu.pojo;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

/*Spring 默认是单实例
* 如何配置多实例呢?
* 在bean标签里面有scope标签
* 第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象*/
/*
* (1)@Component
(2)@Service
(3)@Controller
(4)@Repository
*/
public class TestApplication {

    public static void main(String[] args) {

        System.out.println(new ClassPathXmlApplicationContext("springapplication.xml").getBean("ss", Student.class) == new ClassPathXmlApplicationContext("springapplication.xml").getBean("tt", Student.class));
        System.out.println(new ClassPathXmlApplicationContext("springapplication.xml").getBean("stu", Student.class));
        System.out.println(new ClassPathXmlApplicationContext("springapplication.xml").getBean("stu1", Student.class));
        System.out.println(new ClassPathXmlApplicationContext("springapplication.xml").getBean("stup", Student.class));
    }
}

3.基于注解实现属性注入

(1)@Autowired:根据属性类型进行自动装配

(2)@Qualifier:根据名称进行注入

(3)@Resource:可以根据类型注入,可以根据名称注入

(4)@Value:注入普通类型属性

代码示例

创建用于测试的类Teacher

package cn.tedu.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.stereotype.Component;

@Data
@Accessors(fluent = true)
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Teacher {
    private String name="jack";
}

创建需要用于测试的类Student

package cn.tedu.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Data
@Accessors(fluent = true)
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Student {
    private String name="李四 ";
    @Autowired//DI依赖注入
    private Teacher t;
}

创建测试类

package test;

import cn.tedu.pojo.Student;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
    public static void main(String[] args) {

        Student student = (Student)new ClassPathXmlApplicationContext("springApplication.xml").getBean("student");
        System.out.println(student);

    }
}

4.完全注解开发

1.创建配置类

package cn.tedu.pojo;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration//代表本类是一个配置类
@ComponentScan(basePackages = {"cn.tedu"})//需要扫描的地方
public class Score {
}

使用配置类代替了xml文件其与使用方法与XML文件相仿

IOC 练习 手写IOC

AOP

1.什么是AOP

(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得
业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能

2.AOP底层实现原理

第一种 有接口情况,使用 JDK 动态代理

代码示例

创建Servce接口

package cn.tedu.aop;

public interface Service {
    public void add();
}

创建Servier实现类

package cn.tedu.aop;

public class ServiceImpl implements Service{
    @Override
    public void add() {
        System.out.println("add()方法");
    }
}

创建测试类

package cn.tedu.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        Class a []={Service.class};
       Service service= (Service)  Proxy.newProxyInstance(Test.class.getClassLoader(), a, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                ServiceImpl service = new ServiceImpl();
                System.out.println("add方法执行之前执行了");
                method.invoke(service,args);
                System.out.println("add()方法执行之后执行了");
                return null;
            }
        });
       service.add();
    }
}

AOP术语

1.连接点

类里面可以有哪些方法被执行

2.切入点

实际上被真正增强的方法

3.通知(增强)

(1)实际增强的逻辑部分称之为通知

4.切面(动作)

把通知应用到切入点的过程

AOP基于注解方式实现

Spring事务

1.什么是事务

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

2.事务的四个特性

(1)原子性
(2)一致性
(3)隔离性
(4)持久性

3.spring进行事务管理的两种方法

编程式事务管理 声明式事务管理
声明式事务管理底层使用的是AOP原理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᥬ᭄?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值