Spring框架

目录

1.介绍spring框架

2.为什么使用spring框架

3.IOC控制反转

4.如何使用spring

(1)引入依赖

(2)创建spring配置文件

(3)创建一个Dao类

(4)测试

5.BeanFactory和ApplicationContext的区别

6. 获取bean的方式

7. bean的作用范围:

10.什么是DI

11.依赖注入的类型

12.如何实现注入对象的属性值

13.使用spring注入其他数据类型

(1)注入类对象类型

(2)注入集合类型 

(3)注入set和map集合 

14.自动注入 

 15.使用注解完成IOC和DI功能

(1)包扫描配置文件

(2)创建controller

(3) dao接口和实现类

16.MVC开发模式

 17.使用spring的IOC和DI注解模式


1.介绍spring框架

(1) spring是一个轻量级开源的JAVAEE框架。

(2) Spring提高了IOC和AOP

IOC:控制反转。把创建java对象的权力交于spring容器来管理。

AOP:面向切面编程.在不改变源代码的前提下可以扩充功能。

(3)spring的特点:

方便解耦,简化开发----层层之间的依赖降低。

声明式事务的支持:

方便程序的测试:----提供单元测试jar,

方便集成各种优秀框架---集成第三方的框架---mybatis

2.为什么使用spring框架

目的: **降低耦合:对象与对象之间的耦合。

耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。耦合性存在于各个领域,而非软件设计中独有的,但是我们只讨论软件工程中的耦合。在软件工程中,耦合指的就是就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。**划分模块的一个准则就是高内聚低耦合

它有如下分类

(1)内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。

(2)公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。

(3) 外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。

(4) 控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。

(5)标记耦合 。若一个模块 A 通过接口向两个模块 B 和 C 传递一个公共参数,那么称模块 B 和 C 之间存在一个标记耦合。

(6) 数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。

(7) 非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。

总结:耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。

内聚与耦合:内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。 程序讲究的是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到**高内聚,低耦合

3.IOC控制反转

 **控制反转**(Inversion of Control,缩写为**IoC**),是[面向对象编程](https://baike.baidu.com/item/面向对象编程/254878)中的一种设计原则,可以用来减低计算机[代码](https://baike.baidu.com/item/代码/86048)之间的[耦合度](https://baike.baidu.com/item/耦合度/2603938)。其中最常见的方式叫做**[依赖注入](https://baike.baidu.com/item/依赖注入/5177233)**(Dependency Injection,简称**DI**),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

**==使用对象的时候不再是我们直接new,而是将创建对象的权利交给框架中的核心容器IOC,需要使用对象的时候直接从容器中获取。==**

4.如何使用spring

(1)引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.15.RELEASE</version>
        </dependency>
    </dependencies>

(2)创建spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--表示一个类交于spring容器来创建
          id:bean的唯一标识。
          class: 类的全路径
    -->
     <bean id="userDao" class="com.aaa.UserDao"></bean>
</beans>

(3)创建一个Dao类

public interface IUserDao {
    public void show();
}
public class UserDao implements IUserDao {

    public void show(){
        System.out.println("========================");
    }
}

(4)测试

public class Test01 {
    public static void main(String[] args) {
        //读取spring配置文件
        ApplicationContext app=new ClassPathXmlApplicationContext("application.xml");
        //获取bean对象 多态.
        IUserDao userDao = (IUserDao) app.getBean("userDao");
        userDao.show();
    }
}

5.BeanFactory和ApplicationContext的区别

ApplicationContext接口

​       是基于BeanFactory之上的,提供了应用程序框架服务,扩展的新功能如下:提供国际化的支持资源访问,如URL和文件 事件传递载入多个配置文件等 实现类常见有三个

ClassPathXmlApplicationContext:-classpath路径加载xml文件的

FileSystemXmlApplicationContext:基于项目根路径进行加载xml文件的

AnnotationConfigApplicationContext:基于注解的配置。基于类书写的配置

Spring容器顶层接口:获取Bean对象;管理类和类之间的关系(依赖关系)BeanFactory由org.springframework.beans.factory.BeanFactory接口定义 BeanFactory是**工厂模式(Factory pattern)的实现**,是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

BeanFactory接口包含以下基本方法

containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true。

Object  getBean(String  str) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常。

Object  getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型

Class  getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常

boolean  isSingleton(String) 判断给定名称的bean定义是否为单例模式      

String[]  getAliases(String name) 返回给定bean名称的所有别名

6. 获取bean的方式

A  通过bean.xml文件中bean标签的id的值获取bean(使用默认构造方法)

IUserDao iUserDao= (IUserDao) app.getBean("userDao");

//根据bean的id获取Bean对象,强制转换.

B 通过类型去获取  

IUserDao userDao = app.getBean(IUserDao.class);  //通过类型获取bean对象。

确保bean的类型是唯一的 不然会报错:org.springframework.beans.factory.NoUniqueBeanDefinitionException

C 通过 id  +  类型去获取

IUserDao userDao = app.getBean("userDao2", IUserDao.class);

7. bean的作用范围:

bean对象的作用范围调整需要配置**scope**属性,设置单例还是多例(只针对ApplicationContext接口来说,**默认是单例的**)

单例:---无论创建多少次对象 他们始终指向同一个实例。

**scope**:常用  singleton,prototype

​   singleton:单例的(默认值)当加载配置文件时,就会创建对象。

​   prototype:多例的(当getBean时才会创建对象)

​   request:用于请求范围---同一个那么使用bean同一个。

​   session:作用于会话范围---同一个会话

10.什么是DI

IOC:控制反转  创建对象!

DI 依赖注入:目的就是给对象中的属性赋

11.依赖注入的类型

基本数据类型, 字符串类型,引用类型,集合类型

12.如何实现注入对象的属性值

(1)创建一个类:提供set方法

public class Student {
     private Integer age;
     private String name;

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("=============setName=======================");
        this.name = name;
    }
}

