Spring

1.学习 Spring

1.1 简介

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>

1.2 优点

  • spring是一个开源的免费的框架
  • spring 是一个轻量级的,非侵入式的框架
  • 控制反转(IOC),面向切面编程(AOP)!!!!!
  • 支持事务的处理,对框架整合的支持

6.依赖注入

6.1、构造器注入

6.2、Set方式注入【重点】

  • 依赖注入:Set注入
    • 依赖:bean对象的创建依赖于容器
    • 注入:bean对象中的所有属性,由容器来注入

【环境搭建】

  1. 复杂类型
package com.xiao.pojo;

public class Address {
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
  1. 真实测试对象
public class Student {
    private String name;
    private  Address address;
    private  String[] books;
    private List<String> hobby;
    private Map<String,String>card;
    private Set<String> games;
    private Properties info;
    private  String wife;
  1. beans.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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!-- 第一种:普通值注入 :value   -->
    <bean id ="student" class="com.xiao.pojo.Student">
        <property name="name" value = "肖"/>
    </bean>

</beans>
  1. 测试类
public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student.getName());
    }
}

  1. 完善注入信息
        <!-- 第一种:普通值注入 :value   -->

    <bean id="address" class="com.xiao.pojo.Address"/>
    <bean id ="student" class="com.xiao.pojo.Student">
        <property name="name" value = "肖"/>
        <!-- 第二种:Beans注入,ref   -->
        <property name="address" ref="address"/>
        <!-- 第三种:数组注入,ref       -->
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>西游记</value>
                <value>水浒传</value>
                <value>三国演义</value>
            </array>
        </property>
        <!-- list       -->
        <property name="hobbys">
            <list>
                <value>听歌</value>
                <value>敲代码</value>
                <value>看剧</value>
            </list>
        </property>
        <!-- map       -->
        <property name="card">
            <map>
                <entry key="身份证" value="11111111111111111"/>
                <entry key="银行卡" value="122222222222222112"/>

            </map>
        </property>
        <!-- Set       -->
        <property name="games">
            <set>
                <value>LOL</value>
                <value>COC</value>
                <value>BOB</value>
            </set>

        </property>
        <!-- null       -->
        <property name="wife">
            <null/>
        </property>
        <!-- Properties       -->
        <property name="info">
            <props>
                <prop key="学号">19103224</prop>
                <prop key="性别"></prop>
                <prop key="username">root</prop>
            </props>
        </property>
    </bean>


</beans>

6.3、拓展方式注入

p和c

注意点:p命名和c命名空间不能直接使用,需要导入xml约束

6.4、bean的作用域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSGZdhJD-1603897512110)(C:\Users\Administrator.SC-202001221340\AppData\Roaming\Typora\typora-user-images\image-20201024224020154.png)]

7.bean的自动装配

  • 自动装配是Spring满足bean依赖的一种方式
  • Spring会在上下文中自动寻找,并给出bean装配属性

在Spring中有三种装配方式

  1. 在xml中显示的配置
  2. 在java中显示配置
  3. 隐式的自动装配bean【重要】

7.1、测试

7.2、ByName自动装配

7.3、ByType自动装配

小结:

  • ByName的时候,需要保证所有的bean的id唯一,并且这个bean需要和自动注入的属性的set方法一致
  • ByType的时候,需要保证所有的bean的classid唯一,并且这个bean需要和自动注入的属性的类型一致

7.4、使用注解实现自动装配

jdk1.5支持的注解,Spring2.5就支持注解了

要使用注解须知:

1.倒入约束 context约束

2.配置注解的支持:context:annotation-config/【重要】

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>

@Autowired

直接在属性上面使用即可!也可以在set方式上面使用

使用Autowured我们可以不用编写Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器钟存在且符合咱们的名字!

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注释【@Autowired】完成的时候,我们可以使用】@Qualifter(value=“xxx”)去配合使用,指定一个唯一的bean对象注入!

@Resource功能最强大(没有仔细看)!通过byType实现,他们两个都是常用的!

执行顺序不同:

@Resource

8、使用注解开发

在spring4之后,要是用注解开发。必须要保证aop的包导入了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SvSPyagp-1603897512111)(C:\Users\Administrator.SC-202001221340\AppData\Roaming\Typora\typora-user-images\image-20201025084448429.png)]】

