Spring(一)

一 、IOC 、DI和AOP思想提出

1.Ioc思想

Inversion of Control,控制反转,强调的是原来在程序中创建Bean的权利反转给第三方。

2.DI思想

Dependency Injection,依赖注入,强调的Bean之间关系,这种关系第三方负责去设置。

3.AOP思想

Aspect Oriented Programming,面向切面编程,功能的横向抽取,主要的实现方式就是Proxy。

二、框架概念的出现

1.框架的基本特点

  • 框架(Framework),是基于基础技术之上,从众多业务中抽取出的通用解决方案;
  • 框架是一个半成品,使用框架规定的语法开发可以提高开发效率,可以用简单的代码就能完成复杂的基础业务;
  • 框架内部使用大量的设计模式、算法、底层代码操作技术,如反射、内省、xml解析、注解解析等;
  • 框架一般都具备扩展性;
  • 有了框架,我们可以将精力尽可能的投入在纯业务开发上而不用去费心技术实现以及一些辅助业务;

2.Java中常用的框架

不同语言,不同框架都有属于自己的框架,使用框架开发是作为程序员的最基础的底线。Java语言中的框架,可以分为基础框架和服务框架:
  • 基础框架:完成基本业务操作的框架,如MyBatis、Spring、SpringMVC、Struts2、Hibernate等
  • 服务框架:特定领域的框架,一般还可以对外提供服务框架,如MQ、ES、Nacos等

三、Spring框架的诞生

1.Spring框架概述

spring是一个开源的轻量级Java开发应用框架,可以简化企业级应用开发。Spring解决了开发者在JavaEE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。是当前企业中Java开发几乎不能缺少的框架之一。Spring的生态及其完善,不管是Spring哪个领域的解决方案都是依附于在Spring Framework基础框架的。
Spring官网
https://spring.io/

2.Spring框架的历史

  • Jsp默默抗下所有;
  • MVC+三层架构分工明确,但开发成本及其高;
  • EJB重量级框架出现,走出一个困境,又进入另一个困境;
  • Spring春天来到,随着,SSH风生水起、称霸武林;
  • Spring稳住江湖大哥位置,SSM开始上位;
  • Spring本着“拿来主义”的思维快速发展,生态不断健全;
  • SpringBoot又一里程碑崛起,把“约定大于配置”思想玩的炉火纯青;
  • SpringCloud打包了微服务众多解决发难,应对互联网项目更见easy;

3.Spring Framework技术栈图示

在这里插入图片描述

4.BeanFactory和ApplicationContext的快速入门

4.1 BeanFactory的快速入门1

分析Spring的BeanFactory的开发步骤;
1》导入Spring的jar包或Maven坐标;

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

在这里插入图片描述
2》定义UserService接口及其UserServiceImpl实现类;

public interface UserService {
   
}
public class UserServiceImpl implements UserService {
     
}

3》创建beans.xml配置文件,将UserServiceImpl的信息配置到该xml中;

<bean id="userService" class="com.peak.service.impl.UserServiceImpl"></bean>

4》编写测试代码,创建BeanFactory,加载配置文件按,获取UserService实例对象。

	//创建一个工厂对象
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
     //创建一个读取器(xml文件)
     XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
     //读取器配置文件给工厂
     reader.loadBeanDefinitions("beans.xml");
     //根据id获取Bean实例对象
     UserService userService = (UserService) beanFactory.getBean("userService");

4.1 BeanFactory的快速入门2

上面使用BeanFactory完成IoC的思想,下面去实现一下DI依赖注入:
1》定义UserDao接口及其UserDaoImpl实现类;

public interface UserDao {
   }
public class UserDaoImpl implements UserDao {
   }

2》修改UserServiceImpl代码,添加一个setUserDao(UserDao userDao)用于接收注入的对象;

 	public void setUserDao(UserDao userDao){
   
        System.out.println(userDao);
    }

3》修改beans.xml配置文件,在UserDaoImpl的中嵌入配置注入;

	<bean id="userService" class="com.peak.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

4》修改测试代码后。获得UserService时,setUserService方法执行了注入操作。

	//创建一个工厂对象
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
     //创建一个读取器(xml文件)
     XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
     //读取器配置文件给工厂
     reader.loadBeanDefinitions("beans.xml");
     //根据id获取Bean实例对象
     UserService userService = (UserService) beanFactory.getBean("userService");

4.3 ApplicationContext的快速入门

ApplicationContext成为Spring容器,内部封装了BeanFactory,比BeanFactory功能更丰富更强大,使用ApplicationContext进行开发时,xml配置文件的名称习惯写成applicationContext.xml,其中的配置与上述bean.xml中的配置相同。

	ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService = (UserService) applicationContext.getBean("userService");
    System.out.println(userService);

5.BeanFactory和ApplicationContext的关系

1)BeanFactory是Spring的早期接口,成为Spring的Bean工厂,ApplicationContext是后期更高阶接口,称之为Spring容器;
2)ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;
3)Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。
4)Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载,容易一创建就将Bean都实例化并初始好。

6.BeanFactory和ApplicationContext的继承体系

6.1 BeanFactory的继承体系

ctrl+h查看继承体系

BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是DefaultListableBeanFactory,而ApplicationContext内部维护的BeanFactory的实现类也是他它。
在这里插入图片描述

6.2 ApplicationContext的继承体系

只在Spring基础环境下,即只导入spring-context坐标时,此时ApplicationContext的继承体系
在这里插入图片描述
只在Spring基础环境下,常用的三个ApplicationContext作用如下:
ClassPathApplicationContext 加载类路径下的xml配置的ApplicationContext
FileSystemXmlApplicationContext 加载磁盘路径下的xml配置的ApplicationContext
AnnotationConfigApplicationContext 加载注解配置类的ApplicationContext