(2)配置文件:---在bean标签中<property name="属性名" >

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--spring容器会帮你创建该bean的对象-->
    <bean id="student01" class="com.ykq.demo.Student">
        <!--property:表示为类中属性注入值,调用的为set方法
                name:表示属性名
                value:注入基本类和字符串类型时使用value
        -->
        <property name="name" value="张三"/>
        <property name="age" value="15"/>
    </bean>
</beans>

13.使用spring注入其他数据类型

(1)注入类对象类型

(2)注入集合类型 

(3)注入set和map集合 

14.自动注入 

public class UserController {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void fun(){
        userDao.show();
    }
}
public interface UserDao {

    public void show();
}

public class UserDao01 implements UserDao {
    public void show() {
        System.out.println("userDao01-------------------show方法");
    }
}

public class UserDao02 implements UserDao{
    public void show() {
        System.out.println("userDao02**************************show方法");
    }
}

 15.使用注解完成IOC和DI功能

(1)包扫描配置文件

    <!--包扫描-->

    <context:component-scan base-package="com.wyb.demo03"/>

(2)创建controller

@Controller 

 //表示控制层注解,如何没有设置bean的id 默认为类的名称首字母小写   相当于在spring配置文件钟<bean id=""  class="com.wyb.demo03.UserController"/>

public class UserController {

    //@Autowired //按照类型自动注入 如果需要自己指定名村注入需要使用另一个注解配合使用

    @Autowired
    @Qualifier(value = "userDaoImpl01") //<property name="userDao" ref="userDaoImpl01">
    private UserDao userDao;

    public void fun(){
        userDao.print();
    }
}

(3) dao接口和实现类

@Repository
public class UserDaoImpl01 implements UserDao {


    public void print() {
        System.out.println("userDao01~~~~~~~~~~~~~~~~~~~~~~~~~~~~~print方法");
    }
}
@Repository
public class UserDaoImpl02 implements UserDao {


    public void print() {
        System.out.println("userDao02~~~~~~~~~~~~~~~~~~~~~~~~~~~~~print方法");
    }
}

16.MVC开发模式

 17.使用spring的IOC和DI注解模式

UserController (fun(){service.print()})---->UserService( print(){dao.show()})

--->UserDao (show(){})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值