使用注解需要导入context约束,增加注解的支持

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启注解的支持-->
    <context:annotation-config/>
  1. bean
  2. 属性如何注入
  3. 衍生的注解
  4. @Component有几个衍生的注解,我们在web开发中,会按照mvc三层架构分层!
  • dao【@repository】
  • service【@Service】
  • controller【@Controller 】

​ 这四个注解都是一样的,都是代表某个类注册到Spring中,装配Bean

  1. 自动配置装置

  2. 作用域

package com.xiao.pojo;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
//等价于<bean id = "user" class = "com.xiao.pojo.User";
//组件

@Component
@Scope("")
public class User {
    public String name = "肖";
}
  1. 小结
  • xml用来管理bean
  • 注解只负责完成属性的注入
  • 我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持
    <!--开启注解的支持-->
    <context:component-scan base-package="com.xiao.pojo"/>
    <context:annotation-config/>

9、使用java的方式配置Spring

我们消灾要完全不使用spring的配置了,全权交给java’来做

JavaConflg是Spring的一个子项目,Spring4之后,他成为了一个核心功能

10、代理模式

为什么要学代理模式?因为这就是SpringAOP的底层!

代理模式的分类

  • 静态代理
  • 动态代理

10.1、静态代理

角色分析:

  • 抽象角色:一般会使用接口或者抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作
  • 客户:访问代理对象的人

代码步骤:

  1. 接口
package com.xiao.demo01;

public interface Rent {
    public void rent();
}
  1. 真实角色
//房东
public class Host implements Rent {
    public void rent() {
        System.out.println("房东要出租房子");
    }
}


  1. 代理角色
package com.xiao.demo01;

public class Proxy implements Rent{
    private Host host;

    public Proxy() {
    }

    public Proxy(Host host) {
        this.host = host;
    }

    public void rent() {
        seeHouse();
        host.rent();
        hetong();
        fare();
    }
    //看房
    public void seeHouse(){
        System.out.println("中介带你看房子");
    }
    //收中介费
    public void fare(){
        System.out.println("收中介费");
    }
    //签合同
    public void hetong(){
        System.out.println("签租赁合同");
    }
}
  1. 客户端访问代理角色
package com.xiao.demo01;

public class Client {

    public static void main(String[] args) {
        //房东要租房子
        Host host = new Host();
        //代理:中介帮房东租房子,但是呢?代理角色一般会有一些附属操作!
        Proxy proxy = new Proxy(host);
        //你不用面对房东。直接找中介
        proxy.rent();

    }
}

代理模式的好处:

  • 可以使真实操作的角色更加纯粹!不用去关注一些公共的业务
  • 公共也就交给了代理角色!实现了业务的分工
  • 公共业务发生拓展的时候,方便集中管理

缺点:一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低

10.3、动态代理

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是我们直接写的
  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
    • 基于接口—JDK动态代理
    • 基于类:cglib
    • java字节码实现:javasist

需要了解两个类:Proxy,InvocationHandler:调用处理程序

InvocationHandler

11、AOP

方式一:使用Spring的接口

方法二:自定义类来实现AOP

方式三:使用注解

12、整合Mybatis

步骤:

  1. 导入相关jar包
  • junit
  • mybatis
  • mysql数据库
  • spring相关的
  • aop置入
  • mybatis-spring [new]
  1. 编写配置文件
  2. 测试

12.1、回忆mybatis()

  1. 编写实体类
  2. 编写核心配置文件
  3. 编写接口
  4. 编写Mapper.xml
  5. 测试

13、声明式事务

事务的ACID原则:

  • 原子性
  • 一致性
  • 隔离性
  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
    • 基于接口—JDK动态代理
    • 基于类:cglib
    • java字节码实现:javasist

需要了解两个类:Proxy,InvocationHandler:调用处理程序

InvocationHandler

11、AOP

方式一:使用Spring的接口

方法二:自定义类来实现AOP

方式三:使用注解

12、整合Mybatis

步骤:

  1. 导入相关jar包
  • junit
  • mybatis
  • mysql数据库
  • spring相关的
  • aop置入
  • mybatis-spring [new]
  1. 编写配置文件
  2. 测试

12.1、回忆mybatis()

  1. 编写实体类
  2. 编写核心配置文件
  3. 编写接口
  4. 编写Mapper.xml
  5. 测试

13、声明式事务

事务的ACID原则:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值