2021-05-07

一、Spring的由来

1.1控制正传

我们现在在java中操作对象的时候,如果一个类 需要使用到 另一个类的对象 ,则直接通过 new 构造函数() 形式创建 ,这种操作称之为 控制正转。

1.2控制正传的问题

正转操作会造成大量的代码耦合。导致java项目 特别笨重。我们的代码尽量的要高内聚低耦合。

1.3控制反转(IoC)

我们创建对象并使用再也不是控制正转,而是将对象创建的权利 交给了容器。通过工厂进行创建,这种思想称之为控制反转。

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
spring就是根据这个思想进行了实现,将创建对象的权利交给了 工厂,工厂通过操作核心容器对对象进行操作。
我们能自己写一套代码实现IoC思想。别人也可以,所以就有一个人也写了一套代码 用来实现 IoC思想。或者说有一个人 根据IoC思想 写了一套代码,并且将这套代码起了一个好听的名字 — Spring

二、spring

2.1作者

Rod Johnson(Spring Framework创始人,著名作者。 Rod在[悉尼大学]不仅获得了计算机学位,同时还获得了音乐学位。更令人吃惊的是在回到软件开发领域之前,他还获得了音乐学的博士学位。
在没有开发这个框架的时候 ,java操作都是控制正转,特别笨重与高耦合,有其是有一个重量级框架hibernate,此时 Rod Johnson 为了让java更简洁,根据IoC思想开发了这套框架, 命名的时候 发现 hibernate 这个框架叫做 冬至。所以就将自己的框架命名为 Spring
告诉大家 冬天过去了 春天来了

2.2 Spring Framework 组成

在这里插入图片描述Test: spring自带的单元测试
Core Container: 核心容器。这是IoC思想的关键,Spring负责创建对象 并且存放到 核心容器中。
AOP:面向切面编程
Web:与javaweb相关的组件
Data Access : 与数据库操作/JDBC操作相关组件

2.3 spring 项目搭建

1 创建一个maven工程    quickstart
2 删除test文件夹
3 pom依赖引入
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.aaa</groupId>
  <artifactId>spring-05.06</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>spring-05.06</name>
   <dependencies>

     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>4.3.25.RELEASE</version>
     </dependency>

   </dependencies>

</project>
4 在main下面创建一个resources文件夹 mark as resources root
5 创建一个xml文件  命名为 spring.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

问:AppliacationContext 和 BeanFactroy 区别?

**BeanFactory:是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
ApplicationContext:应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;

  1. 国际化(MessageSource)
  2. 访问资源,如URL和文件(ResourceLoader)
  3. 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
  4. 消息发送、响应机制(ApplicationEventPublisher)
  5. AOP
    并且二者之间对bean的初始化时机(创建对象的时机)是不一样的。
    BeanFactory是遵循懒加载模式创建对象,也就是说BeanFactory被创建的时候并没有初始化bean,只有getBean的时候才去创建对象。
    ApplicationContext是遵循饿汉模式创建对象,因为ApplicationContext对象被创建的时候,同时会初始化bean。
    我们可以通过lazy-init设置成懒加载模式。**

三、bean标签的常用属性配置

id
class
name
lazy-init 懒加载
scope 默认是 singleton单例的   prototype多例的  request请求  session会话  global session 全局会话
注意 scope="prototype" 此时不调用 销毁函数。(这是spring的内在机制 它觉得 一个多例的 对象 会频繁的创建 销毁 所以觉得太难了 就不给你销毁。)
 所以销毁函数的调用在  scope="singleton" 才有效  
 
生命周期:
servlet的声明周期:
 第一次访问的时候 servlet被创建     构造函数   init  service  
 第二次访问的时候 ---第N次访问的时候  service
 tomcat关闭的时候                  销毁函数
servlet的生命周期是 tomcat负责管理的。在不同的时机 调用不同的函数。

getbean的三种传参形式
A  通过 id/name 字符串形式获取
B  通过类型获取
C  通过id+类型获取
id属性是bean标签的唯一标识符  ,在配置文件中 不能重复,并且 在spring3版本以前不能加/等内容  
AppliacationContext  和  BeanFactroy 在调用getBean函数的时候 可以通过id获取对应的bean实例 

四、DI依赖注入

4.1对象关系:

1.依赖关系(Dependency)
所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。

2.关联关系
某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。
关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命周期问题上没有任何强制性的约束,被关联的对象还可以再被别的对象关联,所以关联是可以共享的。

3.聚合关系(Aggregation)
聚合是强版的关联
它暗含着一种所属关系以及生命周期关系
被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系。

4.组合关系(Compostion)
组合是关系中的最强版,它直接要求包含对象对被包含对象的拥有以及包含对象与被包含对象生命周期的关系。

被包含的对象还可以再被别的对象关联
所以被包含对象是可以共享的
然而绝不存在两个包含对象对同一个被包含对象的共享

4.2 依赖注入DI

依赖注入(Dependency Injection)是Spring框架的核心之一。
当某个角色(StudentServlet)需要另一个角色(StudentDAOImpl)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。

但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;
创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

以前我们需要对象的时候 是自己new对象 这是 控制正转。
现在我们创建对象的时候 不再自己创建了 而是通过 核心容器去获取 这是控制反转。
将一个对象中 需要使用的内容 进行创建并且赋值的操作 称之为 依赖注入。

控制反转IoC是一个思想 ,DI依赖注入是spring实现IoC思想的具体操作。

依赖注入有两种:设值注入、构造注入

所谓依赖注入**,指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间**依赖关系的管理。

依赖注入的方式:set方法注入和构造函数注入

注解注入:

A  配置文件开启注解扫描
 <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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:component-scan base-package="com.aaa.test"></context:component-scan>

    <!--  开启注解配置  -->
     <context:annotation-config></context:annotation-config>

</beans>

我们需要在控制层添加 @Controller
在业务层添加 @Service
在数据持久层添加@Repository
在其他的地方都是用@Component

1.@Autowired注解

@Autowired:

当自动注入bean的时候 首先根据类型去匹配

如果一个都匹配不到,则查看是否配置(required = true) 如果没有配置或者配置的是true,就代表必须注入,此时则抛出异常。

如果配置的是false,代表不是必须注入,此时如果找不到没救不注入。(注意:如果设定为false,又没有注入成功 ,在使用当前成员变量的时候 会出现空指针异常。)

如果正常匹配到一个 ,则按照类型正常注入。

如果匹配到多个bean的类型都是同一类型。则根据当前变量的名字匹配对应的bean的名字。如果匹配到 则进行注入。

如果匹配不到 则 抛出异常

2. @Resource

@Resource
private StudentDAO dao;

是我们JDK自带的一个注解

a. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
@Resource(name = “dao”,type = StudentDAOImpl.class)
private StudentDAO dao;
b. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
c. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
d. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配(名字没有一样的),则回退为一个原始类(相当于按照类型取查找一个实现类,如果按照类型取查找的实现类有多个 则抛出异常)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值