如果Spring基础环境中加入了其他组件解决方案,如web层解决方案,即导入spring-web坐标时,此时的ApplicationContext的继承体系

	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-web</artifactId>
	    <version>5.3.24</version>
	</dependency>

在这里插入图片描述

四、基于XML的Spring应用

1.SpringBean的配置详情

Spring开发中主要是对Bean的配置,Bean的常用配置如下:

Xml配置方式 功能描述
< bean id=“” class=“”> Bean的id和全限定名
< bean name=“”> 通过name设置Bean的别名,通过别名也能直接获取到Bean的实例
< bean scope=“”> Bean的作用范围,BeanFactory作为容器时取值singleton和prototype
< bean lazy-init=“”> Bean的实例化时机,是否延迟加载。BeanFactory作为容器时无效
< bean lazy-method=“”> Bean实例化后自动执行的初始化方法,method指定方法名
< bean destory-method=“”> Bean实例销毁前的方法,method指定方法命
< bean autowire=“byType”> 设置自动注入模式,常用的按照类型byType,按照名字byName
< bean factory-bean=“” factory-method=“”/> 指定哪个工厂Bean的哪个方法完成Bean的创建

1.1 Bean的基础配置

例如:配置UserDaoImpl由Spring容器负责管理

 <bean id="userDao" class="com.peak.dao.impl.UserDaoImpl"></bean>

此时存储到Spring容器(singleObject单例池)中的Bean的beanName时userDao,值是UserDaoImpl对象,可以根据beanName获取Bean实例

applicationContext.getBean("userDao");

如果不配置id,则Spring会把当前Bean实例的全限定名作为beanName

applicationContext.getBean("com.peak.dao.impl.UserDaoImpl");

1.2 Bean的别名及配置

可以为当前Bean指定多个别名,根据别名也可以获得Bean对象

 <bean id="userDao" name="aaa,bbb" class="com.peak.dao.impl.UserDaoImpl"></bean>

此时多个名称都可以获得UserDaoImpl实例对象

applicationContext.getBean("userDao");
applicationContext.getBean("aaa");
applicationContext.getBean("bbb");

1.3 Bean的范围配置

默认情况下,单纯的Spring环境Bean的作用范围有两个:Singleton和Prototype
singleton:单例,默认值,Spring容器创建的时候,就会进行Bean的实例化,并存储到容器内部的单例池中,每次getBean时都是从单例池中获取相同的Bean实例;
prototype:原型,Spring容器初始化时不会创建Bean实例,当调用getBean时才会实例化Bean,每次getBean都会创建一个新的Bean实例。
如果说,当我们加载了web包后,此时的Bean的作用范围会多两个,Request和Session,但使用非常少,掌握Singleton和Prototype即可。

1.4 Bean的延迟加载

当lazy-init设置为true时为延迟加载,也就是当Spring容器创建的时候,不会立即创建Bean实例,等待用到时在创建Bean实例并存储到单例池中去,后续在使用该Bean直接从单例池获取即可,本质上该Bean还是单例的。

<bean id="userDao" class="com.peak.dao.impl.UserDaoImpl" lazy-init="true"></bean>

1.5 Bean的初始化和销毁方法配置

Bean在被实例化后,可以执行指定的初始化方法完成一些初始化的操作,Bean在销毁之前也可以执行指定的销毁方法完成一些操作,初始化方法名称和销毁方法名称通过。

<bean id="userService" class="com.peak.service.impl.UserServiceImpl" init-method="init" destroy-method="destroy"></bean>
//在UserServiceImpl中添加
public void init(){
   
        System.out.println("初始化方法。。。");
    }
    public void destroy(){
   
        System.out.println("销毁方法。。。");
    }

扩展:除此之外,我们还可以通过InitializingBean接口,完成一些Bean的初始化操作,如下:

public class UserServiceImpl implements UserService, InitializingBean {
   
    public void init(){
   
        System.out.println("初始化方法。。。");
    }
    public void destroy(){
   
        System.out.println("销毁方法。。。");
    }
    //执行时机早于init-method配置的方法
    public void afterPropertiesSet() throws Exception {
   
        System.out.println("afterPropertiesSet执行...");
    }
}

扩展:执行顺序
在这里插入图片描述

1.6 Bean的实例化配置

Spring的实例化方式主要是如下两种方式:

  • 构造方式实例化:底层通过构造方法对Bean进行实例化
  • 工厂方式实例化:底层通过调用自定义的工厂方法对Bean进行实例化
    1)构造方法实例化
    构造方法实例化又分为无参构造方法实例化和有参构造方法实例化,Spring中配置的几乎都是无参构造方法,下述时有参构造方法实例化Bean;
	//有参构造方法
	public UserServiceImpl(String name){
   
        System.out.println("UserServiceImpl有参构造方法执行");
    }

有参方法在实例化Bean时,需要参数的注入,通过标签,嵌入在标签内部提供构造参数,如下:
在这里插入图片描述
2)工厂方法实例化
工厂方法实例化Bean,又分为以下三种:

  1. 静态工厂方法实例化Bean
    静态工厂方法实例化Bean,其实就是定义一个工厂类,提供一个静态方法用于生产Bean实例,在将该工厂类及其静态方法配置给Spring即可;
public class MyBeanFactory1 {
   
    public static UserDao userDao(){
   
        //Bean创建之间可以进行一些其他业务逻辑操作
        return new UserDaoImpl(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值